js实现移动端轮播图滑动切换

本文实例为大家分享了js实现移动端轮播图滑动切换的具体代码,供大家参考,具体内容如下

移动端手势

轮播图分析

1、自动轮播且无缝 [定时器、过渡动画]
2、分页器要随着图片的轮播而改变 [根据索引切换]
3、滑动效果 [touch事件]
4、图片随着分页器变化
5、滑动结束的时候,如果滑动的距离不超过屏幕的1/3,就恢复回去 [过渡]
6、滑动结束的时候,如果滑动的距离超过屏幕的1/3,就切换 [滑动方向 + 过渡]]

html页面结构

<!--轮播图-->
  <div class="jd_banner">
   <ul class="clearfix">
    <li><a href="#" ><img src="images/l8.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l1.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l2.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l3.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l4.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l5.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l6.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l7.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l8.jpg" alt=""></a></li>
    <li><a href="#" ><img src="images/l1.jpg" alt=""></a></li>
   </ul>
   <ul class="clearfix">
    <li class="now"></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
   </ul>
</div>

js部分

/* 动态设置过渡 */
var addTransition = function (ele) {
 ele.style.transition = "all .6s";
 ele.style.webkitTransition = "all .6s";
};
/* 移除过渡效果 */
var removeTransition = function (ele) {
 ele.style.transition = "none";
 ele.style.webkitTransition = "none";
};
/* 设置容器平移 -- 也就是滑动动画
 ele:当前元素
 xwidth:平移的距离
*/
var setTranslateX = function (ele, xwidth) {
 ele.style.transform = "translateX(" + xwidth + "px)";
 ele.style.webkitTransform = "translateX(" + xwidth + "px)";
}
var banner = function () {
 /** 轮播图分析 */
 /** 1 自动轮播且无缝 [定时器、过渡动画]
  * 2 点要随着图片的轮播而改变 [根据索引切换]
  * 3 滑动效果 [touch事件]
  * 4 图片随着点而变化
  * 5 滑动结束的时候,如果滑动的距离不超过屏幕的1/3,就恢复回去 [过渡]
  * 6 滑动结束的时候,如果滑动的距离超过屏幕的1/3,就切换 [滑动方向 + 过渡]]
  */
 var timer = ''
 /* 封装定时器函数 */
 var startInterval = function () {
  timer = setInterval(function () {
   index++;// 基于索引 做位移
   addTransition(imgBox); // 为轮播图片组的ul设置过渡函数
   setTranslateX(imgBox, -index * width);// 根据当前索引值计算平移的距离
  }, 2000);
 }
 var banner = document.querySelector(".jd_banner");
 var width = banner.offsetWidth; // 屏幕的宽度
 var imgBox = banner.querySelector("ul:first-child"); // 轮播图片ul
 var length = imgBox.querySelectorAll("li").length; // 图片的个数
 var pointBox = banner.querySelector("ul:last-child");// 分页器ul
 var points = pointBox.querySelectorAll("li");// 分页器集合

 var index = 1; // 初始化索引,由于要无缝衔接,索引从1开始
 startInterval();

 /* transitionend事件:当元素过渡动画结束后执行
 每次轮播动画结束后,判断当前索引值
 */
 imgBox.addEventListener("transitionend", function () {
  if (index >= length - 1) {
   index = 1;
   // 清过渡,瞬间定位imgBox
   removeTransition(imgBox);
   setTranslateX(imgBox, -index * width);
  }
  // 滑动的时候也需要无缝
  else if (index <= 0) {
   index = 8;
   removeTransition(imgBox);
   setTranslateX(imgBox, -index * width);
  }
  showPoint(index - 1); // 改变分页器状态
 });

 var showPoint = function (index) {
  for (var i = 0; i < points.length; i++) {
   points[i].className = '';
  }
  points[index].className = "now";
 };
 /* 滑动切换 (touch事件) */
 var startX = 0; // 触摸起始点
 imgBox.addEventListener("touchstart", function (e) {
  // 记录起始位置的X坐标
  clearInterval(timer);
  startX = e.touches[0].clientX;
 });
 var distanceX = 0;
 var translateX = 0;
 // **** 加一个标识,判断用户有没有滑动
 var isMove = false
 imgBox.addEventListener("touchmove", function (e) {
  var moveX = e.touches[0].clientX;
  // 计算位移,有正负方向
  distanceX = moveX - startX;
  // 计算目标元素的位移
  // 元素将要的定位 = 当前定位 + 手指移动的距离
  translateX = -index * width + distanceX;
  // ********** 要想图片实时地跟着手指走,一定要把过渡清楚掉
  removeTransition(imgBox)
  setTranslateX(imgBox, translateX);
  isMove = true;// 确定用户有滑动
  e.preventDefault(); // 去除移动端浏览器默认的滑动事件
 });

 imgBox.addEventListener("touchend", function (e) {
  if (isMove) {
   if (Math.abs(distanceX) > width / 3) {
    // 切换
    if (distanceX > 0) {
     // 上一张
     index = index - 1;
    } else {
     // 下一张
     index = index + 1;
    }
    addTransition(imgBox); // 设置过渡动画
    setTranslateX(imgBox, -index * width);
    if (index >= 9) {
     index = 1;
    }
    if (index <= 0) {
     index = 8;
    }
    showPoint(index - 1);

   } else {
    // 不满足滑动条件,回退到之前的状态
    addTransition(imgBox);
    setTranslateX(imgBox, -index * width);
    showPoint(index - 1);
   }
  }
  // **** 最好做一次参数的重置
  startX = 0;
  distanceX = 0;
  isMove = false;
  // ****** 为了严谨,再清一次定时器
  clearInterval(timer)
  // 加上定时器
  startInterval();
 });
};

总结

原生js实现滑动切换的原理主要还是利用移动端的手势事件

  • touchstart 当手指触摸屏幕时触发
  • touchmove 当手指在屏幕中滑动的时候触发
  • touchend 当手指离开屏幕时触发

利用touch相关事件实现移动端常见滑动效果和移动端常见的手势事件。

而swiper插件的底层实现原理也是这个,因此,为了快速开发,还是使用swiper插件最好

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 利用纯js + transition动画实现移动端web轮播图详解

    前言 在上一篇文章中,我们使用 tween算法实现了 ease-out移动效果, 其实更简洁的方法是使用 css3的 transition动画,下面话不多说了,来一起看看详细的介绍吧. 核心点: 在 我们通过代码来移动一段距离的时候, 使用 transion动画;在手指移动的时候,不使用transition动画. 使用 transition实现的动画效果的轮播图js代码不足100行 ~function () { var lastPX = 0; // 上一次触摸的位置x坐标, 需要计算出手指每次移

  • js实现移动端轮播图效果

    本文实例为大家分享了移动端轮播图效果展示的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, max

  • 支持移动端原生js轮播图

    直接上代码,自行复制粘贴,本人是新手,欢迎指正. <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title>轮播图</title> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-sca

  • JS实现点击拉拽轮播图pc端移动端适配

    <div class="content"> <button class="left">left</button> <button class="right">right</button> <div class="index"></div> <div class="lists"> <!--<!–widt

  • js原生实现移动端手指滑动轮播图效果的示例

    如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0

  • JS仿京东移动端手指拨动切换轮播图效果

    如今,移动端web页面在市场上也是占有相当大的比例,而移动端的轮播图效果也是很常见的,今天我就来记录下关于实现一组适用于移动端的可用手指进行拨动切换轮播图的效果. 这个效果的主要技术点依托于触屏设备特有的touch事件:好了,接下来就进入主题吧. 首先是html布局: 1. 这里强调的是记得给html加上viewport这个适口属性. 2. 由于在拨动第一张图片以及最后一张图片的时候需要切换到最后一张以及第一张,要想达到理想效果,需要给第一张图片前面加上最后一张图片,而在最后一张图片后加上第一张

  • 原生js实现移动端Touch轮播图的方法步骤

    Touch 轮播图 touch轮播图其实就是通过手指的滑动,来左右切换轮播图,下面我们通过一个案例,来实现下. 1. html 结构 结构上,还是用ul.li来存放轮播图片,ol.li来存放轮播小圆点: 2. 样式初始化 html的一些标签,都会有一些默认样式,比如body标签默认是有一个边距的,为了不影响美观,我们需要清除掉. /* 清除标签默认边距 */ body,ul,li,ol,img { margin: 0; padding: 0; } /* 清除 ul 等标签前面的"小圆点"

  • javascript实现移动端轮播图

    本文实例为大家分享了js实现移动端轮播图的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>

  • js实现移动端轮播图

    本文实例为大家分享了js实现移动端轮播图的具体代码,供大家参考,具体内容如下 这是结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no initial-scale=1.0&

  • 基于javascript实现移动端轮播图效果

    本文实例为大家分享了js实现移动端轮播图效果的具体代码,供大家参考,具体内容如下 插件使用: 1.zepto.js 2.touch.js 实现效果 html部分: <!-- 结构 --> <!-- li*6>a[href=#]>img[src=./images/$.jpg] --> <div class="box"> <ul> <!-- 为了无缝连接,我们在图片这里前后增加了2个图片 --> <li>

随机推荐