美文网首页
js插件之iscroll,swiper0814

js插件之iscroll,swiper0814

作者: 煤球快到碗里来 | 来源:发表于2019-08-14 18:33 被阅读0次

js插件之iscroll,swiper

1.iscroll

1.1我们在电商网站移动端经常会看见有侧边栏,如下图

  • 侧边栏.png

我们先用原生js来实现一下这个功能

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>01-侧边栏菜单</title>
        <style>
            *{
                margin: 0;
                padding: 0;
                touch-action: none;
            }
            html,body{
                width: 100%;
                height: 100%;
            }
            .box{
                width: 85px;
                height: 100%;
                border: 1px solid #000;
            }
            .box>ul{
                list-style: none;
                width: 100%;
                position: relative;
            }
            .box>ul>li{
                width: 100%;
                height: 40px;
                line-height: 40px;
                text-align: center;
                border-bottom: 1px solid #666;
            }
            .box>ul>li:last-child{
                border-bottom: none;
            }
        </style>
    </head>
    <body>
    <div class="box">
        <ul>
            <li>热门推荐</li>
            <li>指趣学院</li>
            <li>手机数码</li>
            <li>家用电脑</li>
            <li>电脑办公</li>
            <li>计生情趣</li>
            <li>美妆护肤</li>
            <li>个护清洁</li>
            <li>汽车用品</li>
            <li>京东超市</li>
            <li>男装</li>
            <li>男鞋</li>
            <li>女装</li>
            <li>女鞋</li>
            <li>母婴童装</li>
            <li>图书音像</li>
            <li>运动户外</li>
            <li>内衣配饰</li>
            <li>食品生鲜</li>
            <li>酒水饮料</li>
            <li>家具家装</li>
            <li>箱包手袋</li>
            <li>钟表珠宝</li>
            <li>玩具乐器</li>
            <li>医疗保健</li>
            <li>宠物生活</li>
        </ul>
    </div>
    <script>
        // 1.拿到需要操作的元素
        let oDiv = document.querySelector("div");
        let oUl = document.querySelector("ul");
        let startY = 0;
        let offsetY = 0;
        let currentY = 0;
        let maxOffsetY = 0;
        let minOffsetY = oDiv.offsetHeight - oUl.offsetHeight;
        // 2.监听手指按下和移动的事件
        oDiv.ontouchstart = function (event) {
            // 保存手指按下的位置
            startY = event.targetTouches[0].clientY;
        }
        oDiv.ontouchmove = function (event) {
            // 拿到手指移动之后的位置
            let moveY = event.targetTouches[0].clientY;
            // 计算手指移动的偏移位
            offsetY = moveY - startY;
            // 判断有没有超出极限值
            if((currentY + offsetY) >= (maxOffsetY + 100)){
                return;
            }else if((currentY + offsetY) <= (minOffsetY - 100)){
                return;
            }
            // 让UL移动
            oUl.style.top = currentY + offsetY + "px";
        }
        oDiv.ontouchend = function (event) {
            // 保存已经移动出去的偏移位
            currentY += offsetY;
            // 判断有没有超出顶部的范围
            if(currentY > maxOffsetY){
                // console.log("超出范围了");
                currentY = maxOffsetY;
                oUl.style.top = maxOffsetY + "px";
            }
            // 判断有没有超出底部的范围
            else if(currentY < minOffsetY){
                // console.log("超出范围了");
                currentY = minOffsetY;
                oUl.style.top = minOffsetY + "px";
            }
        }
    </script>
    </body>
    </html>
    
1.2 我们来引出iscroll
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>02-iScroll基本使用</title>
        <style>
            *{
                margin: 0;
                padding: 0;
                touch-action: none;
            }
            div{
                width: 100%;
                height: 300px;
                border: 1px solid #000;
                box-sizing: border-box;
                overflow: hidden;
            }
            dl>dt{
                line-height: 30px;
                text-align: center;
                border-bottom: 1px solid #000;
            }
        </style>
        <script src="js/iscroll.js"></script>
    </head>
    <body>
    <div class="box">
        <dl>
            <dt>我是标题1</dt>
            <dt>我是标题29</dt>
            <dt>我是标题30</dt>
        </dl>
    </div>
    <script>
        /*
        1.什么是iScroll?
        iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件。
        iScroll不仅仅是滚动。在你的项目中包含仅仅4kb大小的iScroll,能让你的项目便拥有滚动,缩放,平移,无限滚动,视差滚动,旋转功能
    
        2.iScroll基本使用
        2.1按照iScroll的规定搭建HTML结构(如上三级结构)
        2.2引入iScroll
        2.3创建iScroll对象, 告诉它谁需要滚动(如下让box中内容滚动)
    
        3.iScroll的版本
        针对iScroll的优化。为了达到更高的性能,iScroll分为了多个版本。你可以选择最适合你的版本。
        3.1iscroll.js,这个版本是常规应用的脚本。它包含大多数常用的功能,有很高的性能和很小的体积。
        3.2iscroll-lite.js,精简版本。它不支持快速跳跃,滚动条,鼠标滚轮,快捷键绑定。但如果你所需要的是滚动(特别是在移动平台) iScroll 精简版 是又小又快的解决方案。
        3.3iscroll-probe.js,探查当前滚动位置是一个要求很高的任务,这就是为什么我决定建立一个专门的版本。如果你需要知道滚动位置在任何给定的时间,这是iScroll给你的。(我正在做更多的测试,这可能最终在常规iscroll.js脚本,请留意)。
        3.4iscroll-zoom.js,在标准滚动功能上增加缩放功能。
        3.5iscroll-infinite.js,可以做无限缓存的滚动。处理很长的列表的元素为移动设备并非易事。 iScroll infinite版本使用缓存机制,允许你滚动一个潜在的无限数量的元素。
        * */
        let myScroll = new IScroll('.box');
    </script>
    </body>
    </html>
    
1.3 其他用法
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>03-iScroll高级使用</title>
        <style>
            *{
                margin: 0;
                padding: 0;
                touch-action: none;
            }
            div{
                width: 50%;
                height: 300px;
                border: 1px solid #000;
                box-sizing: border-box;
                overflow: hidden;
                position: relative;
            }
            dl>dt{
                line-height: 30px;
                text-align: center;
                border-bottom: 1px solid #000;
            }
            //自定义滚动条的状态
            .iScrollVerticalScrollbar{
                width: 30px;
                height: 100%;
                background: deepskyblue;
                position: absolute;
                top: 0;
                right: 0;
                z-index: 999;
            }
            .iScrollIndicator{
                width: 100%;
                background: pink;
            }
        </style>
        <script src="js/iscroll.js"></script>
    </head>
    <body>
    <div class="box">
        <dl>
            <dt>我是标题1</dt>
            <dt>我是标题2</dt>
            <dt>我是标题3</dt>
        </dl>
    </div>
    <script>
        let myScroll = new IScroll('.box', {
            mouseWheel: true,
            scrollbars: true
            //scrollbars: 'custom'
            //scrollbars为true时滚动条时默认的状态,为custom时是自定义状态
        });
        //下面是滚动过程中的一些状态,按下就是滚动之前,松开就是滚动之后
        myScroll.on("beforeScrollStart", function () {
            console.log("滚动之前");
        });
        myScroll.on("scrollStart", function () {
            console.log("开始滚动");
        });
        /*myScroll.on("scroll", function () {
            console.log("正在滚动");
        });*/
        myScroll.on("scrollEnd", function () {
            console.log("滚动结束");
        });
    </script>
    </body>
    </html>
    
1.4 改造侧边导航栏
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>04-侧边栏菜单</title>
        <style>
            *{
                margin: 0;
                padding: 0;
                touch-action: none;
            }
            html,body{
                width: 100%;
                height: 100%;
            }
            .box{
                width: 85px;
                height: 100%;
                border: 1px solid #000;
            }
            .box>ul{
                list-style: none;
                width: 100%;
                position: relative;
            }
            .box>ul>li{
                width: 100%;
                height: 40px;
                line-height: 40px;
                text-align: center;
                border-bottom: 1px solid #666;
            }
            .box>ul>li:last-child{
                border-bottom: none;
            }
        </style>
        <script src="js/iscroll.js"></script>
    
    </head>
    <body>
    <div class="box">
        <ul>
            <li>热门推荐</li>
            <li>指趣学院</li>
            <li>手机数码</li>
            <li>家用电脑</li>
            <li>电脑办公</li>
            <li>计生情趣</li>
            <li>美妆护肤</li>
            <li>个护清洁</li>
            <li>汽车用品</li>
            <li>京东超市</li>
            <li>男装</li>
            <li>男鞋</li>
            <li>女装</li>
            <li>女鞋</li>
            <li>母婴童装</li>
            <li>图书音像</li>
            <li>运动户外</li>
            <li>内衣配饰</li>
            <li>食品生鲜</li>
        </ul>
    </div>
    <script>
        //就是这么简单
        new IScroll(".box");
    </script>
    </body>
    </html>
    
  • 这些工具只能用一点学一点了

2.swiper

2.1 使用做一个最复杂的轮播图
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>01-移动端轮播图</title>
        <style>
            *{
                margin: 0;
                padding: 0;
                touch-action: none;
            }
            div{
                width: 100%;
                position: relative;
                overflow: hidden;
            }
            ul{
                list-style: none;
                width: 500%;
                display: flex;
                justify-content: flex-start;
                position: relative;
                left: 0;
                top: 0;
            }
            ul>li{
                flex: 1;
            }
            ul>li>img{
                width: 100%;
                vertical-align: bottom;
            }
            div>p{
                width: 100%;
                position: absolute;
                left: 0;
                top: 50%;
                transform: translateY(-50%);
                display: flex;
                justify-content: space-between;
                /*background: deepskyblue;*/
                /*
                告诉浏览器当前元素不需要接收事件
                注意点: 如果父元素不接收事件, 那么默认子元素也不能接收事件
                        如果子元素需要接收事件, 那么必须单独设置为auto
                */
                pointer-events: none;
            }
            div>p>span{
                display: inline-block;
                width: 30px;
                height: 50px;
                line-height: 50px;
                text-align: center;
                font-weight: bold;
                font-size: 30px;
                color: #fff;
                background: rgba(0,0,0,0.3);
                pointer-events: auto;
            }
            ol{
                list-style: none;
                position: absolute;
                left: 50%;
                bottom: 20px;
                transform: translateX(-50%);
                display: flex;
                justify-content: flex-start;
            }
            ol>li{
                width: 20px;
                height: 20px;
                background: #fff;
                border-radius: 50%;
                margin: 0 5px;
            }
            ol>.active{
                background: #f40;
            }
        </style>
        <script src="js/zepto.js"></script>
        <script src="js/selector.js"></script>
        <script src="js/event.js"></script>
        <script src="js/touch.js"></script>
        <script src="js/fx.js"></script>
    </head>
    <body>
    <div>
        <ul>
            <li><img src="images/img1.jpg" alt=""></li>
            <li><img src="images/img2.jpg" alt=""></li>
            <li><img src="images/img3.jpg" alt=""></li>
            <li><img src="images/img4.jpg" alt=""></li>
            <li><img src="images/img1.jpg" alt=""></li>
        </ul>
        <p>
            <span class="left-btn">&lt;</span>
            <span class="right-btn">&gt;</span>
        </p>
        <ol>
            <li class="active"></li>
            <li></li>
            <li></li>
            <li></li>
        </ol>
    </div>
    <script>
        ;(function($){
            $.extend($.fn, {
                stop: function(){
                    this.css({transition: "none"});
                    return this
                },
                //判断有没有动画在执行
                isAnimation: function(){
                    let time = $("ul").css("transition-duration");
                    time = parseFloat(time);
                    return time !== 0;
                }
            })
        })(Zepto)
    </script>
    <script>
        // 1.定义变量保存对当前的索引
        let currentIndex = 0;
        // 2.定义变量保存图片宽度
        let itemWidth = $("ul>li").width();
        // 3.定义变量保存最大的索引
        let maxIndex = $("ul>li").length - 1;
        // 4.监听按钮点击
        $(".left-btn").click(function () {
            clearInterval(timerId);
            if($(this).isAnimation()){return}
            currentIndex--;
            if(currentIndex < 0){
                $("ul").css({left: -maxIndex * itemWidth});
                currentIndex = maxIndex - 1;
            }
            $("ul").animate({left: -currentIndex * itemWidth}, 500, function () {
                autoPlay();
            });
            $("ol>li").eq(currentIndex).addClass("active").siblings().removeClass();
        });
        $(".right-btn").click(function () {
            clearInterval(timerId);
            if($(this).isAnimation()){return}
            currentIndex++;
            if(currentIndex > maxIndex){
                $("ul").css({left: 0});
                currentIndex = 1;
            }
            $("ul").animate({left: -currentIndex * itemWidth}, 500, function () {
                autoPlay();
            });
            let index = currentIndex === 4 ? 0 : currentIndex;
            $("ol>li").eq(index).addClass("active").siblings().removeClass();
        });
        /*
        注意点:
        在移动端中是没有移入和移出事件的
        * */
        /*
        let oUl = document.querySelector("ul");
        oUl.onmouseenter = function () {
            console.log("移入");
        }
        oUl.onmouseleave = function () {
            console.log("移出");
        }
        */
        // 5.实现自动轮播
        let timerId = null;
        function autoPlay() {
            timerId = setInterval(function () {
                $(".right-btn").click();
            }, 2000);
        }
        autoPlay();
        $("ul").get(0).ontouchstart = function () {
            clearInterval(timerId);
        }
        $("ul").get(0).ontouchend = function () {
            autoPlay();
        }
        // 6.实现轻扫切换
        $("ul").swipeLeft(function () {
            $(".right-btn").click();
        });
        $("ul").swipeRight(function () {
            $(".left-btn").click();
        });
    </script>
    </body>
    </html>
    
2.2 来引出swiper
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>02-swiper基本使用</title>
        <link rel="stylesheet" href="css/swiper.css">
        <script src="js/swiper.js"></script>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .swiper-container{
                width: 400px;
                height: 300px;
                border: 1px solid #000;
                margin: 100px auto;
            }
            .swiper-container>ul{
                list-style: none;
            }
        </style>
    </head>
    <body>
    <div class="swiper-container">
        <ul class="swiper-wrapper">
            <li class="swiper-slide">Slide 1</li>
            <li class="swiper-slide">Slide 2</li>
            <li class="swiper-slide">Slide 3</li>
        </ul>
    </div>
    <script>
        /*
         1.什么是swiper?
         Swiper是纯javascript打造的滑动特效插件,面向PC、平板电脑等移动终端。
         Swiper能实现触屏焦点图、触屏Tab切换等常用效果。
         Swiper开源、免费、稳定、使用简单、功能强大,是架构移动终端网站的重要选择!
         
         2.如何使用:
         2.1引入swiper对应的css和js文件
         2.2按照框架的需求搭建三层结构
         2.3创建一个Swiper对象, 将容器元素传递给它
          */
        let mySwiper = new Swiper ('.swiper-container');
    </script>
    </body>
    </html>
    
2.3 Swiper另一些常用的功能
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>03-swiper高级使用</title>
        <link rel="stylesheet" href="css/swiper.css">
        <script src="js/swiper.js"></script>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .swiper-container{
                width: 400px;
                height: 300px;
                border: 1px solid #000;
                margin: 100px auto;
            }
            .swiper-container>ul{
                list-style: none;
            }
            .swiper-pagination-bullet{
                background: red;
            }
            .swiper-button-next{
                background: red;
            }
        </style>
    </head>
    <body>
    <div class="swiper-container">
        <ul class="swiper-wrapper">
            <li class="swiper-slide">Slide 1</li>
            <li class="swiper-slide">Slide 2</li>
            <li class="swiper-slide">Slide 3</li>
        </ul>
        <!-- 如果需要分页器 -->
        <div class="swiper-pagination"></div>
        <!-- 如果需要导航按钮 -->
        <div class="swiper-button-prev"></div>
        <div class="swiper-button-next"></div>
    </div>
    <script>
        let mySwiper = new Swiper ('.swiper-container', {
            // 如果需要分页器
            pagination: {
                el: '.swiper-pagination',
            },
            // 如果需要前进后退按钮
            navigation: {
                nextEl: '.swiper-button-next',
                prevEl: '.swiper-button-prev',
            },
            loop: true, // 循环模式选项
            // autoplay:true, // 自动轮播
            // autoplay: {
            //     delay: 1000,//1秒切换一次
            // },
            speed:5000, //设置切换速度
        });
    </script>
    </body>
    </html>
    
2.4 来改造一下我们的轮播图
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>04-移动端轮播图</title>
        <link rel="stylesheet" href="css/swiper.css">
        <script src="js/swiper.js"></script>
        <style>
            *{
                margin: 0;
                padding: 0;
                touch-action: none;
            }
            div{
                width: 100%;
            }
            ul{
                list-style: none;
            }
            ul>li>img{
                width: 100%;
                vertical-align: bottom;
            }
            .my-bullet{
                display: inline-block;
                width: 20px;
                height: 20px;
                background: #fff;
                border-radius: 50%;
                margin: 0 5px;
            }
            .my-bullet-active{
                background: #f40;
                opacity: 1;
            }
            
        </style>
    </head>
    <body>
    <div class="swiper-container">
        <ul class="swiper-wrapper">
            <li class="swiper-slide"><img src="images/img1.jpg" alt=""></li>
            <li class="swiper-slide"><img src="images/img2.jpg" alt=""></li>
            <li class="swiper-slide"><img src="images/img3.jpg" alt=""></li>
            <li class="swiper-slide"><img src="images/img4.jpg" alt=""></li>
        </ul>
        <!-- 如果需要分页器 -->
        <div class="swiper-pagination"></div>
        <!-- 如果需要导航按钮 -->
        <!-- 按钮的样式可以自定义-->
        <div class="swiper-button-prev"></div>
        <div class="swiper-button-next"></div>
    </div>
    <script>
        let mySwiper = new Swiper ('.swiper-container', {
            // 如果需要分页器
            pagination: {
                el: '.swiper-pagination',
                bulletClass : 'my-bullet',
                bulletActiveClass: 'my-bullet-active',
            },
            // 如果需要前进后退按钮
            navigation: {
                nextEl: '.swiper-button-next',
                prevEl: '.swiper-button-prev',
            },
            loop: true, // 循环模式选项
            autoplay: {
                delay: 2000,
            },
        });
    </script>
    </body>
    </html>
    
2.5 swiper-animation
  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>05-swiper-animation</title>
        <link rel="stylesheet" href="css/swiper.css">
        <link rel="stylesheet" href="css/swiper.animate.min.css">
        <script src="js/swiper.js"></script>
        <script src="js/swiper.animate1.0.3.min.js"></script>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            p{
                width: 200px;
                height: 200px;
                line-height: 200px;
                text-align: center;
                background: #f00;
                margin: 0 auto;
            }
            @keyframes myFadeIn {
                0% {
                    opacity: 0;
                    transform: scale(2);
                }
    
                100% {
                    opacity: 1;
                    transform: scale(0.5);
                }
            }
    
            .myFadeIn {
                -webkit-animation-name: myFadeIn;
                animation-name: myFadeIn
            }
        </style>
    </head>
    <body>
    <div class="swiper-container">
        <div class="swiper-wrapper">
            <div class="swiper-slide">
                <!--
                swiper-animate-effect:切换效果,例如 fadeInUp,可以自定义动画效果,如上边我们自定义的myfadein
                swiper-animate-duration:可选,动画持续时间(单位秒),例如 0.5s
                swiper-animate-delay:可选,动画延迟时间(单位秒),例如 0.3s
                -->
                <p class="ani" swiper-animate-effect="myFadeIn">内容</p>
            </div>
            <div class="swiper-slide">Slide 2</div>
            <div class="swiper-slide">Slide 3</div>
        </div>
    </div>
    <script>
        //引入swiper.animate.min.css
        //swiper.animate1.0.3.min.js
        var mySwiper = new Swiper ('.swiper-container', {
            on:{
                init: function(){
                    swiperAnimateCache(this); //隐藏动画元素 
                    swiperAnimate(this); //初始化完成开始动画
                },
                slideChangeTransitionEnd: function(){
                    swiperAnimate(this); //每个slide切换结束时也运行当前slide动画
                }
            }
        });
    </script>
    </body>
    </html>
    

相关文章

网友评论

      本文标题:js插件之iscroll,swiper0814

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