angular - 锤子 : enable vertical scroll with horizontal swipe

标签 angular safari mobile-safari hammer.js

我有一个 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 example论证这个问题。组件级提供程序将被忽略。

最佳答案

我找到了解决方案 there .

基本上,自定义配置必须覆盖 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 字符串传递。

component.html

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

这适用于 safari/iOS

关于angular - 锤子 : enable vertical scroll with horizontal swipe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60229437/

相关文章:

ios - 设置默认的 iOS 网络剪辑图标标题?

javascript - iOS Safari 13.5 在内容较长的固定元素上闪​​烁

angular - 如何全局声明管道以在不同模块中使用?

javascript - ionic 2 : Get the header of a response in http request

angular - 如何设置 Angular 2 组件属性的默认值?

ios - PWA : Aggressive caching in iOS 12 Safari

html - Safari 9 中的错误?为链接的边框添加蓝色

css - Safari 4 的背景大小解决方法

iOS13 Safari WebSpeechApi 错误 : SpeechSynthesisUtterance won't use provided locale

angular - 作为输入传递的模板引用变量的类型是什么?