原生js制作PC端轮播图

15 篇文章 1 订阅
11 篇文章 0 订阅

功能分析

1.鼠标经过离开轮播图左右按钮显示隐藏
2.点击左侧按钮图片向左播放一张,右边同理
3.图片播放同时,下面的小圆圈也跟着变化
4.点击小圆圈,播放相应的图片
5.鼠标不经过轮播图,轮播图自动播放
6.鼠标经过轮播图,自动播放停止
HTML标签的结构及css样式

	<div class="box">
        <!-- 左侧按钮 -->
        <a href="javascript:;" class="arrow-l">
            <
        </a>
        <!-- 右侧按钮 -->
        <a href="javascript:;" class="arrow-r">
            >
        </a>

        <!-- 核心滚动区域 -->
        <ul>
            <li>
                <a href="#"><img src="./2-3-1.png" alt=""></a>
            </li>
            <li>
                <a href="#"><img src="./2-3-2.png" alt=""></a>
            </li>
            <li>
                <a href="#"><img src="./2-3-3.png" alt=""></a>
            </li>
            <li>
                <a href="#"><img src="./2-3-4.png" alt=""></a>
            </li>
           
        </ul>

        <!-- 小圆圈 -->
        <ol class="circle">
          
        </ol>
    </div>

将li标签浮动成一排在ul中,因为要用到缓动画函数,ul需要绝对定位到box大盒子的最左侧。

运动原理以三张图为例


绿色的框是box盒子(也就是我们看到的视图),ul定位到绿色盒子的最左边,li排成一排在ul上

轮播图的动画实现依赖于封装好的缓动画函数,详见上一个博客

功能实现

  1. 鼠标经过离开轮播图左右按钮显示隐藏

添加鼠标经过事件并且利用display实现显示隐藏

arrow_l.style.display = ‘block’;
arrow_r.style.display = ‘block’;

2.点击左侧按钮图片向左播放一张,右边同理

左右按钮添加点击事件

声明一个变量num,点击向右按钮一次就自增一次,向左则自减,这个变量乘于图片的宽度就是ul移动的距离

利用offsetWidth获取盒子(既图片)的宽度(这个变量要是全局变量,因为后面也有用)

var boxWidth = box.children[2].children[0].children[0].children[0].offsetWidth;

图片无缝滚动的原理

  • 把ul的第一个li复制放到ul的最后面
  • 当图片滚动到克隆的最后一张图片时,让ul快速的不做动画的移动到最左侧,left = 0;
  • 同时num赋值为0,这样又可以重新开始滚动图片了
  • 当图片在第一张点击向左按钮时,让ul快速的不做动画的移动到最后一张,然后最后一张移到倒数第二张做动画

节流阀

防止轮播图按钮连续点击导致播放过快
目的:当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发
实现思路:利用回调函数。添加一个变量来控制,锁住跟解锁函数

 // 6.克隆第一张图片(li)放到ul最后面
    var first = ul.children[0].cloneNode(true);
    ul.appendChild(first);
 // 7.点击右侧安妮, 图片就滚动一张
    var num = 0;
    // circle 控制小圆圈的播放
    var circle = 0;
    //flag  节流阀
    var flag = true;
    arrow_r.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*boxWidth, function() {
                flag = true;  //打开节流阀
            });
            //点击右侧按钮,小圆圈跟随一起变化,可以先声明一个变量控制小圆圈额播放
            circle++;
            if(circle == ul.children.length - 1) {   //说明走到了最后我们克隆的这张图片了
                circle = 0;
            }        
            // 调用函数
            circleChang();
        }
    });

    // 左侧按钮做法
    arrow_l.addEventListener('click' ,function() {
       if(flag = true) {
        flag = false;   //关闭节流阀
         // 如果是第一张图片,则此时快速移动到最后一张
        if(num == 0) {
            num = ul.children.length-1; 
            ul.style.left = -num * boxWidth + 'px';   
        } 
             num--;
             animate(ul, -num*boxWidth, function() {
                flag = true;  //打开节流阀
            });
        
        //点击左侧按钮,小圆圈跟随一起变化,可以先声明一个变量控制小圆圈额播放
        circle--;
        // 如果circle < 0 说明第一张图片,则小圆圈要改成第四个小圆圈(3)
        circle = circle < 0 ? ol.children.length - 1 : circle;
        // 调用函数
        circleChang();
       }
    });

3.图片播放同时,下面的小圆圈也跟着变化
4.点击小圆圈,播放相应的图片

动态生成小圆圈并绑定经过事件

定义一个circle变量,初始化为0,每次向右点击自增,向左点击自减
封装一个circhange函数,以‘干掉别人,留下自己’的思想实现小圆圈的动态变化

  // 动态生成小圆圈  有几张图片,我们就生成几个小圆圈
    var ul = box.querySelector('ul');
    var ol = box.querySelector('.circle');
    // console.log(ul.children.length);  li的个数
    for(var i = 0; i < ul.children.length; i++) {
        // 创建一个小li
        var li = document.createElement('li');
        // 记录当前小圆圈的索引号  通过自动以属性来做
        li.setAttribute('index',i); 
        // 把小li插入到ol里面
        ol.appendChild(li);
        // 4.小圆圈的排他思想  我们可以直接在生成小圆圈的同时直接绑定经过事件
        li.addEventListener('mouseover',function() {
            //干掉所有人(清除所有小li的类名)   
            for(var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 留下我自己
            this.className = 'current';

            //5.点击小圆圈移动图片  当然移动的是ul
            // ul的移动距离就是小圆圈的索引号乘上图片的宽度  注意是负值
            // 当我们点击某个小li 就拿到当前小li 的索引号
            var index = this.getAttribute('index');

            //当我们点击了某个小li,就要把这个li的索引号给num
            num = index;
            //当我们点击了某个小li,就要把这个li的索引号给circle
            circle = index;
           animate(ul, -index*boxWidth);
        })
    }

5.鼠标不经过轮播图,轮播图自动播放

利用定时器来实现每段时间执行一次函数,这里直接手动执行点击右侧按钮这个函数就行了

手动调用事件

arrow_r.click();

// 10.自动播放轮播图
    var timer = setInterval(function() {
        // 手动调用事件
        arrow_r.click();
    },2000);
})

6.鼠标经过轮播图,自动播放停止

鼠标离开事件清除定时器

box.addEventListener('mouseenter',function() {
        // 关闭定时器
        clearInterval(timer);
        timer = null;   //清除定时器变量
    })

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值