html - 溢出 : scroll; only the y-axis whilst keeping x-axis visible

标签 html css

问题案例

我正在尝试创建一个滚动的、固定高度的列表,每个列表项都有弹出按钮。

我使用了 overflow-y: scroll; 以便它可以在 y 轴上滚动。

然而,当我也尝试使用 overflow-x: visible(为了显示溢出的弹出窗口)时,它似乎被忽略了

代码

示例 1 - 列表可以滚动,但弹出按钮被剪裁

如您所见,弹出按钮(粉红色)被剪裁

.list {
  width: 72px;
  height: 132px;
  overflow-x: visible;
  overflow-y: scroll;
  background: lightgray;
}

.list li {
  position: relative;
  margin-bottom: 6px;
}

.flyout {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 64px;
  width: 128px;
  background: pink;
}
<ul class="list">
  <li>
    Item 1
    <div class="flyout">Item 1 Flyout</div>
  </li>
  <li>
    Item 2
    <div class="flyout">Item 2 Flyout</div>
  </li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
</ul>

示例 2 - 列表无法滚动,弹出按钮显示正常

删除 overflow-y: scroll 可以很好地显示弹出窗口,但正如预期的那样,列表无法再沿高度滚动。

.list {
  width: 72px;
  height: 132px;
  overflow-x: visible;
  background: lightgray;
}

.list li {
  position: relative;
  margin-bottom: 6px;
}

.flyout {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 64px;
  width: 128px;
  background: pink;
}
<ul class="list">
  <li>
    Item 1
    <div class="flyout">Item 1 Flyout</div>
  </li>
  <li>
    Item 2
    <div class="flyout">Item 2 Flyout</div>
  </li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
  <li>Item 8</li>
</ul>

可能的解决方案

我当然可以让我的 .list 有足够的宽度,这样弹出框就不会溢出它。

我想避免这种情况,因为列表将放置在绘图 Canvas 的顶部,因此它会阻止通过鼠标在 Canvas 上绘画。

使用 pointer-events: none 以免阻塞绘画在这种情况下不起作用,因为指针事件是检测第一个列表的滚动事件所必需的地方。

最佳答案

您需要删除 position: relative。这样绝对定位的弹出框就不会受到overflow的限制了。

但是,它们不会正确滚动。您将需要使用 JS 触发重新布局。

// Force relayout
var li = document.querySelector('li:last-child');
setInterval(function() {
  var parent = li.parentNode;
  var next = li.nextSibling;
  parent.removeChild(li);
  parent.insertBefore(li, next);
}, 60);
.container {
  position: relative;
  overflow: hidden;
  margin: 1em 0;
}
.list {
  width: 72px;
  height: 132px;
  overflow-y: scroll;
  background: lightgray;
  margin: 0;
}
.list li {
  margin-bottom: 6px;
}
.flyout {
  display: inline-block;
  position: absolute;
  width: 128px;
  background: pink;
}
<div class="container">
  <ul class="list">
    <li>
      Item 1
      <div class="flyout">Item 1 Flyout</div>
    </li>
    <li>
      Item 2
      <div class="flyout">Item 2 Flyout</div>
    </li>
    <li>Item 3</li>
    <li>Item 4</li>
    <li>Item 5</li>
    <li>Item 6</li>
    <li>Item 7</li>
    <li>Item 8</li>
  </ul>
</div>

关于html - 溢出 : scroll; only the y-axis whilst keeping x-axis visible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41535720/

相关文章:

html - 并排显示 3 个图像链接

jquery - 交叉触发jquery代码

javascript - DIV 在 IE 和 Firefox 中的定位不同

python - 服务器通过 "text/html"响应 "text/css"请求

php - 多次循环 jQuery .post 函数

python - 如何使用 pylint 1.8.2 生成 html 报告以在 gitlab-ci 页面中发布?

php - 更新表格行中的数据[PHP]

javascript - 足够好的动态对象打包

html - 在另一个 div 上更改 css 不工作,因为它不在同一个元素中

jquery - 获取相对于父删除对象的位置 Jquery UI