zoukankan      html  css  js  c++  java
  • 原生js焦点轮播图的实现

      继续学习打卡,武汉加油,逆战必胜!今日咱们主要探讨一下原生js写轮播图的问题,

      简单解析一下思路:

        1,首先写好css样式问题

        2,考虑全局变量:自动播放的定时器,记录图片位置的角标Index,判断点击是否过快的标识

        2,根据轮播图的张数,动态设置焦点小圆点的个数,并设置好相应的自定义属性(以备焦点图点击的时候与index对应方便去改变图片的播放问题)

        3,为了解决第一张和最后一张衔接的问题,给最后一张图后面追加第一张图,在播放追加的这张图的时候,改变位置播放2这张图;左侧播放仪式一样,复制最后一张图放在最前面做衔接;完成后注意及时改变盒子的宽度和定位置

        4,自动播放:开启定时器,记录图片角标的index自加执行图片播放

        5,图片从起始位置到结束位置的播放实现

          5.1,获取元素原来的位置

          5.2,设置定时器移动

                1.把需要移动的位置分五次轮播--多少次都行   计算需要移动的长度----步长不一定是固定的

                2.计算出来的长度取整--可能不是整数

                3.原来的位置加上要移动的位置

                4.判断原来的位置移动后是否和需要去的位置相等

                5. 如果相等则清除定时器

             6.调用回调函数,判断index的极值问题及时做出改变,注意定时器结束了此时可以执行点击换图等操作  flag值为true

         6,改变圆点当前位置样式问题:主要通过index角标找到当前位置,然后与圆点自定义属性值对应来找到圆点当前位置

         7,焦点圆点控制的问题

            7.1,首先添加事件监听,判断点击对象

            7.2,判断图片播放是否完成--flag--防止点击过快

            7.3,执行图片播放

          8,上下翻页问题:

            8.1,首先添加事件监听,判断点击对象

            8.2,判断图片播放是否完成--flag--防止点击过快

            8.2,上翻页则index自减,上翻页则自增,相应的执行圆点改变及图片播放,最后自动播放

          9,鼠标移入移出问题:绑定事件监听,移入则清除定时器,移出则自动播放

            10,附代码如下:

            

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
    * {
    margin: 0;
    padding: 0;
    }

    ul,
    ol,
    li {
    list-style: none;
    }

    a,
    a:hover,
    a:active {
    text-decoration: none;
    color: #333;
    }

    .clear::after {
    content: "";
    display: block;
    clear: both;
    }

    .banner {
    600px;
    height: 400px;
    margin: 40px auto;
    position: relative;
    /* overflow: hidden; */
    }

    .banner ul {
    500%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    }

    .banner ul li {
    600px;
    height: 100%;
    float: left;
    display: flex;
    justify-content: center;
    align-items: center;
    color: #fff;
    font-size: 100px;
    }

    .banner ol {
    height: 50px;
    background: rgba(0, 0, 0, .4);
    position: absolute;
    bottom: 50px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    justify-content: space-evenly;
    align-items: center;
    border-radius: 100px;
    }

    .banner ol li {
    25px;
    height: 25px;
    border-radius: 50%;
    background: #fff;
    margin: 0 25px;
    cursor: pointer;
    }

    .banner ol li.active {
    background: red;
    }

    .banner div {
    100%;
    height: 50px;
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    display: flex;
    justify-content: space-between;
    align-items: center;
    }

    .banner div a {
    40px;
    line-height: 40px;
    font-size: 40px;
    font-weight: 900;
    color: #fff;
    background: rgba(0, 0, 0, .4);
    text-align: center;
    }
    </style>
    </head>
    <body>
    <div class="banner">
    <ul class="clear">
    <li style="background:pink ;">img1</li>
    <li style="background:gray ;">img2</li>
    <li style="background:blue ;">img3</li>
    <li style="background:skyblue;">img4</li>
    <li style="background:orange ;">img5</li>
    <li style="background:orange ;">img6</li>
    </ul>
    <!-- 与轮播图,对应的焦点按钮
    是根据轮播图的图片数量,动态生成的
    -->
    <ol></ol>
    <div>
    <a href="JavaScript:;" class="left"> < </a>
    <a href="JavaScript:;" class="right"> > </a>
    </div>
    </div>
    <script>

    window.onload = function(){
    // 标签对象
    var oDiv = document.querySelector('div');
    var oUl = oDiv.querySelector('ul');
    var oOl = oDiv.querySelector('ol');
    var oUllis = document.querySelectorAll('ul li');
    var wid = parseInt(window.getComputedStyle(oDiv)['width']);
    var oBtnBox = oDiv.querySelector('div');
    // 轮播图的角标
    var index = 1;
    // 自动轮播定时器
    var timer = 0;
    // 判断点击是否继续
    var flag = true;
    // 动态设置圆点的个数
    setDot();
    // 给第一张图前面复制最后一个节点,给最后一个元素复制第一个节点
    copyLi();
    // 自动播放
    autoPlay();
    // 点击圆点
    dotFocus();
    // 上翻页和下翻页
    page();
    // 鼠标移入移除
    mouse();


    // 设置圆点的个数
    function setDot(){
    var str = '';
    oUllis.forEach(function(val,i){
    if (i == 0) {
    // 给第一个点添加当前样式
    str += `<li class="active" index="1"></li>`
    } else {
    str += `<li index=${i + 1}></li>`
    }
    })
    oOl.innerHTML = str;
    }


    // 给第一张图前面复制最后欧一个节点,给最后一个元素复制第一个节点
    function copyLi(){
    var firstLi = oUllis[0];
    var lastLi = oUllis[oUllis.length - 1];
    var first = firstLi.cloneNode(true);
    var last = lastLi.cloneNode(true);
    oUl.appendChild(first);
    oUl.insertBefore(last,firstLi);
    oUl.style.left = (-index * wid) + 'px';
    oUl.style.width = (oUllis.length + 2) * wid + 'px';
    }

    // 自动播放
    function autoPlay(){
    timer = setInterval(function(){
    index++;
    move(oUl,{left:-index * wid},moveEnd);
    dotChange();
    },2000)
    }

    // 1.获取元素原来的位置
    // 2.设置定时器移动
    // 1.把需要移动的位置分五次轮播--多少次都行 计算需要移动的长度
    // 2.计算出来的长度取整--可能不是整数
    // 3.原来的位置加上要移动的位置
    // 4.判断原来的位置移动后是否和需要去的位置相等
    // 如果相等则清除定时器
    function move(ele,obj,callback){
    for(var key in obj){
    var oldPos = parseInt(window.getComputedStyle(ele)[key]);
    var t = setInterval(function(){
    var step = (obj[key] - oldPos) / 5;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    oldPos += step;
    ele.style[key] = oldPos + 'px';
    if (oldPos == obj[key]) {
    clearInterval(t);
    callback()
    };
    },50)
    }
    }

    function moveEnd(){
    if (index == oUllis.length + 1) {
    index = 1;
    oUl.style.left = (-index * wid) + 'px';
    } else if (index == 0){
    index = oUllis.length;
    oUl.style.left = (-index * wid) + 'px';
    }
    flag = true;
    }

    // 点的当前样式
    function dotChange(){
    var oOllis = oOl.querySelectorAll("li");
    oOllis.forEach(function(val,i){
    val.className = '';
    var m = index;
    if (index == oOllis.length + 1) {
    m = 1;
    };
    if (val.getAttribute('index') * 1 == m) {
    val.className = 'active'
    };
    })
    }

    // 点击圆点
    function dotFocus(){
    oOl.addEventListener('click',function (e) {
    e = e || window.event;
    if (e.target.tagName == 'LI') {
    if (!flag) {
    return
    }
    flag = false;
    index = e.target.getAttribute('index') * 1;
    dotChange();
    move(oUl,{left:-index * wid},moveEnd);
    };
    })
    }

    // 上下翻页
    function page(){
    oBtnBox.addEventListener('click',function(e){
    e = e || window.event;
    if (e.target.className == 'left') {
    if (!flag) {
    return
    }
    flag = false;
    index--;
    dotChange();
    move(oUl,{left:-index * wid},moveEnd);
    };
    if (e.target.className == 'right') {
    if (!flag) {
    return
    }
    flag = false;
    index++;
    dotChange();
    move(oUl,{left:-index * wid},moveEnd);
    }
    })
    }

    // 鼠标移入移出
    function mouse(){
    oDiv.addEventListener('mouseover',function(){
    clearInterval(timer);
    })
    oDiv.addEventListener('mouseout',function(){
    autoPlay()
    })
    }

    }

    </script>
    </body>
    </html>

  • 相关阅读:
    CentOs图形界面的开启与关闭
    在CentOS上安装ZooKeeper集群
    CentOs中mysql的安装与配置
    CentOS 6.5 下安装 Redis 2.8.7
    apt-get 与 yum的区别 (转)
    centos 命令大全
    ctrl+c,ctrl+d,ctrl+z在linux中意义
    Jedis 例子(demo)大全
    gradle init.gradle的文件配置 使用
    Java使用Jetty实现嵌入式Web服务器及Servlet容器
  • 原文地址:https://www.cnblogs.com/chysunny/p/cherry.html
Copyright © 2011-2022 走看看