zoukankan      html  css  js  c++  java
  • JS——轮播图高级版

    需求:

    1、页面需要小图标和箭头

    2、定时器不断的滑动图片

    3、在点击箭头时,图标和图片随即做出响应

    核心思想:

    1、往左移动到第一张的情况:在第二张移动到第一张时,这个动画效果完成之后,立刻将ul的left位置切换到最后一张的位置。

    2、往右移动到最后一张的情况:在倒数第二张移动到最后一张时,这个动画效果完成之后,立刻将ul的left位置切换到第一张的位置

    3、以上两点效果实现的基础是,第一张图片和最后一张图片是一样的。

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <style>
            * {
                padding: 0;
                margin: 0;
                list-style: none;
            }
    
            .box {
                width: 500px;
                height: 200px;
                padding: 5px;
                border: 1px solid #ccc;
                margin: 150px auto;
            }
    
            .content {
                width: 500px;
                height: 200px;
                overflow: hidden;
                position: relative;
            }
    
            .content ul {
                width: 600%;
                position: absolute;
            }
    
            .content li {
                float: left;
            }
    
            .content ol {
                position: absolute;
                bottom: 14px;
                right: 20px;
            }
    
            .content ol li {
                float: left;
                width: 20px;
                height: 20px;
                background-color: #fff;
                font: 500 17px/20px "simsun";
                text-align: center;
                margin-right: 15px;
                cursor: pointer;
            }
    
            .arrow {
                display: none;
            }
    
            .arrow span {
                position: absolute;
                top: 50%;
                margin-top: -20px;
                width: 30px;
                height: 40px;
                background-color: rgba(255, 228, 206, 0.3);
                text-align: center;
                font: 400 20px/40px "simsun";
                border: 1px solid #fff;
                cursor: pointer;
            }
    
            .arr-left {
                left: 5px;
                border-radius: 0 5px 5px 0;
            }
    
            .arr-right {
                right: 5px;
                border-radius: 5px 0 0 5px;
            }
    
            .content .current {
                background-color: yellow;
            }
        </style>
    </head>
    <body>
    <div class="box" id="scrollImg">
        <div class="content">
            <ul>
                <li><img src="images/1.jpg"></li>
                <li><img src="images/2.jpg"></li>
                <li><img src="images/3.jpg"></li>
                <li><img src="images/4.jpg"></li>
                <li><img src="images/5.jpg"></li>
            </ul>
            <ol></ol>
            <div class="arrow">
                <span class="arr-left"><</span>
                <span class="arr-right">></span>
            </div>
        </div>
    </div>
    <script>
        var divEle = document.getElementById("scrollImg");
        var ulEle = divEle.children[0].children[0];
        var imgWidth = divEle.children[0].offsetWidth;
        var olEle = divEle.children[0].children[1];
        var arrEle = divEle.children[0].children[2];
        //1、在第五张图片后放置第一张图片
        var firstImg = ulEle.children[0].cloneNode(true);
        ulEle.appendChild(firstImg);
        //2、创建5个小图标
        for (var i = 0; i < ulEle.children.length - 1; i++) {
            var liEle = document.createElement("li");
            liEle.innerHTML = i + 1;
            olEle.appendChild(liEle);
        }
        //3、点亮第一个小图标
        olEle.children[0].className = "current";
        //4、鼠标放到小图标上轮播图片
        var olLiArr = olEle.children;
        for (var i = 0; i < olLiArr.length; i++) {
            olLiArr[i].index = i;
            olLiArr[i].onmouseover = function () {
                for (var j = 0; j < olLiArr.length; j++) {
                    olLiArr[j].className = "";
                }
                this.className = "current";
                animate(ulEle, -imgWidth * this.index);
                key = square = this.index;
            }
        }
        //5、添加定时器
        var timer = setInterval(autoPaly, 1000);
        var key = 0;
        var square = 0;
        //图片1秒钟滑动一次,并且对应的小图片也随机点亮
        //当key=5时是第5张图片向第6张图片移动(第6张也就是第1张)
        //当key=6时其实是第1张向第2张图片移动,此时我们立刻更改ul的left值,达到了偷梁换柱的效果
        function autoPaly() {
            key++;
            if (key > olLiArr.length) {//key=6立刻将key=1
                ulEle.style.left = 0;
                key = 1;
            }
            animate(ulEle, -imgWidth * key);
            square++;
            if (key === olLiArr.length) {//当key=5时,此时已经滑动到了第一张图片,所以square=0
                square = 0;
            }
            for (var i = 0; i < olLiArr.length; i++) {
                olLiArr[i].className = "";
            }
    
            olLiArr[square].className = "current";
        }
    
        //6、鼠标放上去清除定时器,移开后在开启定时器
        divEle.onmouseover = function () {
            arrEle.style.display = "block";
            clearInterval(timer);
        }
        //在清除定时器时,因为key与square都是全局变量
        //所以当再次开启定时器时,函数依然按照原来计划执行
        divEle.onmouseout = function () {
            arrEle.style.display = "none";
            timer = setInterval(autoPaly, 1000);
        }
        //7、左右箭头切换图片
        arrEle.children[0].onclick = function () {
            key--;
            if (key < 0) {//key=-1时立刻换到最后一张图片,并将key值赋值成倒数第二张图片的数值
                ulEle.style.left = -olLiArr.length * imgWidth + "px";
                key = olLiArr.length - 1;
            }
            animate(ulEle, -imgWidth * key);
            square--;
            if (key < 0) {//当key=5时,此时已经滑动到了第一张图片,所以square=0
                square = 4;
            }
            for (var i = 0; i < olLiArr.length; i++) {
                olLiArr[i].className = "";
            }
    
            olLiArr[square].className = "current";
        }
        arrEle.children[1].onclick = function () {
            autoPaly();
        }
    
        //图片移动
        function animate(ele, target) {
            clearInterval(ele.timer);
            var speed = ele.offsetLeft < target ? 15 : -15;
            ele.timer = setInterval(function () {
                ele.style.left = ele.offsetLeft + speed + "px";
                var value = ele.offsetLeft - target;
                if (Math.abs(value) <= Math.abs(speed)) {
                    ele.style.left = target + "px";
                    clearInterval(ele.timer);
                }
            }, 10);
        }
    
    </script>
    </body>
    </html>

  • 相关阅读:
    反射、枚举
    WebService、Http请求、Socket请求
    RPC和REST的区别
    命名分组
    golang isPowerOfTwo判断是否是2的幂
    golang 判断平台是32位还是64位
    vue的permission.js详解
    windows 下完全卸载oracle 11的详细过程
    freemarker导出word
    freemarker详细教程从入门到精通(三)模板入门与指令
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/7920455.html
Copyright © 2011-2022 走看看