【问题标题】:Why does a nested HTML element make my CSS jump?为什么嵌套的 HTML 元素会使我的 CSS 跳跃?
【发布时间】:2012-03-02 00:47:58
【问题描述】:

这是一个谜题。基本页面,一个元素:

http://jsfiddle.net/PZj6t/

HTML:

<div id="container"></div>​

CSS:

body, html {
    height: 100%;
    margin: 0;
    padding: 0;
    background-color: black;
}
#container {
    position: relative;
    margin: 0 auto;
    width: 400px;
    height: 100%;
    background-color: #666;
}
​

那个看起来像我想要的那样,#container 整齐地齐平到顶部。但是当我添加一个嵌套元素时:

http://jsfiddle.net/PZj6t/1/

HTML:

<div id="container">
    <nav id="topnav"></nav>
</div>​

CSS(新):

#topnav {
    width: 100%;
    height: 40px;
    margin: 30px 0;
    background-color: red;
}
​

容器跳下。似乎#topnav 的margin-top 以某种方式传递给了容器,现在页面有一个我不想要的滚动条。 (我正在 Chrome 中进行测试。)如何防止这种情况发生?

(还有一个谜团,如果我将 border: 1px solid white; 添加到 #container 的 CSS 中,跳转就会消失。这很好,除了还会在页面上添加两个像素的不良滚动。)

【问题讨论】:

  • 您正在为已经 100% 高的东西添加边距。改用填充。
  • @Diodeus 导航不是 100% 高度,容器是。容器没有声明垂直边距。

标签: css html positioning


【解决方案1】:

这是由于 CSS 的一项称为边距折叠的功能。如果父元素上没有内边距或边框,则父元素及其子元素的边距“折叠”为两者中较大的值,并且本质上应用于父元素。

对于您的情况,我建议您在容器内简单地添加一个额外的内包裹,并在其上添加一些填充以模拟您正在寻找的边距效果:http://jsfiddle.net/PZj6t/3/

#inner 或以下 div 内的任何内容都应按预期运行,因为边距仅在其父级边缘时才会折叠(并且不存在填充或边框)。

【讨论】:

  • 有趣的功能——我知道相邻元素的边距折叠,但我从未注意到它也适用于嵌套元素。在我作为开发人员的所有这些年里,直到现在它从未影响过我的工作。
【解决方案2】:
display:inline-block;

在您的导航元素出现时将解决此问题。它与边距折叠有关,请参阅here 了解更多详细信息。

【讨论】:

  • 这似乎是最简单的解决方案,尽管我必须在#topnav 之后调整其他元素的边距。
【解决方案3】:

Jblasco 是正确的,不过这是一个更简洁的解决方案:http://jsfiddle.net/PZj6t/4/

#container {
    position: relative;
    margin: -1px auto 0;
    width: 400px;
    height: 100%;
    padding-top:1px;
    background-color: #666;
}
#topnav {
    width: 100%;
    height: 40px;
    margin: 29px 0 30px;
    background-color: red;
}

【讨论】:

  • 使用height: 100% 添加任何类型的填充将导致页面上出现垂直滚动条。也许如果他在#container 上使用display: border-box,这将是一个好的解决方案。
  • 还有display: border-box 我的意思是box-sizing: border-box。我仍然觉得搞乱box-sizing 或使用负边距有点粗略。
  • 我试图避免使用 CSS3 解决方案。
【解决方案4】:
#container {
    margin: 0 auto;
    width: 400px;
    height: 100%;
    background-color: #666;
    border:1px solid;
}

http://jsfiddle.net/PZj6t/12/

Update:

http://jsfiddle.net/PZj6t/1/
containertopnav 上应用display:inline-block;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2010-11-03
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多