繁体   English   中英

HammerJs:通过水平滑动启用垂直滚动

[英]HammerJs: enable vertical scroll with horizontal swipe

我有一个 angular 7 网站,我想将水平滑动添加到一个组件,并将垂直滑动添加到另一个(组件在同一模块中)。 我为此使用了hammerjs。

默认情况下,hammerjs 禁用垂直滑动,所以我使用下面的代码启用了所有方向的滑动。

export class MyHammerConfig extends HammerGestureConfig
{
  overrides = <any>{
    swipe: {direction: Hammer.DIRECTION_ALL},
  };
}

//declare provider in AppModule
providers: [
    {
      provide: HAMMER_GESTURE_CONFIG,
      useClass: MyHammerConfig
    }
]

问题是垂直滚动在水平滑动的组件上不起作用。 从我读过的内容来看,解决方案是在组件中添加touch-action: pan-y水平滑动。

但是,这适用于 chrome,但 safari 无法识别touch-action属性。

我的想法是在组件级别为HAMMER_GESTURE_CONFIG声明多个提供程序:

  • 在具有水平滑动的组件上,使用仅允许水平滑动的提供程序
  • 在另一个,只启用垂直滑动

但是,组件级提供程序似乎没有考虑我的提供程序。

这是我试图用来仅启用水平滑动的一些代码

export class HorizontalHammerConfig extends HammerGestureConfig
{
  overrides = <any>{
    swipe: {Hammer.DIRECTION_HORIZONTAL},
    pinch: {enable: false},
    rotate: {enable: false}
  };
}

//Component declaration
@Component({
  ...

  providers:[
    {
      provide: HAMMER_GESTURE_CONFIG,
      useClass: HorizontalHammerConfig
    }],

任何的想法?

编辑:这是一个演示该问题的stackblitz 示例 组件级提供程序被忽略。

我在那里找到了解决方案。

基本上,自定义配置必须覆盖buildHammer类,因此可以根据上下文使用不同的hammerjs 选项。

app.module.ts

export class MyHammerConfig extends HammerGestureConfig
{
  overrides = <any>{
    swipe: {direction: Hammer.DIRECTION_ALL},
  };

  buildHammer(element: HTMLElement)
  {
    let options = {};

    if (element.attributes['data-mc-options'])
    {
      try
      {
        options = JSON.parse(element.attributes['data-mc-options'].nodeValue);
      }
      catch (err)
      {
        console.error('An error occurred when attempting to parse Hammer.js options: ', err);
      }
    }

    const mc = new Hammer(element, options);


    // retain support for angular overrides object
    for (const eventName of Object.keys(this.overrides))
    {
      mc.get(eventName).set(this.overrides[eventName]);
    }

    return mc;
  }
}

然后,在组件模板中,将额外选项作为 json 字符串传递。

组件.html

<div (swipeleft)="onSwipeLeft()" data-mc-options='{ "touchAction": "pan-y" }'">
</div>

这适用于野生动物园/iOS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM