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


Posted in Javascript onApril 10, 2020

如今,移动端web页面在市场上也是占有相当大的比例,而移动端的轮播图效果也是很常见的,今天我就来记录下关于实现一组适用于移动端的可用手指进行拨动切换轮播图的效果。
这个效果的主要技术点依托于触屏设备特有的touch事件;好了,接下来就进入主题吧。

首先是html布局

1. 这里强调的是记得给html加上viewport这个适口属性。
2. 由于在拨动第一张图片以及最后一张图片的时候需要切换到最后一张以及第一张,要想达到理想效果,需要给第一张图片前面加上最后一张图片,而在最后一张图片后加上第一张图片。
3. f_l代表的是左浮动

**html代码如下:**

<ul class='banner_imgs clearfix'>
   <li class='f_l'>
   <a href="#"><img src="image/l8.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l1.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l2.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l3.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l4.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l5.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l6.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l7.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l8.jpg" alt="" /></a>
   </li>
   <li class='f_l'>
   <a href="#"><img src="image/l1.jpg" alt="" /></a>
   </li>
  </ul>
  <!-- 轮播图的 索引 -->
  <ul class="banner_index clearfix">
   <li class="current"></li>
   <li></li>
   <li></li>
   <li></li>
   <li></li>
   <li></li>
   <li></li>
   <li></li>
  </ul>

接下来是css样式

注意,此处并没有加上常规的reset样式代码

.jd_banner .banner_imgs {
 /* 10倍屏幕宽度 */
 width: 1000%;
}
.jd_banner .banner_imgs li {
 /* 一倍的屏幕宽度 */
 width: 10%;
}
.jd_banner .banner_imgs li a {
 display: block;
 width: 100%;
}
.jd_banner .banner_imgs li a img {
 display: block;
 width: 100%;
}
.jd_banner .banner_index {
 position: absolute;
 bottom: 15px;
 left: 50%;
 margin-left: -64px;
}
.jd_banner .banner_index li {
 float: left;
 width: 6px;
 height: 6px;
 border: 1px solid white;
 border-radius: 50%;
 margin: 0 5px;
}
.jd_banner .banner_index li.current {
 background-color: #fff;
}

最后是最最重要的js代码

1. transitionend 过渡结束后触发的效果,在这儿主要是保证图片切换到最后一张我们手动增加的图片完成的瞬间,切换回到真正的第一张图片处;
2. touch事件的三要素: touchstart--手指按上时,touchmove--手指移动时,touchend--手指松开屏幕时;
3. event.touches[0].clientX获取按下一个手指时的位置,可以打印出event查看其包含有哪些属性方法;

window.onload = function() {
 slide();
}

function slide() {
 var bannerImgs = document.querySelector(".banner_imgs");
 var Indexs = document.querySelectorAll(".banner_index li");
 var imgLis = document.querySelectorAll(".banner_imgs li");

 //屏幕宽度
 var screenWidth = document.body.offsetWidth;
 var index = 1;

 //默认显示的应该是第二张图片
 bannerImgs.style.transform = "translateX(" + screenWidth * index * -1 + "px)";

 //添加过渡效果
 function setTransition() {
 bannerImgs.style.webkitTransition = "all .2s";
 bannerImgs.style.transition = "all .2s";
 }

 //清除过渡效果
 function clearTransition() {
 bannerImgs.style.webkitTransition = "none";
 bannerImgs.style.transition = "none";
 }

 //设置移动距离
 function setTranslateX(distance) {
 bannerImgs.style.webkitTransform = "translateX(" + distance + "px)";
 bannerImgs.style.transform = "translateX(" + distance + "px)";
 }

 //控制小圆点
 function setPoint() {
 for (var i = 0; i < Indexs.length; i++) {
  Indexs[i].className = "";
 }
 Indexs[index - 1].className = "current";
 }

 //设置定时器
 var timer = setInterval(function() {
 index++;
 setTransition();
 setTranslateX(screenWidth * index * -1);
 }, 1000);

 //添加过渡动画结束事件
 bannerImgs.addEventListener("transitionend", function() {
 if (index > 8) {
  index = 1;
 } else if (index < 1) {
  index = 8;
 }
 clearTransition();
 setTranslateX(screenWidth * index * -1);
 setPoint();
 })


 //添加touch事件
 var startX = 0;
 var moveX = 0;
 var isMove = false;

 bannerImgs.addEventListener("touchstart", function(event) {
 isMove = false;
 clearInterval(timer);
 startX = event.touches[0].clientX;
 })

 bannerImgs.addEventListener("touchmove", function(event) {
 isMove = true;
 moveX = event.touches[0].clientX - startX;
 setTranslateX(moveX + index * screenWidth * -1);
 })

 bannerImgs.addEventListener("touchend", function(event) {
 if(isMove && Math.abs(moveX) > screenWidth/3){
  if (moveX < 0) {
  index++;
  } else if (moveX > 0) {
  index--;
  }
 }
 setTransition();
 setTranslateX(index * screenWidth * -1);
 timer = setInterval(function() {
  index++;
  setTransition();
  setTranslateX(screenWidth * index * -1);
 }, 1000);
 })
}

精彩专题分享:jQuery图片轮播 JavaScript图片轮播 Bootstrap图片轮播

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

Javascript 相关文章推荐
CSS和Javascript简单复习资料
Jun 29 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
Jan 09 Javascript
JSONP跨域的原理解析及其实现介绍
Mar 22 Javascript
jQuery中[attribute!=value]选择器用法实例
Dec 31 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
深入理解JavaScript编程中的同步与异步机制
Jun 24 Javascript
JS实现自动切换文字的导航效果代码
Aug 27 Javascript
Angularjs中UI Router的使用方法
May 14 Javascript
Angular2 之 路由与导航详细介绍
May 26 Javascript
在微信小程序中使用图表的方法示例
Apr 25 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
Dec 12 #Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 #Javascript
基于BootstrapValidator的Form表单验证(24)
Dec 12 #Javascript
Sequelize中用group by进行分组聚合查询
Dec 12 #Javascript
js原生之焦点图转换加定时器实例
Dec 12 #Javascript
IntersectionObserver API 详解篇
Dec 11 #Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 #Javascript
You might like
php在线打包程序源码
2008/07/27 PHP
php表单转换textarea换行符的方法
2010/09/10 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
Google Suggest ;-) 基于js的动态下拉菜单
2006/10/11 Javascript
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
Javascript 构造函数,公有,私有特权和静态成员定义方法
2009/11/30 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
Jquery attr(&quot;checked&quot;) 返回checked或undefined 获取选中失效
2013/10/10 Javascript
深入理解javascript严格模式(Strict Mode)
2014/11/28 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
JavaScript代码异常监控实现过程详解
2020/02/17 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python with语句上下文管理器两种实现方法分析
2018/02/09 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
家居饰品店创业计划书
2014/01/31 职场文书
班训口号大全
2014/06/18 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
新人入职感言
2015/07/31 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
学习党章心得体会2016
2016/01/15 职场文书
话题作文之诚信
2019/11/28 职场文书
 Python 中 logging 模块使用详情
2022/03/03 Python