使用HammerJS实现的拖动HTML元素在触摸设备上是紧张不安的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用HammerJS实现的拖动HTML元素在触摸设备上是紧张不安的相关的知识,希望对你有一定的参考价值。
我有一个html元素列表作为堆叠在一起的卡片。我试图用pan
用HammerJS
事件拖动元素
export class HomePage {
@ViewChildren('slides') slides;
@ViewChild('stack') stack;
constructor(
this.cards = [1,2,3,4,5]
}
ngAfterViewInit(){
let hammer = new Hammer.Manager(this.stack.nativeElement, { preventDefault: true,
recognizers: [ [ Hammer.Pan, { threshold: 2 }] ]
});
hammer.get('pan').set({ direction: window['Hammer'].DIRECTION_ALL });
this.element = this.slides.first.nativeElement;
hammer.on('panmove', (ev) => {
this.handlePan(ev);
});
}
handlePan(
let deltaX = ev.deltaX;
let deltaY = ev.deltaY;
this.renderer.setStyle(this.element, 'transform',`translate(${deltaX}px,${deltaY}px)`);
}
}
home.html的
<ion-content >
<div #stack class="stack">
<ion-card *ngFor = "let c of cards" #slides >
<ion-card-content>
c
</ion-card-content>
</ion-card>
</div>
</ion-content>
home.scss
ion-card{
position: absolute;
height: 400px;
}
这在浏览器中运行顺畅但在触摸设备上却很紧张。但是,如果我从css中删除position: absolute
,它也可以在触摸设备上顺利运行,但这些卡并不是相互堆叠的。我只是觉得panmove
事件由于某种原因在触摸设备上很晚才被触发。我在这个问题上坚持了几天,任何帮助找出问题都将受到赞赏。
答案
终于找到了答案。问题是移动设备上的样式很慢。因此必须在移动设备中进行GPU加速。只需添加translate3d(0,0,0)
即可实现GPU加速。
this.renderer.setStyle(elem,"transform",`translate3d(0, 0, 0) translate(${xtranslate}px,${ytranslate}px)`)
以上是关于使用HammerJS实现的拖动HTML元素在触摸设备上是紧张不安的的主要内容,如果未能解决你的问题,请参考以下文章