基于微积分算法的手势库eTouch
eTouch是一个移动端无依赖js手势库
众所周知,原生js的touch事件不能很好的识别移动端手势,在日常开发中往往依赖hammer,或者使用zepto、vue等框架的touch插件。
但即便小如hammer,很多手势日常中也不必使用。想要自己造个轮子、或者是更小的手势库?不妨看看MeCKodo巨巨的eTouch。
eTouch源码不到250行,使用微积分算法识别手势路径,应用于最常见的点击、上下左右滑动。
demo
eTouch使用
事件代理的方式:
<body>
<div id="pox">
<ul>
<li>Lorem ipsum dolor sit amet.1</li>
<li>Lorem ipsum dolor sit amet.2</li>
<li>Lorem ipsum dolor sit amet.3</li>
</ul>
</div>
<script type="text/javascript">
//事件代理 !!!!!第一个参数仅支持id!!!!!!
//支持复杂选择器代理
etouch('#pox','ul li',function(e,touch) {
// e为事件对象,touch为触摸返回对象
e.clock = true; //给div加锁,完全阻止默认事件
alert(this.innerHTML);
console.log('点击(tap)');
}).on('swiper',function(e,touch) {
console.log('实时获取滑动(swiper)');
}).on('up',function(e,touch) {
console.log('上滑回调');
}).on('down',function(e,touch) {
console.log('下滑回调');
}).on('left',function(e,touch) {
console.log('左滑回调');
}).on('right',function(e,touch) {
console.log('右滑回调');
});
</script>
</body>
批量绑定的方式:
<body>
<div id="pox">
<ul>
<li>Lorem ipsum dolor sit amet.1</li>
<li>Lorem ipsum dolor sit amet.2</li>
<li>Lorem ipsum dolor sit amet.3</li>
</ul>
</div>
<script>
// 直接事件批量绑定
etouch('li', function(e,touch) {
console.log(this,e,touch);
}).on('left',function() {})
// e为事件对象,touch为触摸返回对象
</script>
</body>
注意事项:
- 支持AMD和CMD加载
e.clock = true
给div加锁,会调用e.preventDefault()
阻止默认事件- 事件代理第一个参数仅支持id作为参数
源码分析
eTouch将一个触摸状态抽象成了 eTouch.touchObj
,包含7个属性:status,pageX,pageY,clientX,clientY,distanceX,distanceY
。
status描述触控类型:swiper滑动中、tap轻触、up、right、down、left。
实际用于计算distance的是pageX/Y,即触发点相对文档区域左上角距离(clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变)。
在处理swiper滑动事件中使用了微积分公式,适时调用 e.preventDefault()
,避免移动中的手势调用移动端浏览器的一些默认行为(如页面后退、滑动)。
当触摸时间小于150ms或触摸位移小于2px时,设status为tap轻触事件,返回触发的dom。
复杂选择器实现使用的是querySelector和遍历。
项目中的应用
demo里左右滑动的距离使用了eTouch的返回对象touch,计算 touch.distanceX
来得到css效果需要的像素值。