angular - HammerJs:通过水平滑动启用垂直滚动
问题描述
我有一个 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
推荐阅读
- java - 我希望一个类中的多个@postconstruct 方法按顺序执行
- c# - 如何在 rfc6960 的第 3.2 节中实施模糊的 OCSP 签名响应接受要求
- javascript - 在 Vue 3 中全局使用 JQuery
- php - 在 laravel-8 中找不到 Laravel PHP 错误 404
- android - 我们如何在没有 Kotlin 协程中的任何实例的情况下使用 emit() 和 delay() 函数?
- google-sheets - 同一公式中的替代查询
- firebase - 将数据从firestore传递到对象?
- javascript - React 和 d3.js,如何确保 d3 组件在 `.setState()` 上呈现
- html - 在html中将选择框移动一点(以对齐之前的文本)
- javascript - 谁能告诉我这个 javaScript 代码有什么问题?