【问题标题】:Margins and absolute position not working correctly边距和绝对位置无法正常工作
【发布时间】:2013-07-09 16:13:28
【问题描述】:

我有一个名为 menu 的 div,在其中我想要一个导航栏 div 和一个搜索 div。我希望导航保持在菜单 div 的中心,搜索 div 向左(或向右)。我试过这段代码,但是当我将位置设置为绝对时,将导航的左右边距设置为自动不起作用。

CSS 代码:

.menu{
    width: 100%;
    height: 65px;
    margin-bottom: 0.5%;
}

.search{
        width: 300px;
    height: 65px;
        float:left;
    z-index: 1;
    position:absolute;
}

.navigation{
    height: 65px;
    margin-left: auto;
    margin-right: auto;
    z-index: 0;
    display:inline-block;
    position: absolute;
}

HTML 代码:

<div class="menu">
    <div class="navigation"> 
        .
        .
        .
    </div>

    <div class="search">
        .
        .
        .
    </div>
</div>

【问题讨论】:

  • 为什么需要绝对位置?
  • 因为如果我删除该行,导航 div 会粘在搜索 div 上。

标签: html css css-position margins


【解决方案1】:

如果您想导航到菜单中心(保持在中心)。试试这个:

.menu{
    width: 100%;
    height: 65px;
    margin-bottom: 0.5%;
    margin-top:5px;
}

.search{
    width: 300px;
    height: 65px;
    float:left;
    z-index: 1;

}

.navigation{
    width:300px; /* you can change this */
    left: 50%; /* you can change this */
    margin-left: -150px; /* you can change this */
    height: 65px;
    display:inline-block;
    position: absolute;

}

cssdeck

  1. 首先,left: 50%。这会将导航的左侧边缘移动到中心。

  2. 使用一半宽度的负左边距(导航 div 的宽度:300px)。在我们的示例中,必须将 margin-left 设置为 -150px 才能将框移回正确的位置

2015 年更新

不用'position'也可以,可以用flexbox

.menu {
  width: 100%;
  height: 65px;
  margin-top: 5px;
  display: -webkit-flex;
  display: flex;
  -webkit-flex-wrap: wrap;
  flex-wrap: wrap;
  -webkit-justify-content: center;
  justify-content: center;
}

.search{
  width: 300px;
  height: 65px;
  margin-left:10px;
}

.navigation{
  width:300px;
  height: 65px;
  margin:0 auto;
  margin-left:220px;
}
.navigation ul {
  list-style:none;
  margin-top:5px;
}
.navigation ul li {
  float:left;
  margin-left:5px;
  border:solid 1px;
}

cssdeck 2

【讨论】:

  • 谢谢!有效!你能告诉我你为什么设置margin-left:-150px吗?那是怎么工作的?我的意思是为什么 -150px?
  • 在我的风格中,我设置了导航宽度300px,为了平衡div(导航)的位置,我应该使用宽度导航的一半margin-left 并设置为负值。更新答案
  • 有趣...但我使用了 display:inline-block;根据其内容设置导航 div 的宽度。它可能是中心但不完全在中心
  • 为什么需要绝对位置?因为我没有看到任何顶部/左侧/右侧/底部?
  • @AliBordbar : 如果你想准确定位中心,你可以改变宽度和左边距。
【解决方案2】:

position: absolute 不适用于浮动。您必须实际设置左侧和顶部的像素,您想要绝对定位的元素。

听起来你甚至不需要绝对定位,

http://codepen.io/anon/pen/KtgBa

【讨论】:

  • 如果我不使用绝对值,导航 div 会在搜索 div 之后立即出现。如果没有 auto 或 text-align:center
  • position:absolute 与边距无关。如果您希望导航保持在页面中心,请将其设置为 margin:0 auto;,如果您希望搜索保持在左侧,请将其设置为 float:left;。不需要任何立场:绝对。您仍然可以在没有仓位的情况下获得保证金。
  • 我试过你说的。导航 div 就在搜索 div 旁边,而不是在页面中间!
  • 为导航添加宽度
【解决方案3】:

我认为 user2391454 让您走上了正确的道路。位置有时会令人困惑,但完全忽略它可能会对您有所帮助。取出你在 CSS 中的所有位置,看看是否有效。

让我们知道。

【讨论】:

  • 如果我不使用绝对,导航 div 会在搜索 div 之后而不是在页面中心
  • 尝试离开该位置进行导航,而不是其他位置。此外,导航和搜索必须在 div 内是否有原因?因为您的另一个选择是将其从“菜单” div 中取出并将它们放置在包装器中。
【解决方案4】:

由于在您的情况下您可以指定宽度,因此使用内联块而不是浮点数总是更好。希望这会有所帮助

http://jsfiddle.net/Bhx4Z/2/

    .menu{
    width: 100%;
    height: 65px;
    margin-bottom: 0.5%;
    letter-spacing: -0.31em;
    }

   .search{
    width: 300px;
    height: 65px;
    float:left;
    z-index: 1;
    border:1px solid green;
    letter-spacing: normal;
}

   .navigation{
    height: 65px;
    margin-left: auto;
    margin-right: auto;
    z-index: 0;
    display:inline-block;
    letter-spacing: normal;
    text-align:right;
    border:1px solid blue;
}

【讨论】:

  • 谢谢,但导航 div 不在页面中心!