【问题标题】:Prevent drag scrolling in Safari on Mac防止在 Mac 上的 Safari 中拖动滚动
【发布时间】:2021-11-01 14:44:49
【问题描述】:

看看this codepen
角落里有红色方块。

如果您单击(使用鼠标或触摸板)此方块并将其向下拖动 - 在 Mac 上的 Safari 中,.parent 元素将向下滚动。
即使 .parent 有 overflow-y: hidden;

在所有其他浏览器中都不会发生滚动。
如何防止在 Safari 上滚动? 作为一个粗略的解决方案,我可以听滚动并覆盖 scrollTop 如果它不为零,但也许有更优雅的解决方案?

【问题讨论】:

  • 嗨,丹尼斯,有时间请看我的解决方案。

标签: javascript html css macos safari


【解决方案1】:

您可以添加一个中间 div。然后,为其设置宽度、高度、溢出属性。

.parent {
  width: 200px;
  height: 200px;
  border: 1px dashed black;
  overflow-x: auto;
  overflow-y: hidden;
}

/** intermediary div */
.parent > div {
  width: 200%;
  height: 100%;
  overflow: hidden;
}

.child {
  width: 100%; /** this should be 100% **/
  height: 200%;
  background: linear-gradient(to right bottom, red, tomato), linear-gradient(to bottom, white, black);
  background-size: 50px 50px, 100% 100%;
  background-repeat: no-repeat;
  background-position: center;
}
<div class="parent">
  <div>
    <div class="child"></div>
  </div>
</div>

或将pointer-events:none 添加到父级。

.parent {
  /* This prevents dragging */
  pointer-events: none;
  width: 200px;
  height: 200px;
  border: 1px dashed black;
  overflow-x: auto;
  overflow-y: hidden;
}
.child {
  width: 200%;
  height: 200%;
  background: linear-gradient(to right bottom, red, tomato), linear-gradient(to bottom, white, black);
  background-size: 50px 50px, 100% 100%;
  background-repeat: no-repeat;
  background-position: center;
}
<div class="parent">
  <div class="child"></div>
</div>

【讨论】:

  • 第一个解决方案的好发现,hacky 但几乎只有 css。
  • 我更正了第二个解决方案的拼写错误pointer-eventpointer-events。第二个解决方案似乎仍然对我不起作用,但第一个非常好。关于您的第一个解决方案,我最喜欢的一件事是它实际上并不能防止在 x 轴上拖动滚动,而只是在框架外拖动滚动,在这种情况下是 y 轴。干得好。
  • 啊,是的,感谢您的指出!第二个解决方案不起作用,因为我有 pointer-events: auto to child。我现在已经删除了。如果后代不需要交互,则可以使用此方法
【解决方案2】:

这绝对是一个有趣的发现!你会认为这是不可能的,因为你将overflow-y 设置为none。尽管如此,您可以使用此 JavScript 阻止此行为并禁止在父级内部单击:

const parent = document.querySelector('.parent');
parent.addEventListener('mousedown', e => e.preventDefault());

通过将preventDefault() 添加到mousedown 触发的事件中,您可以防止浏览器评估与该点击相关的任何进一步事件,包括拖动。它在行动中:

const parent = document.querySelector('.parent');
parent.addEventListener('mousedown', e => e.preventDefault());
.parent {
  width: 200px;
  height: 200px;
  border: 1px dashed black;
  overflow-x: auto;
  overflow-y: hidden;
}

.child {
  width: 200%;
  height: 200%;
  background: linear-gradient(to right bottom, red, tomato), linear-gradient(to bottom, white, black);
  background-size: 50px 50px, 100% 100%;
  background-repeat: no-repeat;
  background-position: center;
}
<div class="parent">
  <div class="child"></div>
</div>

【讨论】:

  • 您好,谢谢,这是一个很好的解决方案,比检查和覆盖 scrollTop 更好。让我们再等几天,如果没有更好的想法,我会接受这个答案。
  • @Denis 谢谢!让我知道您是否正在寻找我可以添加的其他内容,或者您​​只是在等着看是否有针对此问题的纯 CSS 解决方案?我也很想看到一个。
【解决方案3】:

使用 css 你可以给pointer-events:none;以避免在单击它时发生任何事件。

【讨论】:

  • 我需要它水平滚动,这就是为什么在例子中有一个overflow-x: auto
猜你喜欢
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多