zoukankan      html  css  js  c++  java
  • 移动端横向滑屏之轮播图

    图片描述

    移动端的轮播图可以有很多方式实现,最常见的可以使用定位 + 手指事件。但是我这里介绍的是 CSS3 中的 2d 变换和手指事件,因为变换属性的代码更加简洁优雅

    一. 移动端的准备工作

    * {
        padding: 0;
        margin: 0;
    }
    img {
        display: block;
    }
    li {
        list-style: none;
    }
    input {
        outline: none;
    }
    a {
      text-decoration: none;
      -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
    }
    html,body {
        height: 100%;
        overflow: hidden;
    }

    CSS 中的初始化

           // 阻止浏览器的默认行为
            document.addEventListener("touchstart", function(event) {
                event.preventDefault()
            });
            
            // rem 适配
            (function() {
                var styleNode = document.createElement("style")
                var width = document.documentElement.clientWidth
                styleNode.innerHTML = 'html {font-size: '+ width/16 +'px;}'
                document.head.appendChild(styleNode)
            })();
            
            // 点透
            (function() {
                var aNodes = document.querySelectorAll("a")
                for (var i = 0; i < aNodes.length; i++) {
                    aNodes[i].addEventListener("touchstart", function() {
                        window.location.href = this.href
                    })
                }
            })();

    这里移动端写页面之前跟 PC 端有些不同,设计师给我们的像素值可能与移动设备不匹配,首先要进行rem 适配,还有阻止浏览器的默认行为,通常情况下,还有处理点透。

    二. 基本手指事件

            <!--模拟频幕区域-->
            <section class="wrap">
                <ul class="list">
                    <li>
                        <img src="img/1.jpg" alt="" />
                    </li>
                    <li>
                        <img src="img/2.jpg" alt="" />
                    </li>
                    <li>
                        <img src="img/3.jpg" alt="" />
                    </li>
                    <li>
                        <img src="img/4.jpg" alt="" />
                    </li>
                    <li>
                        <img src="img/5.jpg" alt="" />
                    </li>
                </ul>
            </section>
    
    
            var list = document.querySelector(".list")
            var li = document
            list.innerHTML += list.innerHTML
            
            var startX = 0
            var eleX = 0
            var translateX = 0
            var now = 0
            list.addEventListener("touchstart", function(event) {
                
                list.style.transition = 'none'
                if (now == 0){
                    now = 5
                } else if (now == 9) {
                    now = 4
                }
                transformCss(list,"translateX",-now*document.documentElement.clientWidth)
                var touch = event.changedTouches[0]
                startX = touch.clientX
                eleX = transformCss(list, "translateX")
            })
            
            list.addEventListener("touchmove", function(event) {
                var touch = event.changedTouches[0]
                var endX = touch.clientX
                var disX = endX - startX
                translateX = disX + eleX
                
                // 清除过渡
                list.style.transition = 'none'
                list.style.transform = transformCss(list,'translateX',translateX)
            })
            
            list.addEventListener("touchend", function() {
                
                var left = transformCss(list, 'translateX')
                now = Math.round(-left / document.documentElement.clientWidth)
                
                translateX = -now * document.documentElement.clientWidth
                list.style.transition = '0.5s'
                transformCss(list,'translateX',translateX)
            })

    这里设计的无缝轮播很巧妙,把图片的 li 标签复制了一份,也就是总共 10 张图,当滑到 1 图时,我们在点击后迅速切到第 6 张,当滑到最后一张图时,切换到第 5 张。

    clipboard.png

    三. 自动轮播 + 小圆点逻辑

        var autoSlide = function() {
            setInterval(function() {
                if(now == 9) {
                    now = 4
                }
                list.style.transition = 'none'
                transformCss(list, 'translateX', -now * document.documentElement.clientWidth)
    
                // 设置一个延时,让过渡生效
                setTimeout(function() {
                    now++
                    list.style.transition = '0.5s'
                    transformCss(list, 'translateX', -now * document.documentElement.clientWidth)
                    for(var i = 0; i < spans.length; i++) {
                        spans[i].classList.remove("active")
                    }
                    spans[now % 5].classList.add("active")
                }, 20)
    
            }, 1000)
        }

    这里自动轮播有几个逻辑

    • 轮播的同时,小圆点跟着动,排他思想,先移走所有小圆点的类名,再单独添加
    • 轮播到 10 张时,快速切换到第 5 张图,由于所有的滑动都是采用过渡,快速切换采用的清除过渡,所以要设置一个短暂的延时,让清除过渡不被覆盖。

    clipboard.png

    四. 手指移入移出开关定时器

  • 相关阅读:
    [转]Linux里的2>&1究竟是什么
    一段shell脚本分析
    [整理]Linux Crontab命令总结
    random seed()函数
    clear命令新认识
    泛型与发射初探,获取当前代码所在的行
    tomcat集群(转)
    查看本地电脑的端口及对应的使用程序
    信息摘要算法小试牛刀
    Linux非root用户安装jdk和tomcat(转)
  • 原文地址:https://www.cnblogs.com/twodog/p/12135538.html
Copyright © 2011-2022 走看看