如何用HammerJS实现拖动HTML元素?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (363)

我有一个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;
  }

这在浏览器中运行得很顺利,但在触控设备上却很紧张。但如果我把position: absolute从CSS,它工作平稳的触摸设备以及,但卡不是堆叠在一起的。我只是觉得panmove事件在触摸设备上触发的时间不多。

提问于
用户回答回答于

问题是,在移动设备上,造型设计相当缓慢。所以必须使GPU加速移动设备。简单地添加translate3d(0,0,0)这会使GPU加速。

this.renderer.setStyle(elem,"transform",`translate3d(0, 0, 0) translate(${xtranslate}px,${ytranslate}px)`)

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励