初次使用hammer.js做卡片滑动效果

 

项目新需求做卡片滑动的效果,因为大多数的一些js插件库是分开监听X和Y方向的,但是hammer.js是监听全方位,比较满足项目需求,所以初次尝试使用了下。大致如下:

具体的文档可以参考hammer.js官方文档:
http://hammerjs.github.io

我们主要使用了两个监听事件:

panmove

主要为了监听手指移动距离来移动上层图片以及下层图片放大的比例

panend

主要用来归位(实际项目后面是有逻辑请求之类的处理,本文只针对动画效果,所以后续的处理就因地制宜吧)

1、首先要先初始化新建实例:

var hammerImg = new Hammer(document.getElementById('imgGroup'));

另外由于我们是要上下左右全方位的监听,所以还要set下direction:

hammerImg.get('pan').set({ direction: Hammer.DIRECTION_ALL });

需要注意的是在某些文档上不建议这么设置全方位direction,说是会导致页面渲染卡顿,笔者试下来,感觉区别没那么大,也还好

2、监听手势滑动

hammerImg.on('panmove', function(ev) {
        console.log('监听pan', ev);
	console.log('监听方向移动', ev.direction);
	console.log('监听点击位置坐标', ev.center);
	console.log('监听滑动x轴坐标', ev.deltaX);
	console.log('监听滑动y轴坐标', ev.deltaY);
})

另外由于监听过程我们做了计算处理,为了动画流畅性考虑建议加上节流:

if (animationObj.timeStamp) {
    // 获取当前时间,算差值
	var now = new Date().getTime();
	var minus = now - animationObj.timeStamp
	if(minus < 40) { // 截流25帧
		return false;
	} else {
		// 没有记过时间则赋值记一下
		animationObj.timeStamp = new Date().getTime();
	}
}

其中后面两个图片的缩放比例就按照如下计算(移动距离之和除以屏幕1/4来取值):
 

var proportion = (positiveX + positiveY) / (commonW / 4) > 1 ? 1 : (positiveX + positiveY) / (commonW / 4);

由于后两张图片是按照最上方图片宽度0.9和0.8显示的,最上方图片宽300,则下两张的位移一个是60一个是30,随着图片的移动计算为:

var tmpProportion = 30 * proportion;
$('#imgGroup li.item2').css(cssTransform(30 - tmpProportion, 0, 100, 0.9 + 0.1 * proportion));
$('#imgGroup li.item3').css(cssTransform(60 - tmpProportion, 0, 100, 0.8 + 0.1 * proportion));

cssTransform方法即css封装好的方法:

cssTransform: function(dx, dy, time, scale) {
    return {
		'transform': 'scale(' + scale + ') translate(' + dx + 'px,' + dy + 'px)',
		'-webkit-transform': 'scale(' + scale + ') translate(' + dx + 'px,' + dy + 'px)',
		'-moz-transform': 'scale(' + scale + ') translate(' + dx + 'px,' + dy + 'px)',
		'-o-transform': 'scale(' + scale + ') translate(' + dx + 'px,' + dy + 'px)',
		'transition-duration': time + 'ms',
		'-webkit-transition-duration': time + 'ms',
		'-moz-transition-duration': time + 'ms',
		'-o-transition-duration': time + 'ms'
    }
}

3、监听手指移开

hammerImg.on('panmove', function(ev) {
    $('#imgGroup li.item1').css(animationObj.cssTransform(0, 0, 100, 1));
    $('#imgGroup li.item2').css(animationObj.cssTransform(30, 0, 100, 0.9));
    $('#imgGroup li.item3').css(animationObj.cssTransform(60, 0, 100, 0.8));
})

 

PS:写动画尽量用translate和scale,用left,right,padding,margin之类会导致动画卡顿,在手机上尤其明显,注意!注意!注意!

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue2中使用Hammer.js实现移动端div的拖拽、放大缩小和旋转可以按照以下步骤进行。 首先,在Vue项目中安装Hammer.js。 ``` npm install hammerjs ``` 然后,在需要使用拖拽、放大缩小和旋转功能的组件中引入Hammer.js,并初始化一个Hammer实例,将其绑定到要拖拽、放大缩小和旋转的div元素上。 ``` import Hammer from 'hammerjs' export default { mounted() { const element = this.$refs.element // 获取div元素的引用 const mc = new Hammer.Manager(element) // 初始化Hammer实例并将其绑定到div元素上 // 添加拖拽、放大缩小和旋转的手势识别 mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 })) mc.add(new Hammer.Pinch({ threshold: 0 })).recognizeWith(mc.get('pan')) mc.add(new Hammer.Rotate({ threshold: 0 })).recognizeWith(mc.get('pan')) // 初始化div元素的拖拽、放大缩小和旋转的初始状态值 let posX = 0 let posY = 0 let scale = 1 let lastScale = 1 let rotation = 0 // 监听拖拽事件 mc.on('pan', (e) => { // 实现拖拽 posX = e.deltaX posY = e.deltaY element.style.transform = `translate(${posX}px, ${posY}px) scale(${scale}) rotate(${rotation}deg)` }) // 监听放大缩小事件 mc.on('pinch', (e) => { // 实现放大缩小 scale = lastScale * e.scale element.style.transform = `translate(${posX}px, ${posY}px) scale(${scale}) rotate(${rotation}deg)` }) // 监听旋转事件 mc.on('rotate', (e) => { // 实现旋转 rotation = e.rotation element.style.transform = `translate(${posX}px, ${posY}px) scale(${scale}) rotate(${rotation}deg)` }) } } ``` 最后,在该组件的模板中添加一个div元素,并给其添加初始样式。 ``` <template> <div ref="element" style="width: 200px; height: 200px; background-color: red;"></div> </template> ``` 这样,当你在移动端上访问这个页面时,就可以拖拽、放大缩小和旋转这个div元素了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值