zoukankan      html  css  js  c++  java
  • 轮播图

    功能分解

    //1 鼠标经过轮播图模块 左右按钮显示 鼠标离开隐藏按钮
    
    //2 点击右侧按钮 图片往左播放一张 以此类推 左侧按钮同理

    //3 图片播放的同时 下面小圆点跟随一起变化
    //4 点击小圆点 可以播放相应图片

    //5 不做任何操作 图片也会定时轮播

    //3 鼠标经过 轮播图模块自动停止播放

    1)鼠标放入 按钮显示 鼠标移出 按钮隐藏

    //1 js比较多 我们单独建一个js文件
    //2 需要添加onload事件
    //3 mouseenter 和 mouseleave 事件
    //4 display:biock 和 none

    3)动态生成小圆点 [ 小园点和图片梳理一样 ]

    //1 得到ul里面图片的张数 [ 图片在li中 就是li的个数 ]
    //2 利用循环生成小圆圈 插入到ol中
    //3 创建节点 var li = document.createElement('li');
    //4 插入节点 ol.appendChild(li);

    4)小圆圈排他思想

    //1 给所有小圆圈添加点击事件
    //2 点击当前小圆圈 就添加 current类
    //3 其余小圆圈就移除current类
    //4 重点:我们在刚刚生成小圆圈的同时,就可以添加点击事件
    //所以点击事件写在了 生成li的for循环里

    5)点击小圆圈滚动图片

    //1 用到了 animate.js 动画函数
    //2 引用的时候 animate.js 要写在 index.js 上面 [因为index 依赖 animate]
    //3 使用动画函数 元素必须有定位 因为用到了left值
    //4 ul使用动画 所以给ul添加 position:absolute
    //5 滚动图片的核心算法:ul的移动距离 = 小圆圈的索引号 * 图片的宽度
    //6 但是我们需要知道小圆圈的索引号
    //7 我们在生成小圆圈的时候 给它添加一个自定义属性
    //8 点击的时候 获取到这个 自定义属性

    重点:是ul在移动 不是li移动

    6)右侧按钮

    1 点击右侧按钮一次 就让图片滚动一张

    2 声明一个变量 num 点击一次自增1 让这个变量乘以图片的宽度 就是ul的移动距离

    3 有一个问题 一直点 到最后一张 再点漏出底部的背景了 所有用到了无缝滚动原理

    7)无缝滚动原理

    //1 把ul里面的第一个li  复制了一份 放到ul的最后面

    //2 当图片滚动到克隆的最后一张图片时 让ul快速的、不做动画的跳到最左侧 left = 0

    //3 同时把num赋值为0 就可以重新滚动图片了

    8)克隆第一张图片

    // 1 用cloneNode(true) 深度克隆第一个图片
    
    // 2 将克隆的appendChild添加到ul的最有一个子节点

    9)点击按钮 小圆点跟随变化

    // 最简单的做法再声明一个变量 circle
    // 每次点击自增1 左侧按钮也需要 定义为全局的
    // 如果走到了克隆的那张图片 变量赋值0 重新开始

    10)两个小bug 

    //1 我们点击第二小按钮 显示第二张图片 这个时候我们点击右侧按钮 正常应该显示 第三张图片

    我们播放下一张图片时通过num变量控制的
    和上面的小圆点li点击事件没有关系 导致差异的存在

    11)左侧点击按钮

    //1 把右侧的按钮复制一份修改一下

    12)自动播放功能

    //1 添加一个定时器
    //2 自动播放轮播图 实际上就类似于点击了右侧按钮
    //3 此时 我们手动调用右侧按钮点击事件 arrowR.click()

    代码实现

    <!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;
            //5 点击右侧按钮 图片滚动一张
            arrowR.addEventListener('click',function () {
                //如果到了最后一张复制的图片 我们就让ul的left值为0
                if (num == ul.children.length -1) {
                    ul.style.left = '0';
                    num = 0;//
                }
                num++;
                animate(ul,-num * bannerW);
                //6 点击右侧按钮 小圆圈跟随一起变化
                circle++;
                //如果走到了最后克隆的图片 我们就把它置为0
                if (circle == ol.children.length) {
                    circle = 0;
                }
                //调用小按钮怕他函数
                circleChange();
            });
            //7 左侧按钮
            arrowL.addEventListener('click',function () {
                //等于0就是第一张了 让它迅速的切换到第四张
                if (num == 0) {
                    num = ul.children.length - 1;
                    ul.style.left = -num * bannerW + 'px';
                }
                num--;
                animate(ul,-num * bannerW);
                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>
    
    
    
    
    
    
    
    

      

  • 相关阅读:
    python --(链表)
    Cocos Creator_继承组件单例
    JDK丨WIN10配置JDK1.8 (解决javac不是内部或外部命令,也不是可运行的程序或批处理文件)
    debug apk logCat
    JavaScript 当前URL取参返回字典
    Javascript扩展String.prototype实现格式金额、格式时间、字符串连接、计算长度、是否包含、日期计算等功能
    cocos2d JS 源生js实现each方法
    Cocos Creator 动态设置Canvas的宽度与高度,更改适配
    JavaScript 判断是PC端还是移动端
    cocos creator使用anysdk接入admob广告教程
  • 原文地址:https://www.cnblogs.com/fuyunlin/p/14464512.html
Copyright © 2011-2022 走看看