轮播图_添加节流阀

1)节流阀的目的

//1 避免我们连续点击按钮 图片播放过快的问题

//2 当上一个函数动画内容执行完毕,再去执行下一个动画,让事件无法连续触发

2)核心思路

//1 利用回调函数 添加一个变量 锁住函数和解锁函数

//2 开始这是一个变量 var flag = true;

//3 if(flag){flag=false; do something} 关闭水龙头

//4 利用回调函数,动画执行完毕 flag = true 打开水龙头

3)简单验证节流阀

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<button>按钮</button>

<script>
    var btn = document.querySelector('button');
    var flag = true;
    btn.onclick = function () {
        if (flag) {
            flag = false;//关闭节流阀
            console.log(11);
            console.log(11);
            console.log(11);
            console.log(11);
            console.log(11);
            console.log(11);
            console.log(11);
            say('刘德华',function () {
                flag = true;//回调函数执行完成后 打开节流阀
            })
        }
    }
    //定义一个函数
    function say(name,callback){
        alert(name);
    }
</script>

</body>
</html>

4)轮播图代码

添加了节流阀
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script src="animate.js"></script> <title>轮播图添加节流阀</title> <style> * { margin: 0; padding: 0 } img { border: 0; /*ie6*/ vertical-align: middle; } .banner { position: relative; 721px; height: 455px; margin: 100px auto; background-color: pink; overflow: hidden; } .banner ul { position: absolute; top: 0; left: 0; 800%; } .banner li { list-style: none; float: left; } .arrow-l, .arrow-r { display: none; position: absolute; top: 50%; 60px; height: 60px; line-height: 40px; background: rgba(10,10, 10, .9); text-align: center; font-size: 18px; color: white; z-index: 2; } .arrow-r { right: 0; } /*小圆圈*/ .circle { position: absolute; bottom: 10px; left: 50%; } .circle li { float: left; 12px; height: 12px; /*background-color: #fff;*/ border: 2px solid rgba(255, 255, 255, 0.5); margin: 0 3px; border-radius: 50%; /*鼠标经过显示小手*/ cursor: pointer; } .current { background: #fff; } </style> </head> <body> <div class="banner"> <!--左侧箭头--> <a href="javascript:;" class="arrow-l">&lt;</a> <!--右侧箭头--> <a href="javascript:;" class="arrow-r">&gt;</a> <!--核心滚动区域--> <ul> <li><a href=""><img src="image/banner1.jpg" alt=""></a></li> <li><a href=""><img src="image/banner2.jpg" alt=""></a></li> <li><a href=""><img src="image/banner3.jpg" alt=""></a></li> <li><a href=""><img src="image/banner4.jpg" alt=""></a></li> </ul> <!-- 小圆圈 --> <ol class="circle"> </ol> </div> <script> //load加载事件 window.onload = function () { var banner = document.querySelector('.banner');//banner主体 var arrowL = document.querySelector('.arrow-l');//左箭头 var arrowR = document.querySelector('.arrow-r');//右箭头 var ul = banner.querySelector('ul'); var ol = banner.querySelector('ol'); var bannerW = banner.offsetWidth;//得到图片的宽度 默认banner盒子和图片宽度一致 //1 鼠标经过 按钮显示 banner.addEventListener('mouseenter',function () { arrowL.style.display = 'block'; arrowR.style.display = 'block'; clearInterval(timer); timer = null; }); // 鼠标离开 按钮隐藏 banner.addEventListener('mouseleave',function () { arrowL.style.display = 'none'; arrowR.style.display = 'none'; //鼠标离开 开启定时器 timer = setInterval(function () { arrowR.click();//手动调用点击事件 },2000); }); //2 动态循环生成小圆圈 for (var i = 0; i < ul.children.length; i++) { //2.1 创建元素 var li = document.createElement('li'); //3.1 给小圆点添加一个自动属性 来记录它的索引号 li.setAttribute('data-index',i); //2.2 添加元素 ol.appendChild(li); //2.3 给小圆圈添加点击事件 并使用排他思想 li.addEventListener('click',function () { //干掉所有人 清除所有li的 current的类名 for (var i = 0; i < ol.children.length;i++) { ol.children[i].className = ''; } //留下我自己 添加current类名 this.className = 'current';//this指向函数的调用者 //3 点击小圆圈 移动图片 [移动的是ul] //ul的移动距离 = 小圆点的索引 * 图片宽度 var index = this.getAttribute('data-index');//获得小圆点的自定义索引号 //6.1 num是控制按钮点击图片的 当我们点击了li 我们拿到li的索引号 给了num num = index; circle = index; animate(ul,-index * bannerW); }); } //2.4 把ol的第一个小圆圈添加选中状态 ol.children[0].className = 'current'; //4 克隆第一张图片 var firstLi = ul.children[0].cloneNode(true); ul.appendChild(firstLi); //num变量控制图片的变化 var num = 0; //circle变量控制小圆点的变化 var circle = 0; //节流阀 var flag = true; //5 点击右侧按钮 图片滚动一张 arrowR.addEventListener('click',function () { if (flag) { flag = false;//关闭节流阀 //如果到了最后一张复制的图片 我们就让ul的left值为0 if (num == ul.children.length -1) { ul.style.left = '0'; num = 0;// } num++; animate(ul,-num * bannerW,function () { flag = true;//打开节流阀 }); //6 点击右侧按钮 小圆圈跟随一起变化 circle++; //如果走到了最后克隆的图片 我们就把它置为0 if (circle == ol.children.length) { circle = 0; } //调用小按钮怕他函数 circleChange(); } }); //7 左侧按钮 arrowL.addEventListener('click',function () { if (flag) { flag = false; //等于0就是第一张了 让它迅速的切换到第四张 if (num == 0) { num = ul.children.length - 1; ul.style.left = -num * bannerW + 'px'; } num--; animate(ul,-num * bannerW,function () { flag = true;//打开节流阀 }); circle--; //小于0 说明已经是第一张图片,再点击切换到最后一张图片 则小圆圈要改为最后一个小圆圈 //circle = circle < 0 ? ol.children.length -1 : circle; 三元表达式 if (circle < 0 ) { circle = ol.children.length -1; } //调用小按钮怕他函数 circleChange(); } }); //8 定时播放功能 var timer = setInterval(function () { //手动调用点击事件 arrowR.click(); },2000); //点击按钮控制小园点变化函数 function circleChange(){ //排他思想 干掉别人 for (var i = 0; i < ol.children.length; i++) { ol.children[i].className = ''; } //留下自己 ol.children[circle].className = 'current'; } } </script> </body> </html>
原文地址:https://www.cnblogs.com/fuyunlin/p/14467361.html