【问题标题】:Nested divs producing a scrollbar. Why?嵌套 div 生成滚动条。为什么?
【发布时间】:2015-10-07 14:33:26
【问题描述】:

我有 3 个嵌套的 div:

<div class="outer">
  <div class="inner"><div class="item"></div></div>
</div>

.inner div 是绝对位置,它们每个都有 1px 边框:

.outer{
  width:50%;
  height:100px;
  border: 1px solid red;
  position:relative;
  overflow-x:hidden;
  box-sizing:border-box;
}
.inner{
  border:1px solid blue;
  height:100%;
  position: absolute;
  box-sizing: border-box;
}
.item{
  width:100px;
  height:100%;
  background-color:yellow;
  display: inline-block;
  border:1px solid green;
  box-sizing:border-box;
}

这种排列会在 .outer div 上产生一个滚动条。

这是codepen

为什么会这样?我需要改变什么来阻止它发生?

如果 .inner div 的边框宽度增加到 3px,那么滚动条就会消失。再说一遍,为什么会这样?

【问题讨论】:

标签: html css border-box


【解决方案1】:

发生这种情况是因为您的.item 元素设置为显示为inline-block。这意味着它会受到line-heightvertical-align 之类的影响。

inline-block 元素的默认垂直对齐方式是基线。这意味着它们将出现在可以在其旁边输入的任何文本的基线处。我不是 100% 确定,但我认为这里可能存在一个问题,在进行此计算时会忽略 box-sizing,并且基线最终比它应该在的位置低 2 像素(由于边框的累积 2 像素应用于元素的顶部和底部)。

如果您希望该元素继续以这种方式显示,快速解决方法是将其 vertical-align 设置为 top

.item {
    ...
    vertical-align: top;
}

Codepen demo.

【讨论】:

  • @WillJenkins 我不确定你的意思。如果您希望.item 元素居中显示,您可以将.inner 元素指定为100%width,并将text-align 设置为centercodepen.io/anon/pen/XmRQpL
  • 删除display: inline-block,在项目上设置vertical-align: top/middle/bottomposition: absolute都可以,但是为什么绝对定位元素的内联块子元素会占用父元素的空间??
  • @Tyblitz 我已经用我认为为什么会发生这种情况的理论更新了我的答案。
  • @JamesDonnelly 我的意思是垂直居中。现在,通过这样做,滚动条消失了:codepen.io/anon/pen/MamRpL
  • @WillJenkins middle这里的垂直对齐只有在它有一些东西可以对齐时才有效。如果我们从中删除.item1,则垂直对齐将停止工作。但是,您可以在 .inner 元素上应用 line-height98px 来实现此目的。
【解决方案2】:

最奇怪的是,如果你删除overflow-x:hidden;,滚动条就会消失。原因是overflow 的默认行为是visible,因此如果你不弄乱它,结果将没有滚动条,但是overflow-x 设置为某个值,设置@ 987654325@ 到 auto,而不是默认值 visible,因此会出现滚动条。

如果您将overflow 设置为auto,滚动条也会出现。

另一方面,.item 设置为inline-block,所以它有line-height,它在底部产生空间。将.inner设置为line-height:0会使空间消失,如果增加它也会增加。

另一方面(第三只手),您可以通过将.inner 设置为overflow:hidden 来限制.inner 中的元素占用的空间

【讨论】:

  • 是的,我知道这一点,但 overflow-x:hidden 是必要的
【解决方案3】:

为什么你在内部项目中使用inline-block?如果你改变阻止你的滚动消失:

.item{
  width:100px;
  height:100%;
  background-color:yellow;
  display: block;
  border:1px solid green;
  box-sizing:border-box;
}

【讨论】:

    【解决方案4】:

    这是因为你的高度是 100%,然后你在每个 div 上添加了 1px 的边框。工作演示:http://codepen.io/anon/pen/VvbNXp

    所以您的 .inner 和 .item 类需要将高度更改为:

    height:calc(100% - 1px);
    

    【讨论】:

    • 不,box-sizing:border-box 考虑了边框宽度。
    • 我相信 box-sizing 只考虑了 padding 和 margin,对吧?因为这个解决方案带走了滚动条
    • 不。它是填充和边框,但不是边距。见这里:developer.mozilla.org/en/docs/Web/CSS/box-sizing
    • 好的。我认为这是您的 inline-block 元素上的空格。 css-tricks.com/fighting-the-space-between-inline-block-elements 删除它,你就很好了。并在您使用时投票支持我的答案;)
    • 哦。对不起。但是,如果您确实从 .item 类中删除了 inline-block 它是固定的,或者如果您添加边距:-1px。此外,正如那篇文章所述,行内块元素存在空格问题
    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多