CSS overflow-x:visible; 溢出-y:隐藏; 导致滚动条问题

Jam*_*ury 422 html css overflow

假设你有一些风格和标记:

ul
{
  white-space: nowrap;
  overflow-x: visible;
  overflow-y: hidden;
/* added width so it would work in the snippet */
  width: 100px; 
}
li
{
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)
<div>
  <ul>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
    <li>1</li> <li>2</li> <li>3</li>
    <li>4</li> <li>5</li> <li>6</li>
    <li>7</li> <li>8</li> <li>9</li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

当你看到这个.该<ul>有一个在底部的滚动条,即使我已经溢出X/Y指定的可见和隐藏价值.

(在Chrome 11和opera(?)上观察到)

我猜测必须有一些w3c规范或者某些东西告诉这件事发生但是对于我的生活我无法理解为什么.

的jsfiddle

更新: -我找到了一种方法来通过添加另一个元素来实现相同的结果ul.看看这个.

Jam*_*ury 638

经过一番认真的搜索后,我似乎找到了问题的答案:

来自:http://www.brunildo.org/test/Overflowxy2.html

在Gecko,Safari,Opera中,'visible'在与'hidden'结合使用时变为'auto'(换句话说:'visible'与其他与'visible'不同的东西组合成'auto').Gecko 1.8,Safari 3,Opera 9.5在它们中非常一致.

也是W3C规范说:

'overflow-x'和'overflow-y'的计算值与它们的指定值相同,除了某些与'visible'的组合是不可能的:如果一个被指定为'visible'而另一个被指定为'scroll'或'自动',然后'可见'设置为'自动'.如果'overflow-y'相同,'overflow'的计算值等于'overflow-x'的计算值; 否则它是'overflow-x'和'overflow-y'的计算值对.

精简版:

如果你正在使用visible的任一overflow-xoverflow-y比其他东西,并visible为其他的visible值被解释为auto.

  • 据我所知,W3C以这种方式指定它,但它背后的动机是什么?我发现它很奇怪且行为不一致,导致混乱的解决方案需要添加简单的HTML元素. (240认同)
  • 你是对的,但没有任何意义.你甚至想要x和y的最常见原因是你可以隐藏一个,另一个可见. (110认同)
  • 这是瘫痪的.为什么我们不能在没有父/子黑客的`overflow-y:hidden`期间允许`overflow-x:visible`?漂亮的上下铺,IMO. (84认同)
  • 这完全是瘫痪的.我试图在Bootstrap导航栏中水平滚动一堆下拉链接,但这会打破下拉菜单,这依赖于`overflow-y:visible`.Boo CSS! (27认同)
  • @Erwin我同意,希望有人决定更新规范. (18认同)
  • 标准行为不良的一个很好的例子. (14认同)
  • 只是过来强调这是非常不直观的行为。为什么世界上会有人专门设置 `x:visible`/`y:scroll` _want_`x:auto`/`y:scroll` ? (9认同)
  • 将这些投诉贴上“无意识”的标签是非常不公平和人身攻击的。事实上,API 提供了两个看似独立的变量,这两个变量的记录“非常糟糕”,在某些特定情况下,它们会根据另一个变量的值自动更改自身。对 API 的改进将使得尝试设置“x: auto, y:hidden”(和类似的)变得不可能。 (7认同)
  • @Erwin:他们可能认为有一个元素的内容在x和y方向上溢出并且有一个被剪裁而另一个显示看起来更怪,而不是强迫内容被剪切到两个方向或根本没有(更不用说潜力了)可见与任何其他值相关的布局问题).看看这些概念证据,看看它们是什么样的,如果它们允许溢出-x:可见[with overflow-y:hidden](http://jsfiddle.net/BoltClock/mynzbL0t)和[with overflow-y:auto ](http://jsfiddle.net/BoltClock/mynzbL0t/1). (5认同)
  • 这是直白的废话。到 2020 年,我们将拥有自动驾驶汽车。 (4认同)
  • @BoltClock:这不是无意识的抱怨。此行为是违反直觉的,并且严重降低了overflow- [xy]的用途。我不在乎规格不好的技术原因,这里的每个人都同意Firefox和Edge中的实现是它应该如何工作的。 (3认同)
  • 为什么有人对 CSS 有一个设计糟糕的功能感到惊讶?老实说,这是我见过的设计最糟糕的语言,但没有人可以碰它,因为对它的任何非向后兼容的更改都会破坏网络的某些部分 (3认同)
  • 啊,我也遇到了这个(规范?)错误。任何解决方法?没关系,我能够将问题元素放入添加了溢出的细分区域中,这样就不会影响其他任何内容。 (2认同)
  • 鉴于OP试图实现与我的示例中显示的完全不同的东西,并且每个人似乎都在关注与OP相同的问题,我怀疑手头有一个不同的问题,这在某种程度上需要设置冲突的溢出价值,虽然缺乏描述我不知道它可能是什么.问题中给出的代码甚至没有充分重现问题,更不用说开始描述它了. (2认同)
  • “ BoltClock”的消息和巧妙的JSFiddle演示,如果单独的溢出会是什么样子**非常重要,并显示了一个坏主意的潜在原因,但有很多例子**,例如浮动子菜单,其中没有滚动条的“绝对”或“相对”定位只需要单独的溢出控制(以避免其他复杂的解决方案)。W3C可以允许单独的溢出控制,仅突出显示其引起的问题。 (2认同)
  • **当然,这个问题的解决方案非常简单,应该适用于大多数场景(但并不理想)**,内容包含两个元素,一个在另一个内部,另一个包含`overflow-x`或者`overflow-y`设置为溢出或包含和滚动,另一个元素设置相反的轴并设置为相反的包含. (2认同)
  • @wortwart:Firefox不会渲染滚动条直到最小高度(此最小值取决于操作系统主题,但通常Firefox无法缩放其滚动条控件),但溢出的计算值仍然是自动的,并且内容仍可正常滚动.当然,滚动条似乎是人们抱怨的...... (2认同)
  • W3C 规定了“visible”与“auto”或“scroll”的组合,但没有提及“visible”与“hidden”的组合 (2认同)
  • 这不是问题的解决方案。这可能是真的,但它不应该是公认的答案,即使下面的正确答案是黑客。 (2认同)
  • 这是 CSS 有史以来最糟糕的决定。 (2认同)

Jus*_*use 114

另一个廉价的黑客,似乎可以做到这一点:

style="padding-bottom: 250px; margin-bottom: -250px;"在垂直溢出被截止的元素上,250表示您下拉列表所需的像素数等.

  • 哈哈与否,它拯救了我的生命 (11认同)
  • 这使得水平滚动条显得很远 (9认同)
  • 非常感谢,虽然这感觉很酷,但似乎是解决问题的最佳方法.溢出在css中很糟糕:( (3认同)
  • 2 年后,这似乎仍然是这个问题的最佳答案......希望有另一个浏览器(Microsoft Edge)加入 Chromium 开源项目,我们将看到更重要的浏览器功能的更快开发以及更好的浏览器兼容性。 (3认同)
  • 这也会阻止元素下方 250 像素的指针事件。但是我找到了解决方法,这个解决方案就是我正在使用的。 (2认同)
  • 在我的特定场景中,不可能删除“position:relative”或使用包装器,这是唯一有效的解决方案,尽管它确实还需要向我想要设置的元素内的子元素添加很多丑陋的边距。启用overflow-x:hidden`来补偿hacky填充。不过,这救了我,所以谢谢! (2认同)

Mac*_*rte 80

在使用Cycle jQuery插件时,我最初发现了一种绕过它的CSS方法.循环使用JavaScript将我的幻灯片设置为overflow: hidden,所以当我将图片设置width: 100%为图片时,看起来会垂直切割,因此我强制它们可见,!important并避免显示幻灯片动画开箱即用设置overflow: hidden为容器div滑动.希望对你有效.

更新 - 新解决方案:

原始问题 - > http://jsfiddle.net/xMddf/1/ (即使我使用overflow-y: visible它变成"自动"并实际上"滚动".)

#content {
    height: 100px;
    width: 200px;
    overflow-x: hidden;
    overflow-y: visible;
}
Run Code Online (Sandbox Code Playgroud)

新的解决方案 - > http://jsfiddle.net/xMddf/2/ (我找到了一个解决方法,使用包装 div来应用overflow-xoverflow-y不同的DOM元素,因为James Khoury建议组合visiblehidden单个DOM元素的问题.)

#wrapper {
    height: 100px;
    overflow-y: visible;
}
#content {
    width: 200px;
    overflow-x: hidden;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是如何适用的?它似乎不适用于overflow-x或overflow-y. (11认同)
  • 此解决方案不适用.问题是`overflow-x:visible;`和`overflow-y:hidden`.不是相反. (8认同)
  • 一旦包装器因某种原因获得宽度,这就会失败 - https://jsfiddle.net/ad1941k9/16/ (3认同)
  • @TomasJansson @Edward 它*确实*工作,你只需要交换应用`overflow-x`和`-y`的位置:[更新小提琴](http://jsfiddle.net/ad1941k9/1/)。 (2认同)

And*_*est 32

对于我的用例,添加overflow-x:visible; overflow-y:clip到具有溢出的 div 似乎给了我隐藏 Y 轴上的溢出的所需效果,同时不在 X 轴上提供滚动条(我有一个正在加载全尺寸图像的轮播滑块在再次缩小它们之前,这些图像在加载时占据了页面高度的 75%,因此不需要overflow-y)。

不需要父包装 div,只需height在溢出元素上固定设置即可。我意识到这个解决方案可能并不适合所有人,但它肯定可以帮助一些人。

  • 现在已经是 2023 年末了,现在的支持似乎相当不错:https://caniuse.com/mdn-css_types_overflow_clip。我认为这是目前最好的解决方案。 (2认同)

Vic*_*tor 14

我遇到了同样的问题,以下解决方案有效(样式应用于父块)

overflow-y: visible;
overflow-x: clip;
Run Code Online (Sandbox Code Playgroud)


小智 12

现在有了解决这个问题的新方法- 如果你从容器中删除 position: relative ,它需要让溢出-y 可见,你可以让溢出-y 可见和溢出-x 隐藏,反之亦然(有溢出- x可见和溢出-y隐藏,只需确保具有visible属性的容器没有相对定位)。

有关更多详细信息,请参阅 CSS Tricks 中的这篇文章 - 它对我有用https : //css-tricks.com/popping-hidden-overflow/

  • 但这需要一些 javascript 来正确定位元素(如果它是绝对的) (4认同)

And*_*aro 8

我在尝试构建一个固定定位的侧边栏时遇到了这个问题,该侧边栏包含垂直滚动的内容和嵌套的绝对定位子窗口,以显示在侧边栏边界之外.

我的方法包括单独申请:

  • overflow: visible侧边栏元素的属性
  • overflow-y: auto侧边栏内包装的属性

请查看以下示例或在线codepen.

html {
  min-height: 100%;
}
body {
  min-height: 100%;
  background: linear-gradient(to bottom, white, DarkGray 80%);
  margin: 0;
  padding: 0;
}

.sidebar {
  position: fixed;
  top: 0;
  right: 0;
  height: 100%;
  width: 200px;
  overflow: visible;  /* Just apply overflow-x */
  background-color: DarkOrange;
}

.sidebarWrapper {
  padding: 10px;
  overflow-y: auto;   /* Just apply overflow-y */
  height: 100%;
  width: 100%;
}

.element {
  position: absolute;
  top: 0;
  right: 100%;
  background-color: CornflowerBlue;
  padding: 10px;
  width: 200px;
}
Run Code Online (Sandbox Code Playgroud)
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
<div class="sidebar">
  <div class="sidebarWrapper">
    <div class="element">
      I'm a sidebar child element but I'm able to horizontally overflow its boundaries.
    </div>
    <p>This is a 200px width container with optional vertical scroll.</p>
    <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?</p>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我很确定这与其他人提出的解决方案相同,除了使用`auto`而不是`hidden`. (2认同)

dsd*_*dsd 6

我使用了这种content+wrapper方法... 但是我做的事情与到目前为止所提到的有所不同:我确保包装器的边界不在我希望可见的方向上与内容的边界对齐

重要提示:这是很容易够得着content+wrapper, same-bounds的工作方式在一个浏览器或其他取决于各种CSS组合positionoverflow-*等等...但我从来没有使用这种方法,让他们所有正确的(边,铬,野生动物园。 ..)。

但是当我有类似的东西:

  <div id="hack_wrapper" // created solely for this purpose
       style="position:absolute; width:100%; height:100%; overflow-x:hidden;">
      <div id="content_wrapper"
           style="position:absolute; width:100%; height:15%; overflow:visible;">         
          ... content with too-much horizontal content ... 
      </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

...所有浏览器都很高兴。