---恢复内容开始---

1.轮播图插件

1.什么是插件:

为已有的程序增加功能

2.插件的特点(为什么要做成一个插件)与注意事项:

1.通用性,可移植性强

2.兼容性:不会对其他代码产生影响

3.创建一个div,给一个基础的宽高属性

outline: 外边框;不会占据盒子空间

border:内边框

盒模型:外边距 - 边框(border会占据空间) - 内边距 - 内容

轮播图插件的实现:

1.插件:

html部分最好只有一个外部的div,确定他在页面中的位置和大小。其余的部分都靠js里面的部分来完成;--------方便使用的人;

<div id="banner">

   </div>

2.通过一个script src引入js部分

3.在页面中执行这个函数;

函数中的参数是页面中的div元素和我轮播图画面有关的东西

如果有多张图片记得要写成一个数组的形式,里面的每个元素都是一个对象

注意,执行函数的部分一定要写在创建函数的script后面,不然会报错

Uncaught ReferenceError: createBannerArea is not defined

4.完成要使用的那个函数

首先,插件分为两部分:图片展示区和下面的圆点区

1.主函数

在js中createElement两个div分别来装他们

部分主函数:

function createBannerArea(areaDom, options){
var imgArea = document.createElement('div'); //初始化图片区
var numberArea = document.createElement('div') //初始化圆点区
}

areaDom:我在html页面中获取的元素;

options:一些配置(我传入的图片等信息)---以数组的形式排列

2.局部函数
1.图片的初始化以及事件:
   function initImgs(){
imgArea.style.height ='100%';
imgArea.style.width = '100%';
imgArea.style.display = 'flex';
imgArea.style.overflow = 'hidden';
for(let i = 0; i < options.length ; i++){ //遍历options里面的每个元素,知道图片张数
var obj = options[i]; //方便获取图片的属性
var img = document.createElement('img'); //生成img元素
img.src = obj.imgUrl; //获取图片对象的信息
imgArea.appendChild(img); //img作为imgArea的子元素
img.style.height = '100%'; //设置img元素的宽高等
img.style.width = '100%';
img.style.marginLeft = '0px';
img.addEventListener('click',function(){ //给图片一个点击事件
location.href = options[i].link;
})
// console.log(obj);
}
imgArea.addEventListener('mouseenter',function(){ //鼠标进出入图片的事件
clearInterval(changeTimer);
changeTimer = null;
})
imgArea.addEventListener('mouseleave',function(){
autoChange();
})
areaDom.appendChild(imgArea) //imgArea元素是areaDom的子元素
}
2.小圆点的初始化以及事件
function initNumbers(){
numberArea.style.textAlign = 'center';
numberArea.style.marginTop = '-20px'
for(var i = 0; i < options.length; i++){ //遍历小圆点
var sp = document.createElement('span'); //每个圆点都是一个span元素
sp.style.cursor = 'pointer'; //小圆点的样式
sp.style.display = 'inline-block';
sp.style.height = '8px';
sp.style.width = '8px';
sp.style.background = 'white';
sp.style.borderRadius = '50%';
sp.style.margin = '5px 5px';
(function(index){ //立即执行函数,使得点击的圆点显示的是对应的图片
sp.addEventListener('click',function(){
curIndex = index;
setSatus();
})
})(i);
numberArea.append(sp); //span元素是numberArea的子元素

}
areaDom.appendChild(numberArea) //number元素是areaDom的子元素
}
3.初始状态和事件的设置
function setSatus(){
for(var i = 0; i < numberArea.children.length; i++){ //遍历每一个sapn
if( i == curIndex){ //判断是否是当前的索引
numberArea.children[i].style.background = '#336699' //是的画span显示一种颜色
}else{
numberArea.children[i].style.background = 'white' //不是显示另一种颜色
}
}
var start = parseInt(imgArea.children[0].style.marginLeft);//开始时左边的margin值
var end = curIndex * -100; //目标margin-left的值
var dis = end - start; //两者间的距离
var duration = 500; //切换两者间的时间
var speed = dis / duration; //切换的速度
if(timer){
clearInterval(timer); //如果我点击圆点的时候有定时,及时清除
}
var timer = setInterval(function(){
start += 20 * speed; //Margin left的变化
imgArea.children[0].style.marginLeft = start + '%'; //img的变化
if(Math.abs(end - start) < 1){ //当变化后的像素小于1像素以后,直接切换到准确的值
imgArea.children[0].style.marginLeft = end + '%';
clearInterval(timer); //每变化一次,清理一次定时器
}
},20) //每隔20毫秒改变一次
4.图片自动轮播的设置
function autoChange(){
if(changeTimer) {
return} ;
changeTimer = setInterval(function(){
if(curIndex == options.length -1){
//如果切换的curIndex是最后一张图片了,那么下一张是第一张
curIndex = 0;
}else{
curIndex++; //否则自增
} setSatus();
}, changeDuration); //自动切换的事件
}

4.完整HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>banner</title>
</head>
<style>
html,body{
height: 100%;
width: 100%;
}
#banner{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
width: 300px;
height:200px;
/* width: 63%;
height: 50%; */
/* border: 10px solid #ccc; */
outline: 2px solid rgb(211, 103, 103)
}
</style>
<body>
<div id="banner">

</div>
<script src="./plugin/banner.js"></script>
<script>
var bannerDiv = document.getElementById('banner');
createBannerArea(bannerDiv,[
{imgUrl:'./plugin/img/banner1.jpg',link:'http://www.baidu.com'},
{imgUrl:'./plugin/img/banner2.jpg',link:'http://www.taobao.com'},
{imgUrl:'./plugin/img/banner3.jpg',link:'http://www.jingdong.com'}
]) </script>
</body>
</html>

5.完整js

/**
*
* @param {*} areaDom 轮播图区域
* @param {*} options 轮播图配置
*/
function createBannerArea(areaDom, options){
var imgArea = document.createElement('div');
var numberArea = document.createElement('div')
var curIndex = 2;
var changeTimer = null;
var changeDuration = 1000;
var timer = 0;

initImgs();
initNumbers();
setSatus();
autoChange();

function initImgs(){
imgArea.style.height ='100%';
imgArea.style.width = '100%';
imgArea.style.display = 'flex';
imgArea.style.overflow = 'hidden';
for(let i = 0; i < options.length ; i++){
var obj = options[i];
var img = document.createElement('img');
img.src = obj.imgUrl;
imgArea.appendChild(img);
img.style.height = '100%';
img.style.width = '100%';
img.style.marginLeft = '0px';
img.addEventListener('click',function(){
location.href = options[i].link;
})
// console.log(obj);
}
imgArea.addEventListener('mouseenter',function(){
clearInterval(changeTimer);
changeTimer = null;
})
imgArea.addEventListener('mouseleave',function(){
autoChange();
})
areaDom.appendChild(imgArea)
} function initNumbers(){
numberArea.style.textAlign = 'center';
numberArea.style.marginTop = '-20px'
for(var i = 0; i < options.length; i++){
var sp = document.createElement('span');
sp.style.cursor = 'pointer';
sp.style.display = 'inline-block';
sp.style.height = '8px';
sp.style.width = '8px';
sp.style.background = 'white';
sp.style.borderRadius = '50%';
sp.style.margin = '5px 5px';
(function(index){
sp.addEventListener('click',function(){
curIndex = index;
setSatus();
})
})(i);
numberArea.append(sp);

}
areaDom.appendChild(numberArea)
}

function setSatus(){
for(var i = 0; i < numberArea.children.length; i++){
if( i == curIndex){
numberArea.children[i].style.background = '#336699'
}else{
numberArea.children[i].style.background = 'white'
}
}
var start = parseInt(imgArea.children[0].style.marginLeft);
var end = curIndex * -100;
var dis = end - start;
var duration = 500;
var speed = dis / duration;
if(timer){
clearInterval(timer);
}
var timer = setInterval(function(){
start += 20 * speed;
imgArea.children[0].style.marginLeft = start + '%';
if(Math.abs(end - start) < 1){
imgArea.children[0].style.marginLeft = end + '%';
clearInterval(timer);
}
},20) ​
}

function autoChange(){
if(changeTimer) {
return} ;
changeTimer = setInterval(() => {
if(curIndex == options.length -1){
curIndex = 0;
}else{
curIndex++;
} setSatus();
}, changeDuration);
}
​ }

//全局函数

// 附着在window上,可能会造成全局变量污染。
 
 

原生JavaScript(js)手把手教你写轮播图插件(banner)的更多相关文章

  1. 基于js的自适应、多样式轮播图插件(兼容IE8+、FF、chrome等主流浏览器)

    插件github地址:https://github.com/pomelott/slider-plug_in 使用方式: slider plug-in 左右滑动的自适应.多样式全能插件.多次调用时只需传 ...

  2. 原生js写一个无缝轮播图插件(支持vue)

    轮播图插件(Broadcast.js) 前言:写这个插件的原因 前段时间准备用vue加上网易云的nodejs接口,模拟网易云音乐移动端.因为想自己写一遍所有的代码以及加固自己的flex布局,所以没有使 ...

  3. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

  4. js 原生轮播图插件

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JS封装动画框架,网易轮播图,旋转轮播图

    JS封装动画框架,网易轮播图,旋转轮播图 1. JS封装运动框架 // 多个属性运动框架 添加回调函数 function animate(obj,json,fn) { clearInterval(ob ...

  6. 学习笔记: js插件 —— SuperSlide 2 (轮播图插件,PC用)

    SuperSlide 2  轮播图插件,较老.但还好用. 适用于PC,是绑定到jquery上的方法: $.slide(); 如果在实际中找不到.slide方法,请检查jquery等.js文件的引入次序 ...

  7. jquery, js轮播图插件Swiper3

    轮播图插件Swiper3 HTML代码 如果只是简单的使用轮播图,直接复制我的html代码就可以. 如果想要高级一些,就自己去看文档吧 <!DOCTYPE html> <html l ...

  8. 第124天:移动web端-Bootstrap轮播图插件使用

    Bootstrap JS插件使用 > 对于Bootstrap的JS插件,我们只需要将文档实例中的代码粘到我们自己的代码中> 然后作出相应的样式调整 Bootstrap中轮播图插件叫作Car ...

  9. jquery的fadeTo方法的淡入淡出轮播图插件

    由于对基于jquery的简单插件开发有了一定的了解,慢慢的也对基于jquery的插件开发有了兴趣,在上班结束之后就研究各种插件的思路逻辑.最近开发了一款基于jquery的fadeTo方法的轮播图插件, ...

随机推荐

  1. redis 命令的调用过程

    参考文献: Redis 是如何处理命令的(客户端) 我是如何通过添加一条命令学习redis源码的 从零开始写redis客户端(deerlet-redis-client)之路--第一个纠结很久的问题,r ...

  2. c++学习书籍推荐《C++沉思录》下载

    百度云及其他网盘下载地址:点我 编辑推荐 经典C++图书,应广大读者的强烈要求再版 目录 第0章 序幕第一篇 动机第1章 为什么我用C++第2章 为什么用C++工作第3章 生活在现实世界中 第二篇 类 ...

  3. NOIP2002 字串变换题解(双向搜索)

    65. [NOIP2002] 字串变换 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...

  4. MyBatis 一对多映射

    From<MyBatis从入门到精通> <!-- 6.1.2.1 collection集合的嵌套结果映射 和association类似,集合的嵌套结果映射就是指通过一次SQL查询将所 ...

  5. Neo4j电影关系图Cypher

    , tagline:'Welcome to the Real World'}) }) }) }) }) }) }) }) CREATE (Keanu)-[:ACTED_IN {roles:['Neo' ...

  6. [记录]python使用serial模块实现实时WebConsole

    ###tornado+websocket+多进程实现: 1.index.html <!DOCTYPE HTML> <html> <head> <style&g ...

  7. 洛谷P4995 跳跳!题解

    求关注,求赞,求评论QAQ 题目:https://www.luogu.org/problemnew/show/P4995 简单描述一下吧,就是说有n块石头,起始可以跳到任何一块上面,接着也是,只不过每 ...

  8. Excel催化剂100+大主题功能梳理导读

    Excel催化剂历经1年4个月的开发时间,终于荣登100+个大主题功能,完成数据领域的功能大矩阵,可以说在日常的数据处理及分析上,绝大部分的共性场景已经囊括其中,是数据工作者难得一遇的优秀作品之一.因 ...

  9. tomcat用做图片服务器

    最近做了个小网站,就是用tinyce富文本编辑器,https://www.511easy.com/ 保持字体排版和图片 发现博客园的图片,一天之后就无法显示 就想着自己做一个图片服务器,上传图片到指定 ...

  10. python基础之list列表的增删改查以及循环、嵌套

    Python的列表在JS中又叫做数组,是基础数据类型之一,以[]括起来,以逗号隔开,可以存放各种数据类型.嵌套的列表.对象.列表是有序的,即有索引值,可切片,方便取值.列表的操作和对字符串的操作是一样 ...