JS组件库AlloyTouch实现图片轮播过程解析


Posted in Javascript onMay 29, 2020

轮播图也涉及到触摸和触摸反馈,同时,AlloyTouch可以把惯性运动打开或者关闭,并且设置min和max为运动区域,超出会自动回弹。

除了一般的竖向滚动,AlloyTouch也可以支持横向滚动,甚至任何属性的运动,因为它的设计的本质就是属性无关,触摸可以反馈到任何属性的运动。所以AlloyTouch制作各种各样的轮播组件还是得心应手。

JS组件库AlloyTouch实现图片轮播过程解析

第一种轮播图如上图所示。下面开始实现的过程。

第0秒

<div id="carousel-container">
 <div class="carousel">
  <div class="carousel-scroller" id="carousel-scroller">
   <img style="width: 88%;" src="asset/ci1.jpg">
   <img style="width: 88%;" src="asset/ci2.jpg">
   <img style="width: 88%;" src="asset/ci3.jpg">
   <img style="width: 88%;" src="asset/ci4.jpg">
   <img style="width: 88%;" src="asset/ci5.jpg">
  </div>

 </div>
</div>

一共五张图,每张图占有屏幕比例的百分之88,所以用户的屏幕里可以看到一张多一点的图片,给用户可以横向滑动查看的感觉。

第10秒

<script src="../transformjs/transform.js"></script>
<script src="../alloy_touch.js"></script>
<script>
 var scroller = document.querySelector("#carousel-scroller");
 Transform(scroller); 
</script>

通过Transform(scroller); 注入CSS3 transform属性。

第20秒

new AlloyTouch({
 touch: "#carousel-container",//反馈触摸的dom
 vertical: false,// 监听用户横向触摸
 target: scroller, //运动的对象
 property: "translateX", //被运动的属性
 min:0.88 * window.innerWidth * -5 + window.innerWidth, 
 max: 0
})

这里最大的难点(其实也没有什么难的),就是就是min的值。因为初始值是0,所有向左边滑动一定是负值。可以得到max一定是0。

那么min的值就是: 屏幕的宽度-图片的张数*图片的宽度

  • 图片的宽度为0.88 * window.innerWidth
  • 屏幕的宽度为window.innerWidth
  • 图片的张数为 5

JS组件库AlloyTouch实现图片轮播过程解析

第30秒

如上图所示,相对于传统的swipe然后再去触发滚动,上面的跟手然后再去校正的体验是更加良好的。那么怎么实现呢?
首先,AlloyTouch是支持step配置。

new AlloyTouch({
step: 100,
...
...
...
})

只要用户设置的step,最后运动结束之后,AlloyTouch都会帮用户校正到最接近的step的整数倍的位置。

比如上面是100:

  • 如果运动的对象停在 120,会被校正到100
  • 如果运动的对象停在 151,会被校正到200
  • 如果运动的对象停在 281,会被校正到300
  • 如果运动的对象停在 21,会被校正到0

第40秒

当然这有个问题,比如用户从0滑倒30,其实他是想去100,但是会被校正到0!!!

所以光使用校正是不够。还需要一个API去阻止校正自己去注入逻辑滚动相应的位置。所以你必须支持AlloyTouch的:

to 方法

to(v [, time, easing])

其中time和easing不是必须。time的默认值是600.

第50秒

var items = document.querySelectorAll("#nav a");
var scroller = document.querySelector("#carousel-scroller");
Transform(scroller);
new AlloyTouch({
 touch: "#carousel-container",//反馈触摸的dom
 vertical: false,//不必需,默认是true代表监听竖直方向touch
 target: scroller, //运动的对象
 property: "translateX", //被运动的属性
 min: window.innerWidth * -3, //不必需,运动属性的最小值
 max: 0, //不必需,滚动属性的最大值
 step: window.innerWidth,
 inertia: false, //不必需,是否有惯性。默认是true
 touchEnd: function (evt, v, index) {

  var step_v = index * this.step * -1;
  var dx = v - step_v;

  if (v < this.min) {
   this.to(this.min);
  } else if (v > this.max) {
   this.to(this.max);
  } else if (Math.abs(dx) < 30) {
   this.to(step_v);
  }
  else if (dx > 0) {
   this.to(step_v + this.step);
  } else {
   this.to(step_v - this.step);
  }

  return false;
 },
 animationEnd: function (evt , v) {
  var i = 0,
   len = items.length;
  for (; i < len; i++) {
   if (i === this.currentPage) {
    items[i].classList.add("active");
   } else {
    items[i].classList.remove("active");
   }
  }

 }
})

因为一共四张图,所以
min得到的结果是 window.innerWidth * -3
max的值依然是0
step的值是 window.innerWidth
通过设置 inertia: false,把惯性运动关掉
注意看touchEnd里面的return false是为了不去计算手指离开屏幕后的校正位置、惯性运动等逻辑。
touchEnd可以拿到当前的位置v以及当前所处的位置index。
animationEnd是运动结束后的回调,用来设置nav的active。当然不是所有浏览器都支持classList,这里只是为了演示代码足够简洁。
再注意,在touchEnd和animationEnd中能拿到this,也就是AlloyTouch当前对象的实例。其中,
to方法用来运动当前对象
step是当前的步长
还可以拿到currentPage去获取当前所处的页码
还能拿到min和max值,得到运动的区间。

最后

所有例子演示和代码可以在Github上找到。

Github:https://github.com/AlloyTeam/AlloyTouch

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

Javascript 相关文章推荐
判断多个input type=file是否有已经选择好文件的代码
May 23 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
Jul 29 Javascript
EasyUI中combobox默认值注意事项
Mar 01 Javascript
jQuery仿京东商城楼梯式导航定位菜单
Jul 25 Javascript
JavaScript 详解预编译原理
Jan 22 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
Mar 15 Javascript
vue组件父子间通信之综合练习(聊天室)
Nov 07 Javascript
vue template中slot-scope/scope的使用方法
Sep 06 Javascript
react 应用多入口配置及实践总结
Oct 17 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
Mar 10 Javascript
Vue中正确使用Element-UI组件的方法实例
Oct 13 Javascript
基于vue实现探探滑动组件功能
May 29 #Javascript
JS实现前端路由功能示例【原生路由】
May 29 #Javascript
JavaScript如何实现图片处理与合成
May 29 #Javascript
jQuery+css实现的点击图片放大缩小预览功能示例【图片预览 查看大图】
May 29 #jQuery
JavaScript基于用户照片姓名生成海报
May 29 #Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
May 29 #Javascript
JavaScript设计模式之策略模式实现原理详解
May 29 #Javascript
You might like
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
JavaScript定义函数_动力节点Java学院整理
2017/06/27 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
python加载自定义词典实例
2019/12/06 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
考博自荐信
2013/10/25 职场文书
运动会通讯稿300字
2014/02/02 职场文书
财务支持类个人的自我评价
2014/02/14 职场文书
高三家长寄语
2014/04/03 职场文书
中学生操行评语
2014/04/24 职场文书
房屋租赁协议书(标准版)
2014/10/02 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
商务邀请函
2015/01/30 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
教师节班会开场白
2015/06/01 职场文书
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android
table不让td文字溢出操作方法
2022/12/24 HTML / CSS