zoukankan      html  css  js  c++  java
  • 游民轮播图效果实现

      游民轮播图,如下图示,当红色进度条走满的时候更换图片,同时下方对应的缩略图也变化。点击缩略图也会更换图片的效果。

      该轮播图为过渡变化,所以不用无缝连接,只需5张图片即可。

      首先,大图区域给了div,并设置了背景图片,后期变化全是用背景图片的变换来实现。然后给了缩略图的5张小图。

      html代码如下:

     <section class="container" id="container">
            <i id="leftPo"></i>
            <div class="imgs" id="imgs">
            </div>
            <div id="line">
            </div>
            <div class="thumbnail" id="thumbnail">
                <img src="../img/1.jpeg" alt="">
                <img src="../img/2.jpeg" alt="">
                <img src="../img/3.jpeg" alt="">
                <img src="../img/4.jpeg" alt="">
                <img src="../img/5.jpeg" alt="">
            </div>
            <i id="rightPo"></i>
        </section>
    

      css代码如下:

       <style>
            * {
                padding: 0;
                margin: 0;
            }
    
            .container {
                 640px;
                height: 600px;
                margin: 20px auto;
                position: relative;
                overflow: hidden;
                background-color: rgb(228, 228, 228);
            }
    
            .imgs {
                 640px;
                height: 480px;
                border: 3px double gray;
                box-sizing: border-box;
                background-image: url('../img/1.jpeg');
                transition: all linear .5s;
            }
    
            #leftPo {
                display: inline-block;
                 30px;
                height: 30px;
                background-image: url('../img/left.png');
                position: absolute;
                top: 225px;
                left: 20px;
                z-index: 2;
                cursor: pointer;
                opacity: 0;
                transition: all linear .5s
            }
    
            #rightPo {
                display: inline-block;
                 30px;
                height: 30px;
                background-image: url('../img/right_03.png');
                position: absolute;
                top: 225px;
                right: 20px;
                z-index: 2;
                cursor: pointer;
                opacity: 0;
                transition: all linear .2s
            }
    
            #line {
                 640px;
                border-bottom: 6px solid red;
                position: absolute;
                left: -640px;
            }
    
            .thumbnail {
                 100%;
                display: flex;
                justify-content: space-around;
                margin-top: 10px;
            }
    
            .thumbnail>img {
                 120px;
                height: 100px;
                cursor: pointer;
            }
        </style>
    

        然后,将所有图片都装进数组里存放起来,之后通过索引调用图片即可。

        js代码如下:

            let line = document.getElementById('line');
                let imgArr = ['../img/1.jpeg', '../img/2.jpeg', '../img/3.jpeg', '../img/4.jpeg', '../img/5.jpeg'];
                let imgs = document.getElementById('imgs');
                let leftPo = document.getElementById('leftPo');
                let rightPo = document.getElementById('rightPo');
                let thumbnail = document.getElementById('thumbnail');
                let thumbnails = document.getElementsByTagName('IMG');
                // 第一张图片的缩略图初始化
                thumbnails[0].style.border = "4px solid gray";
                // stopTimerLine表示红线的定时器,stopTimerAll表示整体动画的定时器,index表示缩略图的索引。
                let stopTimerLine, stopTimerAll, index = 0;
                // 红线移动调用函数  同时在这个函数里要设置return lineMove,即返回本身函数,不然就只能执行一次
                let lineMove = function () {
                    stopTimerLine = setInterval(function () {
                        if (line.offsetLeft < 0) {
                            line.style.left = line.offsetLeft + 2 + 'px';
                        } else {
                            clearInterval(stopTimerLine);
                        }
                    }, 10);
                    rightPo.onclick();
                    return lineMove;
                }
                // 改变图片,改变缩略图样式,同时红线恢复初始位置
                let changeStyle = function (index) {
                    imgs.style.backgroundImage = `url('../img/${index}.jpeg')`;
                    for (let j = 0; j < thumbnails.length; j++) {
                        if (thumbnails[j].style.border != '') {
                            thumbnails[j].style.border = '';
                            break;
                        }
                    }
                    thumbnails[index - 1].style.border = "4px solid gray";
                    line.style.left = -640 + 'px';
                }
                // 右箭头按钮点击更换图片
                rightPo.onclick = function () {
                    if (index == 5) {
                        index = 1;
                    } else {
                        index++;
                    }
                    changeStyle(index);
    
                }
                // 左箭头按钮点击更换图片
                leftPo.onclick = function () {
                    if (index == 0 || index == 1) {
                        index = 5;
                    } else {
                        index--;
                    }
                    changeStyle(index);
                }
                // 缩略图点击更换图片
                thumbnail.onclick = function (event) {
                    for (let i = 0; i < thumbnails.length; i++) {
                        if (thumbnails[i] == event.target)
                            index = i + 1;
                    }
                    changeStyle(index);
                }
                // 鼠标移入图片框就显示左右箭头,移出时隐藏
                container.onmousemove = function () {
                    leftPo.style.opacity = '0.8';
                    rightPo.style.opacity = '0.8';
                }
                container.onmouseout = function () {
                    leftPo.style.opacity = '0';
                    rightPo.style.opacity = '0';
                }
                // 红线移动判断图片的改变   在此计时器中 用lineMove()先调用一次函数(同时在这个函数里要设置return lineMove,即返回本身函数,不然就只能执行一次),这样就刷新页面即执行一次
                let imgMove = function () {
                    clearInterval(stopTimerAll);
                    stopTimerAll = setInterval(lineMove(), 5000);
                }
                imgMove();
    

      这里有一个小技巧,一般情况下设置setinterval的定时器,当我们刷新页面的时,会等待1个间隔时间后才开始运动。那么该如何解决?这里我在设置定时器时,直接先调用了一次函数,即  stopTimerAll = setInterval(lineMove(), 5000);    这样刷新页面立即调用,不用等待。

      不过这样也存在一个问题,就是这样写就该函数就只能调用一次了,所以我在lineMove这个函数里的最后面加了一个return lineMove;即返回函数本身,这样在第一次调用之后,就会返回这个函数到定时器里,之后就可以不断的调用了。

  • 相关阅读:
    【存货管理】存货的计价方法
    【NHibernate】列“ReservedWord”不属于表 ReservedWords
    【MySQL】MySQL中where条件的执行分析
    brew卸载&重新安装
    mac nvm安装&使用&一些问题解决方案
    python初始环境配置
    股票数据api整理
    输入一个url到页面渲染完毕过程
    自己简单封装一个promise
    节流&防抖
  • 原文地址:https://www.cnblogs.com/zhangzhiyong/p/9749827.html
Copyright © 2011-2022 走看看