拖动 HTML 元素,用 HammerJS 实现,在触摸设备上会抖动
Dragging HTML element , implemented with HammerJS , is jittery on touch device
我有一个包含 HTML 个元素的列表,这些元素是一张张堆叠在一起的卡片。我正在尝试使用 HammerJS
拖动带有 pan
事件的元素
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
事件在触摸设备上触发的有点晚 reason.I 我被这个问题困了好几天了,任何帮助解决问题的帮助都将不胜感激。
终于找到答案了。问题是样式在移动设备上非常慢。所以不得不在移动设备上做GPU加速。只需添加 translate3d(0,0,0)
即可引入 GPU 加速。
this.renderer.setStyle(elem,"transform",`translate3d(0, 0, 0) translate(${xtranslate}px,${ytranslate}px)`)
我有一个包含 HTML 个元素的列表,这些元素是一张张堆叠在一起的卡片。我正在尝试使用 HammerJS
pan
事件的元素
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
事件在触摸设备上触发的有点晚 reason.I 我被这个问题困了好几天了,任何帮助解决问题的帮助都将不胜感激。
终于找到答案了。问题是样式在移动设备上非常慢。所以不得不在移动设备上做GPU加速。只需添加 translate3d(0,0,0)
即可引入 GPU 加速。
this.renderer.setStyle(elem,"transform",`translate3d(0, 0, 0) translate(${xtranslate}px,${ytranslate}px)`)