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 相关文章推荐
js对象关系图 方便dom操作
Mar 18 Javascript
node在两个div之间移动,用ztree实现
Mar 06 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
Jun 10 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
Jul 21 Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
AngularJS实现的自定义过滤器简单示例
Feb 02 Javascript
vue实现的网易云音乐在线播放和下载功能案例
Feb 18 Javascript
ES6 Object属性新的写法实例小结
Jun 25 Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 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实现验证码功能
2006/10/09 PHP
php模拟socket一次连接,多次发送数据的实现代码
2011/07/26 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
JS打开新窗口的2种方式
2013/04/18 Javascript
JsRender实用入门教程
2014/10/31 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
微信小程序进行微信支付的步骤昂述
2016/12/01 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
js实现点击展开隐藏效果(实例代码)
2018/09/28 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
python实现远程控制电脑
2019/05/23 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
python中numpy.empty()函数实例讲解
2021/02/05 Python
考试退步检讨书
2014/01/15 职场文书
中学生自我鉴定
2014/02/04 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
慰问信格式
2015/02/14 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL