【问题标题】:Bottom margin of last child gets hidden when overflow applies应用溢出时,最后一个孩子的下边距被隐藏
【发布时间】:2012-06-13 15:25:01
【问题描述】:

我有一个容器 div,它的底部有孩子。问题是当div的溢出滚动条出现时,最后一个孩子的下边距被隐藏了。

请参阅http://jsfiddle.net/TxEAP/3/。起初,1 div 下方有一个正确的边距。单击“附加一个”以使滚动条最终出现,使最后一个 div 不再具有底部边距。打开 DevTools 显示最后一个孩子的边距在那里,但它在容器的视口之外,即使完全滚动到底部也是如此。

如何解决?让它在谷歌浏览器中运行就足够了。

HTML:

<div class="main">
    <div class="container">
        <div class="item">1</div>
        <!-- several of these .item divs -->
    </div>
</div>

CSS:

.main {
    height: 200px;
    overflow-y: scroll;
    position: relative;
    border: 1px solid black;
}

.container {
    width: 100%;
    max-height: 100%;
    position: absolute;
    bottom: 0;
}

.item {
    padding: 20px;
    margin: 15px;
    border: 1px solid black;
}​

【问题讨论】:

  • 我相信除了-webkit-margin-collapse: separate... 之外,应该有其他方法可以防止保证金崩溃
  • @BoltClock:这是我之前尝试的剩余部分。然而,这似乎对这个问题没有任何影响。

标签: google-chrome margin css


【解决方案1】:

这是我使用 flexbox 的最终解决方案。尽管有所有 -webkit- 前缀,但它在 Chrome 上得到了足够好的支持。基本上,这个想法是有一个虚拟元素,在没有溢出的情况下,从顶部开始填充容器的空间(以便真正的子元素锚定到底部);在溢出的情况下,它会因为height: 0而自动隐藏。它不受保证金问题的影响,也不会崩溃保证金。

http://jsfiddle.net/mCYLm/1/

HTML:

<div class="main">
    <div class="gap-filler"></div>
    <div class="item">foo</div>
    <!-- more `div.item`s -->
</div>

CSS:

div.main {
    display: -webkit-box;
    -webkit-box-orient: vertical;
    height: 200px;
    overflow-y: scroll;
}

div.main div.gap-filler {
    -webkit-box-flex: 1;
    height: 0;
}

div.main div.item {
    border: 1px solid black;
    margin: 20px;
    padding: 20px;
}​

编辑:这是一个没有 flexbox 的解决方案,但存在选择问题。

最终奏效的解决方案如下:http://jsfiddle.net/TxEAP/7/。这会附加隐藏的“内容”,这使得 Chrome 不会隐藏最后一个 .item div 的边距。

.container:after {
    content: "";
    font-size: 0;
    display: block;
    height: 1px;
}

编辑:以下仅在display: inline-block 可能的情况下才有效。

终于找到了解决办法。如果所有.items 都有display: inline-block 除了第一个,那么边距不会被隐藏。

http://jsfiddle.net/TxEAP/5/

.item:not(:first-child) {
    display: inline-block;

    /* attempt at getting `width: auto` like `display: block` has */
    width: -webkit-calc(100% - 2 * 15px);
    box-sizing: border-box;
}

【讨论】:

  • +1 不错的解决方案。我自己尝试了box-sizing,但您的 flexbox 解决方案很简单,而且没有 JavaScript :-)
【解决方案2】:

如果您只是将 overflow-y: scroll; 从 .main. 移动到 .container 类,则保留边距。唯一的缺点是少于 3 个项目(对于给定的容器高度),您会得到一个小的滚动条占位符,而不是一个全高的占位符。

删除容器上的 max-height:100% 似乎可以解决我在 Chrome 21 中的测试问题。

移动属性以便溢出在容器上,保留添加到末尾的元素的边距/填充,从而导致出现滚动条。

.main {
    height: 200px;
    border: 1px solid black;
}

.container {
    width: 100%;
    height: 100%;
    overflow-y: scroll;
}

【讨论】:

  • 谢谢,但是滚动条会被扔掉。
  • 如果 .main 和 .container CSS 可以更改,我更新的解决方案可能对您有用。
  • 我现在正在尝试您的解决方案。然而,这一次 div 似乎不再锚定在底部。对吗?
  • 抱歉,我需要离开一段时间。除非其他人已经回答了,否则我稍后会尝试解决方案:-)
  • 再尝试一次。我想我现在没有主意了!
猜你喜欢
  • 2013-10-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2021-07-12
  • 2019-10-07
  • 2020-02-20
相关资源
最近更新 更多