功能需求
1.鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。
3.点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理
4.图片播放的同时,下面小圆圈模块跟随一起变化。
5.点击小圆圈,可以播放相应图片
6.鼠标不经过轮播图,轮播图也会自动播放图片。
7.鼠标经过轮播图模块,自动播放停止。
案例分析
1.鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。
2.动态生成小圆圈
Ⅰ.核心思路:小圆圈的个数要跟图片张数一致
Ⅱ.首先先得到ul里面图片的张数(ul中li的个数)
Ⅲ.利用循环动态生成小圆圈(生成的小圆圈)
Ⅳ.创建节点createElement(‘li’)、插入节点ol.appendChild(li)
Ⅴ.给第一个小圆圈添加current类名
3.小圆圈的排他思想
Ⅰ.点击当前小圆圈,就添加current类名
Ⅱ.其余的小圆圈就移除这个current类名
Ⅲ.注意:刚才生成小圆圈的同时,就可以直接绑定这个点击事件了
4.点击小圆圈滚动图片
Ⅰ.用到animate动画函数,将js文件引入(index.js依赖于animate.js)
Ⅱ.使用动画函数的前提:该元素必须有定位
Ⅲ.注意是ul动,不是li
Ⅳ.滚动图片的核心算法:点击某个小圆圈,就让图片(ul)滚动小圆圈索引号*图片宽度
Ⅴ.小圆圈索引号通过设置自定义属性来获取
5.点击右侧按钮,就让图片滚动一张
Ⅰ.声明一个变量num,点击一次,自增1,让这个变量✖图片宽度,就是ul滚动距离
Ⅱ.图片无缝滚动原理:
①把ul第一个li复制一份,放到ul的最后面
②当图片滚动到克隆的最后一张图片时,让ul快速的、不做动画的跳到最左侧 left:0
③同时num赋值为0,可以重新开始滚动图片了
6.衔接5,克隆第一张图片(代码更加智能化)
Ⅰ.克隆ul第一个li cloneNode() 加true深克隆(复制里面的节点),false浅克隆
Ⅱ.添加到ul最后 appendChild
7.点击右侧按钮,小圆圈跟随变化
Ⅰ.最简单的做法是再声明一个变量circle,每次点击自增1。注意:左侧按钮也需要这个变量,因此要声明全局变量。
8.左侧按钮,与右侧按钮同理
9.自动播放轮播图
Ⅰ.添加一个定时器
Ⅱ.自动播放轮播图,实际上类似于按时点击了右侧按钮
Ⅲ.此时我们使用手动调用右侧按钮点击事件 arrow_r.click()
Ⅳ.鼠标经过focus就停止定时器,鼠标离开focus就启动定时器
源代码:
链接:https://share.weiyun.com/ysvbVmih 密码:j9ydhm
//简单动画函数封装 obj目标对象 target目标位置//给不同的元素指定了不同的定时器//缓动动画function animate (obj,target,callback) {clearInterval(obj.timer);//让盒子在当前位置+1距离//定时器重复操作,最后清除定时器obj.timer = setInterval(function(){//步长值写到定时器的里面var step = (target - obj.offsetLeft) / 10;step = step > 0 ? Math.ceil(step) : Math.floor(step);//获得盒子当前的位置var x = obj.offsetLeft;if(x == target){clearInterval(obj.timer);//回调函数写在定时器结束的位置if(callback){//调用函数callback();}}obj.style.left = x + step + 'px';},15);}
// 轮播图效果window.addEventListener('load',function(){//获取元素var arrow_l = document.querySelector('.arrow-l');var arrow_r = document.querySelector('.arrow-r');var focus = document.querySelector('.focus');var ul = focus.querySelector('ul');var ol = focus.querySelector('ol');var focusWidth = focus.offsetWidth;//图片宽度//1.鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮。focus.addEventListener('mouseenter',function(){arrow_l.style.display = 'block';arrow_r.style.display = 'block';//鼠标经过focus就停止定时器clearInterval(timer);timer = null;});focus.addEventListener('mouseleave',function(){arrow_l.style.display = 'none';arrow_r.style.display = 'none';//鼠标离开focus就启动定时器timer = setInterval(function(){//手动调用点击事件arrow_r.click();},2000);});//2.动态生成小圆圈for(var i =0; i < ul.children.length; i++){//创建livar li = document.createElement('li');//给li添加自定义索引号li.setAttribute('data-index',i);//向ol添加li节点ol.appendChild(li);//3.小圆圈的排他思想,在循环里绑定点击事件li.addEventListener('click',function(){//干掉所有人for(var j = 0; j < ol.children.length; j++){ol.children[j].className = '';}//留下我自己this.className = 'current';//4.点击小圆圈移动图片(ul)//ul每次移动距离 = 小圆圈索引号 * 图片宽度 向左移动为负值var indexNum = this.getAttribute('data-index');//解决小bug//当我们点击了某个小li就要把索引值给num变量,不然图片会乱num = indexNum;//同理,当我们点击了某个小li就要把索引值给circle变量,不然小圆圈会乱cricle = indexNum;var distance = indexNum * focusWidth;animate(ul,-distance);});}//给第一个小圆圈添加current类名ol.children[0].className = 'current';//6衔接5.克隆第一张图片给ulvar firstImg = ul.children[0].cloneNode(true);ul.appendChild(firstImg);//5.点击右侧按钮,图片滚动一张var num = 0;//声明一个变量num,点击一次,自增1var cricle = 0;//声明一个变量circle,每次点击自增1arrow_r.addEventListener('click',function(){//如果走到最后复制的一张,此时我们的ul要快速的复原left:0if(num == ul.children.length - 1){ul.style.left = 0;num = 0;}num++;animate(ul,-num * focusWidth);// 7.点击右侧按钮,小圆圈跟随变化cricle++;//要放在if前面,因为有五张图但是只有四个小圆圈!if(cricle == ol.children.length){cricle = 0;}cricleChange();});//8.左侧按钮arrow_l.addEventListener('click',function(){//如果从第一张跳到最后一张,此时我们的ul要快速的改为left:-num * focusWidth + 'px'if(num == 0){num = ul.children.length - 1;ul.style.left = -num * focusWidth + 'px';}num--;animate(ul,-num * focusWidth);// 点击左侧按钮,小圆圈跟随变化cricle--;//要放在if前面,因为有五张图但是只有四个小圆圈!if(cricle < 0){cricle = ol.children.length - 1;}cricleChange();});//代码优化:封装小圆圈的排他思想function cricleChange(){//先清除其他小圆圈的current类名for(var i = 0; i < ol.children.length; i++){ol.children[i].className = '';}//留下自己的current类名ol.children[cricle].className = 'current';}//9.自动播放轮播图var timer = setInterval(function(){//手动调用点击事件arrow_r.click();},2000);});
.

