【问题标题】:Dragging content of overflow div scrolls in both Safari and Firefox, not in Chrome在 Safari 和 Firefox 中拖动溢出 div 的内容滚动,而不是在 Chrome 中
【发布时间】:2020-09-15 20:10:51
【问题描述】:

我正在尝试使用 HTML 画布创建自定义 ui,但我想保留本机滚动行为。我提出了一个技巧,我用空的透明 div 覆盖我的画布,并根据 div 的滚动位置重新绘制画布。这非常有效,除非尝试允许用户选择在画布上绘制的东西。通常,您会希望元素滚动,这在 Safari 和 Firefox 中都会发生,但在 Chrome 中则不然。

想象下面的 HTML 代码:

.container {
  width: 100px;
  height: 100px;
  overflow: auto;
  margin-bottom: 20px;
  border: 2px solid black;
}

.content {
width: 1000px;
height: 1000px;
background: rgb(34,193,195);
background: radial-gradient(circle, rgba(34,193,195,1) 0%, rgba(253,187,45,1) 100%);
}

.item {
border: 1px solid blue;
width: 50px;
height: 50px;
}
<div class="container">
  <div class="content"></div>
</div>

<div class="container">
  <div class="content">
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

这将创建两个包含可滚动内容的容器。尝试在它们两个中单击并拖动鼠标按钮,就好像您试图在其中选择一些不可见的文本一样。在 Safari 和 Firefox 中,两个容器都会滚动。在 Chrome 中,只有第二个(包含内部 .item div)会滚动。

有没有办法在 Chrome 中获得所需的行为?我想避免创建大量(数千)DOM 元素。

【问题讨论】:

  • 我使用的是 chrome 85.0.4183.102,我可以通过鼠标滚动以及单击 n 拖动来滚动两个容器。
  • @DipenShah 感谢您的评论,我添加了动画 gif 以更好地说明滚动拖动的含义。这在 Chrome 中真的适合您吗?
  • 对我来说,在 Chrome 85.0.4183.102 中,我可以同时拖动两者。不过,我必须在第一个框中稍微按住鼠标/触控板。
  • 只要我的光标停留在容器元素中,它在两种情况下都对我有用。但在 Firefox 中,即使我的光标在拖动过程中超出容器元素,我也能够滚动。

标签: html css google-chrome scroll


【解决方案1】:

由于某种原因,Chrome 希望其中包含一些内容以供选择工作,这与 Firefox 不同。

您可以通过在内容 div 中包含一些文本并将其不透明度设置为 0 来模拟所需的行为。还可以使用 CSS user-select: all; 在第一次点击时选择整个文本。

注意:只有当光标在容器边界内时滚动才有效(在 chrome 中)。

.container {
  width: 100px;
  height: 100px;
  overflow: auto;
  margin-bottom: 20px;
  border: 2px solid black;
}

.content {
  width: 1000px;
  height: 1000px;
  background: rgb(34, 193, 195);
  background: radial-gradient(circle, rgba(34, 193, 195, 1) 0%, rgba(253, 187, 45, 1) 100%);
  user-select: all;
}

.content span{
  opacity: 0;
}

.item {
  border: 1px solid blue;
  width: 50px;
  height: 50px;
}
<div class="container">
  <div class="content"><span>a</span></div>
</div>

<div class="container">
  <div class="content">
    <div class="item"></div>
    <div class="item"></div>
  </div>
</div>

【讨论】:

  • 谢谢,这似乎可以解决问题。抱歉,赏金在我授予之前就过期了。不用担心,我已经开始了另一个,交给你了。不幸的是,我们必须等待 24 小时。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2018-05-28
  • 2015-10-01
  • 2011-08-16
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
相关资源
最近更新 更多