美文网首页Web 前端开发
自适应左右滑动切换轮播

自适应左右滑动切换轮播

作者: kerush | 来源:发表于2017-07-24 16:07 被阅读119次
    前端入坑纪 33

    挖坑了,最近忙着写html5的小游戏,少了更新。

    这会儿,乘着有空,稍微更新一个先前的轮播效果。

    闲言少叙,直入正题。

    又是一个轮播

    OK,first things first!项目链接

    HTML 结构
    <div class="swipWrp">
        <div id="swiper" class="clear">
            ![](https://img.haomeiwen.com/i4732938/8206bfad17390bb8.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            ![](https://img.haomeiwen.com/i4732938/3f4267d10670065a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            ![](https://img.haomeiwen.com/i4732938/98b2e3cb7fc5798d.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
            ![](https://img.haomeiwen.com/i4732938/90a0b25e3a601454.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
        </div>
    </div>
    

    依旧简洁的div#swiper 宽度为400%(100%*4)包裹图片,让图片向左浮动,并且宽度为25%(100%/4)。而div.swipWrp是用来定位轮播里的小圆点的(代码里生成)

    CSS 结构
            body {
                padding: 0;
                margin: 0;
                background-color: #F4F4F4;
            }
            
            p {
                padding: 0;
                margin: 0;
            }
            
            ul,
            li {
                padding: 0;
                margin: 0;
                list-style: none;
            }
            
            a {
                text-decoration: none;
                color: #525252;
            }
            
            img {
                vertical-align: middle;
            }
            
            .fl {
                float: left;
            }
            
            .fr {
                float: right;
            }
            
            .clear::after {
                display: block;
                content: "";
                clear: both;
            }
    
        .swipWrp {
                position: relative;
                width: 100%;
                margin: 0 auto;
                overflow: hidden;
                
            }
            
            #swiper {
                width: 400%;
                position: relative;
                overflow: hidden;
                text-align: center;
                transition: all 400ms ease-in;
                background-color: #ededed;
            }
            
            #swiper img {
                float: left;
                margin: 0 auto;
                width: 25%;
            }
            
            #tags {
                position: absolute;
                bottom: 0;
                left: 0;
                width: 100%;
                text-align: center;
            }
            
            #tags a {
                display: inline-block;
                transition: all 1s ease;
                width: 9px;
                height: 9px;
                margin: 3px 6px;
                border-radius: 4.5px;
                background-color: rgba(255, 255, 255, .5)
            }
            
            #tags a.on {
                transform: scale(1.2, 1.2);
                background-color: rgba(255, 255, 255, .85)
            }
    
    

    轮播里的图片和小圆点切换都加了过渡动画。至于从css开始到.clear类的那些都是重置样式,基本我的项目里都有。小伙伴应该很熟悉了。

    JS 结构
                    var swiper = document.getElementById("swiper");// 获取轮播本身
                    var imgs = swiper.getElementsByTagName("img");// 获取轮播里的图片
                    var indx = 0;// 轮播变换的顺序id
                    var timers = null;// 最开始设定存放计时器的变量
    
                                    // 这里开始就是创建切换轮播时的小圆点
                    var nodeFgmt = document.createDocumentFragment();// 创建个文档片段,存放接下来生产的html文档
                    newNode = document.createElement("div");// 创建个div
                    newNode.id = "tags";// 给新的div一个id
    
                                    // 根据图片数创建相应数量的a标签
                    for(var i = 0; i < imgs.length; i++) {
                        var ond = document.createElement("a");
                        ond.href = "javascript:;";
                        ond.setAttribute("data-indx", i);// 给每个a设置自定义属性“data-indx”
                        nodeFgmt.appendChild(ond);// 把所有的a加到之前创建的文档片段里
                    }
                    newNode.appendChild(nodeFgmt);// 把文档片段加到前面创建的div里
    
                    swiper.parentNode.appendChild(newNode);// 给轮播的父级添加上面创建好的div#tags
                                    
                                     
                    var tagsA = document.getElementById("tags").getElementsByTagName("a");// 创建完就获取里面的a吧
    
                                    // 给a添加事件和切换的效果
                    for(var s = 0; s < tagsA.length; s++) {
                        tagsA[s].onmouseover = function() {
                            offEft();
                            hideAll();
                            var indxA = this.getAttribute("data-indx");
                            changeEffect(indxA);
                            this.className = "on"
                        }
                        tagsA[s].onmouseout = function() {
                            onEft();
                        }
                    }
    
                                    // 默认第一个a为选中
                    tagsA[0].className = "on";
    
    
                                    // 重置所有a的class为空,也就是都未不选中状态
                    function hideAll() {
                        for(var i = 0; i < imgs.length; i++) {
                            tagsA[i].className = ""
                        }
                    }
    
                                    // 调用轮播效果的代码
                    function scrollIntvel() {
                        timers = setInterval(function() {
                            hideAll()
                            if(indx < imgs.length - 1) {
                                indx++;
                            } else {
                                indx = 0;
                            }
                            changeEffect(indx);
                        }, 3600);
                    }
    
                                   // 轮播切换时的代码
                    function changeEffect(indx) {
    
                        swiper.style.transform = "translateX(-" + 25 * indx + "%)";
                        tagsA[indx].className = "on";
    
                    }
                                    
                                  // 开启效果
                    function onEft() {
                        scrollIntvel()
                    }
    
                                  // 关闭效果
                    function offEft() {
                        clearInterval(timers);
                    }
    
                                    
                    scrollIntvel()  // 运行调用轮播效果
    
                                   // 左滑时的要执行的效果
                    function swiperLeft() {
                        hideAll();
                        if(indx > 0) {
                            indx--;
                        } else {
                            indx = imgs.length - 1;
                        }
                        changeEffect(indx);
                    }
    
    
                                     // 右滑时的要执行的效果
                    function swiperRight() {
                        hideAll();
                        if(indx < imgs.length - 1) {
                            indx++;
                        } else {
                            indx = 0;
                        }
                        changeEffect(indx);
                    }
    
    
                                     // 判断左滑,还是右滑,并执行对应效果
    
                    var startX = endX = 0; // 先定义个存放x轴上的开始位置和结束位置的变量
    
                                     // 获取开始触摸时x轴位置,并停止自动轮播的效果
                    swiper.addEventListener("touchstart", function(evt) {
                        startX =endX =  evt.targetTouches[0].clientX;
                        offEft();
                    });
    
                                     // 获取触摸过程中x轴位置
                    swiper.addEventListener("touchmove", function(evt) {
                        endX = evt.targetTouches[0].clientX;
                    });
    
                                     // 滑动结束时判断方向,执行对应效果,并开启自动轮播的效果
            swiper.addEventListener("touchend", function(evt) {
                if (endX - startX < -47) {
                    swiperRight()
                } else if (endX - startX > 47) {
                    swiperLeft()
                }
                onEft()
            });
    
    

    因为是挖坑,所以这次代码备注的也特别详细,不然感觉对不起小伙伴。那么有兴趣的同学,可以好好研究一翻,期待你我共同进步!!!

    好了,到此,本文告一段落!感谢您的阅读!祝你身体健康,阖家幸福!

    相关文章

      网友评论

        本文标题:自适应左右滑动切换轮播

        本文链接:https://www.haomeiwen.com/subject/qpaykxtx.html