zoukankan      html  css  js  c++  java
  • 移动端轮播图

    1. 移动端常见特效

    1.1 案例: 移动轮播图

    移动端轮播图功能和基本PC端一致。

    1. 可以自动播放图片

    2. 手指可以拖动播放轮播图

    1.2. 案例分析:

    1. 自动播放功能

    2. 开启定时器

    3. 移动端移动,可以使用translate 移动

    4. 想要图片优雅的移动,请添加过渡效果

    // 1. 获取元素
      var focus = document.querySelector(".focus");
      var ul = focus.children[0];
      var w = focus.offsetWidth;
      var ol = focus.querySelector("ol");
      var index = 0;
      var times = setInterval(function () {
        index++;
        translatex = -index * w;
        ul.style.transition = "all .3s";
        ul.style.transform = "translateX(" + translatex + "px)";
      }, 2000);
    1. 自动播放功能-无缝滚动

    2. 注意,我们判断条件是要等到图片滚动完毕再去判断,就是过渡完成后判断

    3. 此时需要添加检测过渡完成事件  transitionend 

    4. 判断条件:如果索引号等于 3 说明走到最后一张图片,此时 索引号要复原为 0

    5. 此时图片,去掉过渡效果,然后移动

    6. 如果索引号小于0, 说明是倒着走, 索引号等于2

    7. 此时图片,去掉过渡效果,然后移动

    // 2. 等我们过渡完成之后,再去判断 监听过渡完成的事件 transitionend
      ul.addEventListener("transitionend", function () {
        // 无缝滚动
        if (index >= 3) {
          index = 0;
          //   console.log(index);
          // 去掉过渡效果 这样让我们的ul 快速的跳到目标位置
          ul.style.transition = "none";
          // 利用最新的索引号乘以宽度 去滚动图片
          var translatex = -index * w;
          ul.style.transform = "translateX(" + translatex + "px)";
        } else if (index < 0) {
          index = 2;
          ul.style.transition = "none";
          // 利用最新的索引号乘以宽度 去滚动图片
          var translatex = -index * w;
          ul.style.transform = "translateX(" + translatex + "px)";
        }

    1.3 classList 属性

    classList属性是HTML5新增的一个属性,返回元素的类名。但是ie10以上版本支持。

    该属性用于在元素中添加,移除及切换 CSS 类。有以下方法

    添加类:

     element.classList.add(’类名’);

    focus.classList.add('current');

    移除类:

    element.classList.remove(’类名’);


    focus.classList.remove('current');

    切换类:

    element.classList.toggle(’类名’);


    focus.classList.toggle('current');

    注意:以上方法里面,所有类名都不带点

    1.4. 案例分析

    1. 小圆点跟随变化效果

    2. 把ol里面li带有current类名的选出来去掉类名 remove

    3. 让当前索引号的小li 加上 current   add

    4. 但是,是等着过渡结束之后变化,所以这个写到 transitionend 事件里面

    // 3. 小圆点跟随变化
        // 把ol里面的li带有current类名的选出来去掉类名 remove
        ol.querySelector(".current").classList.remove("current");
        // 让当前索引号的小li加上current add
        ol.children[index].classList.add("current");
      });
    1. 手指滑动轮播图

    2. 本质就是ul跟随手指移动,简单说就是移动端拖动元素

    3. 触摸元素touchstart:  获取手指初始坐标

    4. 移动手指touchmove:  计算手指的滑动距离,并且移动盒子

    5. 离开手指touchend:   根据滑动的距离分不同的情况

    6. 如果移动距离小于某个像素  就回弹原来位置

    7. 如果移动距离大于某个像素就上一张下一张滑动。

    8. 滑动也分为左滑动和右滑动判断的标准是 移动距离正负 如果是负值就是左滑 反之右滑

    9. 如果是左滑就播放下一张 (index++)

    10. 如果是右滑就播放上一张  (index--)

    // 4. 手指滑动轮播图
      // 触摸元素 touchstart: 获取手指初始坐标
      var startX = 0;
      var moveX = 0; // 后面我们会使用这个移动距离所以要定义一个全局变量
      var flag = false; // 如果用户手指移动过我们再去判断否则不做判断效果
      ul.addEventListener("touchstart", function (e) {
        // 计算移动距离
        startX = e.targetTouches[0].pageX;
        // 手指触摸的时候
        clearInterval(times);
      });
      // 移动手指 touchmove: 计算手指的滑动距离,并且移动盒子
      ul.addEventListener("touchmove", function (e) {
        // 计算移动距离
        moveX = e.targetTouches[0].pageX - startX;
        // 移动盒子:盒子原来的位置 + 手指移动的距离
        var translatex = -index * w + moveX;
        // 手指拖动的时候,不需要动画效果所以要取消过渡效果
        ul.style.transition = "none";
        ul.style.transform = "translateX(" + translatex + "px)";
        flag = true;
        e.preventDefault(); // 阻止滚动屏幕的行为
      });
    // 手指离开 根据移动距离去判断是回弹还是播放上一张下一张
      ul.addEventListener("touchend", function () {
        if (flag) {
          // (1) 如果移动距离大于50像素我们就播放上一张或者下一张
          if (Math.abs(moveX) > 50) {
            // Math.abs 绝对值
            // 如果是右滑就是播放上一张 moveX 是正值
            if (moveX > 0) {
              index--;
            } else {
              // 如果是左滑就是播放下一张 moveX 是负值
              index++;
            }
            var translatex = -index * w;
            ul.style.transition = "all .3s";
            ul.style.transform = "translateX(" + translatex + "px)";
          }
    // (2) 如果移动距离小于50像素我们就回弹
          var translatex = -index * w;
          ul.style.transition = "all .1s";
          ul.style.transform = "translateX(" + translatex + "px)";
        }
        // 手指离开的时候就重新开启定时器
        clearInterval(times);
        times = setInterval(function () {
          index++;
          translatex = -index * w;
          ul.style.transition = "all .3s";
          ul.style.transform = "translateX(" + translatex + "px)";
        }, 2000);
      });
      // 返回顶部模块制作
      var goBack = document.querySelector(".goBack");
      var nav = document.querySelector("nav");
      window.addEventListener("scroll", function () {
        if (window.pageYOffset >= nav.offsetTop) {
          goBack.style.display = "block";
        } else {
          goBack.style.display = "none";
        }
        goBack.addEventListener("click", function () {
          window.scroll(0, 0);
        });
      });
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/bky-/p/13771956.html
Copyright © 2011-2022 走看看