为什么我的div出现"inline"?

Why do my divs appear "inline"?

更新: 为什么 div 如此显示比如何解决问题更重要。如果我不知道为什么 div 会这样显示,我就不会理解 div 的工作原理。


我有两个 divmenuContainertop,它们被包裹在另一个名为 topContainerdiv 中。

我希望 menuContainertop 在垂直方向上彼此重叠,而不是在 X 角度上(我认为 div 出现在彼此下方是标准的)但它们同时出现在彼此顶部 "inline".

这就是它在我的浏览器中的样子(是的,我 f5:ed 和 fiddle 显示了同样的东西):

menuContainer 是水平 CSS 菜单的包装器。我希望它显示为 top

白色区域顶部的选项卡

为什么会出现 div "inline"(查看 hello 所在的位置)以及如何将其编辑为我想要的样子?

body {
  background-color: #c2b074;
  color: #40371c;
  margin: 0px;
  font-family: Calibri;
}
/* Menu CSS */

#menuContainer {
  margin: 4em auto;
  background-color: #000000;
  width: 600px;
}
#navMenu {
  margin: 0px;
  padding: 0px;
}
#navMenu ul {
  margin: 0px;
  padding: 0px;
  list-style-type: none;
  text-align: center;
  background-color: #d4cbab;
}
#navMenu li {
  display: inline;
}
#navMenu a {
  float: left;
  text-decoration: none;
  color: #40371c;
  width: 6em;
  padding: 0.3em;
  margin: 0 1.2em 0 0;
  background-color: #d4cbab;
  border-radius: 10px 10px 0px 0px;
}
#navMenu a:hover,
#navMenu a#cart:hover,
#navMenu a#contact:hover,
#navMenu a#home:hover {
  background-color: #efefef;
  color: #40371c;
}
#navMenu a#current {
  background-color: #efefef;
}
#navMenu a#contact {
  background-color: #d4cbab;
}
#navMenu a#cart {
  background-color: #6a6145;
  color: #c2b074;
}
#navMenu a#home {
  background-color: #40371c;
}
/* Top content CSS */

#top {
  clear: left;
  width: 650px;
  height: 100px;
  margin: 0 auto;
  background-color: #efefef;
  border-radius: 10px 10px 0px 0px;
}
<div id="topContainer">
  <div id="menuContainer">
    <div id="navMenu">
      <ul>
        <li> <a href="index.html" id="current">Home</a>

        </li>
        <li> <a href="#" id="contact">Contact</a>

        </li>
        <li> <a href="#" id="cart">Cart</a>

        </li>
      </ul>
    </div>
  </div>
  <div id="top">
    Hello
  </div>
</div>

CSS 菜单基于的教程是 this one.

如何使用 CSS 正确设置水平导航?这是一个演示:jsBin demo

你的#top逃逸边距
由于折叠(但有边距)前一个元素 #menuContainer。由于使用内部 floated LI 元素而折叠。

我创建了一个小型演示 (代码较少) 来反映您的问题;和 3 个解决方案

jsBin demo

<div id="parent">

  <div id="nav">
    <ul>
      <li><a href="#">link 1</a></li>
      <li><a href="#">link 2</a></li>
    </ul>
  </div>

  <div id="top">TOP ELEMENT</div>

</div>

/* Follow the steps. */
#parent{
  background:red; /* red color is visible cause #top has non-floated content */
}
#nav {
  background:gold;
  /* Can you see any GOLD background? 
     NO! cause UL height collapsed cause of floated LI
     So did the #nav height*/
}
#nav ul {
  padding:0;
  margin:0;
  background: #000;
  /* Can you see any BLACK background? NO!
     cause floated LI made the UL collapse */
}
#nav li {
  float:left; /* This line made UL collapse */
}
#nav{ /* (#nav again, I know, it's just to keep-on with steps) */
  /* margin:4em auto; /* Uncomment this line to add the margins */
      /* See the issue now? #nav is height 0 cause everything inside #nav is
      collapsed so #top moved to the nearest available position. */
  /* overflow:auto;   /* Uncomment this line to fix */
}
#top{
  clear:left;
}
/* Solutions:
1) instead of using floated LI make the `display:inline-block;`
2) don't set margin to #nav
3) set overflow:auto to #nav
4) Set height to the collapsed #nav but you'll get again issues if you make your design responsive. */

值得注意的是,如果您使用 LI set to inline-blockoverflow:auto; 技巧,则不需要 clear:left;(在 #top 元素上)。

你真的应该删除浮动。你不需要它们。您可以使用 display: inline-block:

完成同样的事情

FIDDLE

CSS

body {
  background-color: #c2b074; 
  color: #40371c;
  margin: 0px;
  font-family: Calibri;
}
/* Menu CSS */

#menuContainer {
  margin: 4em auto 0;
  width: 600px;
}

#navMenu {
  margin: 0px;
  padding: 0px;
}

#navMenu ul {
   margin: 0 0 0 20px;
   padding: 0px;
   list-style-type: none;
   text-align: left;
}

#navMenu li {
  display: inline-block;
}

#navMenu a {
  display:block;
  text-decoration: none;
  color: #40371c;
  width: 6em;
  padding: 0.3em;
  margin: 0 1.2em 0 0;
  background-color: #d4cbab;
  border-radius: 10px 10px 0px 0px;
}

#navMenu a:hover,
#navMenu a#cart:hover,
#navMenu a#contact:hover,
#navMenu a#home:hover {
   background-color: #efefef;
   color: #40371c;
}

#navMenu a#current {
   background-color: #efefef;
}

#navMenu a#contact {
   background-color: #d4cbab;
}

#navMenu a#cart {
   background-color: #6a6145;
   color: #c2b074;
}

#navMenu a#home {
   background-color: #40371c;
}
/* Top content CSS */

#top {
   width: 650px;
   height: 100px;
   margin: 0 auto;
   background-color: #efefef;
   border-radius: 10px 10px 0px 0px;
}

更新

这个问题与其他一些人宣称的 margin 无关。随心所欲地更改边距,如果您在开发人员工具中检查 .menuContainer,您会看到它的高度仍然为 0。它因为花车而倒塌。只需像我在示例中所做的那样删除浮点数,它就可以正常工作。无论如何,它的结构都不正确,您在 a 标签上有浮动,但它们的父标签 li 是需要浮动或内联的标签。因此,在 li 上调用 inline 和在 a 上调用 float: left 是不必要的。

屏幕截图

第一张是您的代码,仅删除了边距,如您所见,它的高度为 0:

这是我的代码,没有浮动,ul 没有折叠,高度为 27px:

总结

所以问题不在于花车,而在于您使用它们的方式。浮点数应该添加到 a 的父级(即 li)。 li 元素是需要内联的。但是由于您的 CSS 围绕这些浮点数构建的方式,删除它们后您的样式变得一团糟。我不得不重组一手满满的 CSS 类 以获得预期的结果。将来确保将浮动添加到需要内联的元素,而不是它们的子元素。

您需要将 margin 的重叠更改为下一个 div

#menuContainer {
    background-color: #000000;
    margin: 4em auto 0;/*changes*/
    width: 600px;
}

现在,只是为了写下我想阅读的答案(希望能帮助其他人了解这里刚刚发生的事情)

快速修复

menuContainer 中删除边距并将其添加到 topContainer 将 "solve" 视觉上的问题和 "look" 如您所愿,但它仍然是错误的代码 因为行为的原因仍然存在


为什么保证金会触发该行为?

问题 (我们将在下面讨论) 被触发是因为边距将菜单向下推,并且当 top 中的内容被推上时, 它会找到 space 出现在有

的地方


问题

导致此混乱的代码段:

#navMenu a {
    float: left;
}

这里的问题是元素 a 无缘无故地获得了所有属性。这里发生的是它折叠了父元素。崩溃使整个元素 "unseen" 变得无用。

float 所做的是删除通常构成 li 元素行为的标准 block-属性,并导致 a 元素聚集在一行。这是预期的效果,但它也折叠了父元素 li,看起来像这样:

#navMenu li {
    display: inline; /*This doesn't do anything because of the collapse!*/
}

折叠向上进行到 ul,其中边距被故意折叠为属性 margin: 0px;menuContainer 在所有地方都崩溃了,但它在顶部。 a 元素漂浮在空无之上。所以出于所有目的,它也被折叠了。

此连锁反应已将整个菜单折叠成 topContainer,其中 top 现在或多或少位于 a 元素之上,但它被他们的属性。 a 元素是唯一没有折叠的元素。

假设浏览器存在的所有内容都是松散的浮动 a 元素,它们对父级 div.

没有边距或填充

这里有人试图解决这个问题:

#top {
    clear: left;
}

然而,clear 所做的是检查浮动内容到其指定位置 (在本例中为左侧) 并告诉它 "stay clear of it" 通过向下移动边框边缘,但是 a 已经完全折叠 li,所有其他父级也折叠了,所以没有边框线但折叠了 menu-container 的底部,这是上边距结束的地方。由于 topContainer 也被折叠,menuContainer 的边距已经移动到适合的位置; topContainer 之外。

所以; a 元素没有漂浮在任何东西上,而是漂浮在 topContainer 内部。 clear 制作的边框出现在没有它的地方:在 topContainer 的顶部。这就是为什么您可以看到 top 的内容框从 a 元素开始的位置开始,从而允许 "hello" 在它们旁边弹出。


解决方案

更好版本的解决方案如下所示:

body {
  background-color: #c2b074;
  color: #40371c;
  margin: 0px;
  font-family: Calibri;
}
/* Menu CSS */

#topContainer {
    margin: 4em auto 0 auto;
}

#menuContainer {
  margin: 0 auto;
  width: 300px;
}
#navMenu {
  margin: 0px;
  padding: 0px;
}
#navMenu ul {
  margin: 0px;
  padding: 0px;
  list-style-type: none;
}
#navMenu li {
  width: 3.5em;
  text-align: center;
  display: inline-block;
  padding: 0.3em;
  margin: 0 0 0 1.5em;
  background-color: #d4cbab;
  border-radius: 10px 10px 0px 0px;
}
#navMenu a {
  text-decoration: none;
  color: #40371c;
  padding: 0;
  margin: 0;
}
#navMenu li:hover{
  background-color: #efefef;
  color: #40371c;
}

/* Top content CSS */

#top {
  width: 350px;
  height: 100px;
  margin: 0 auto;
  background-color: #efefef;
  border-radius: 10px 10px 0px 0px;
}
<div id="topContainer">
  <div id="menuContainer">
    <div id="navMenu">
      <ul>
        <li> 
            <a href="index.html" id="current">Home</a>
        </li>
        <li>
            <a href="#" id="contact">Contact</a>
        </li>
        <li>
            <a href="#" id="cart">Cart</a>
        </li>
      </ul>
    </div>
  </div>
  <div id="top">
    Hello
  </div>
</div>

我删除了一些不必要的代码。在这里你可以看到一个更好的结构,我们使用 li 元素作为要显示的块 in line:

#navMenu li {
  display: inline-block;
}

这是你需要定义列表元素(或菜单按钮)要水平显示在同一行的灵魂所在。

为此,我在 menuContainer 上留下了边距,以向您表明,无论您将它放在那里还是应该放在哪里都没有关系;在 topContainer.