如何在 100% 宽度的 div 内水平居中绝对定位的元素? [复制]

Posted

技术标签:

【中文标题】如何在 100% 宽度的 div 内水平居中绝对定位的元素? [复制]【英文标题】:How do I horizontally center an absolute positioned element inside a 100% width div? [duplicate] 【发布时间】:2013-05-21 10:05:28 【问题描述】:

在下面的示例中,#logo 是绝对定位的,我需要它在#header 内水平居中。通常,我会为相对定位的元素执行margin:0 auto,但我被困在这里。谁能给我指路?

JS 小提琴:http://jsfiddle.net/DeTJH/

html

<div id="header">
    <div id="logo"></div>
</div>

CSS

#header 
    background:black;
    height:50px;
    width:100%;


#logo 
    background:red;
    height:50px;
    position:absolute;
    width:50px

【问题讨论】:

好问题... align: center 发生了什么 ;)... 不要尝试,因为它不起作用 ;) 嘿,您是否意识到,使用这样的 CSS,您将徽标定位在窗口中,而不是在标题中? @Desi margin 自动工作,你需要正确使用它看我的例子 也检查一下,***.com/a/21446727/567854 【参考方案1】:

如果您想在左侧属性上对齐中心。 顶部对齐也是一样,你可以使用 margin-top: (width/2 of your div),这个概念和 left 属性是一样的。 将标题元素设置为 position:relative 很重要。 试试这个:

#logo 
    background:red;
    height:50px;
    position:absolute;
    width:50px;
    left:50%;
    margin-left:-25px;

DEMO

如果您不想使用计算,可以这样做:

#logo 
  background:red;
  width:50px;
  height:50px;
  position:absolute;
  left: 0;
  right: 0;
  margin: 0 auto;

DEMO2

【讨论】:

左:0;对:0;为我做了伎俩。谢谢@Alessandro 很容易忘记的重要注意事项,必须设置宽度才能这样工作 这也能解释一下吗?为什么 left/right:0 + margin-left/right:0 + 具有定义的宽度使这项工作有效?【参考方案2】:

您必须为margin: auto 分配leftright 属性0 值以使徽标居中。

所以在这种情况下:

#logo 
  background:red;
  height:50px;
  position:absolute;
  width:50px;
  left: 0;
  right: 0;
  margin: 0 auto;

您可能还想将position: relative 设置为#header

之所以有效,是因为将leftright 设置为零将水平拉伸绝对定位的元素。现在,当margin 设置为auto 时,奇迹发生了。 margin 占用所有额外空间(在每一侧均等),将内容留给其指定的width。这会导致内容居中对齐。

【讨论】:

我喜欢这个比用边距偏移要好得多,因为它适用于动态宽度。 你能解释一下,为什么会这样吗?? leftright 设置为零将水平拉伸绝对定位的元素。现在,当margin 设置为auto 时,奇迹发生了。 margin 占用了所有额外的空间(每边相等),将内容留给它指定的 width。这会导致内容居中对齐。 @davidmdem 它并不总是适用于动态宽度(除非您添加子 div)。例如,考虑一个仅包含文本的 div...【参考方案3】:

没有在答案中使用calc,这是一个更简洁的解决方案。

#logo 
  position: absolute;
  left: calc(50% - 25px);
  height: 50px;
  width: 50px;
  background: red;

适用于大多数现代浏览器:http://caniuse.com/calc

也许在没有后备的情况下使用它还为时过早,但我认为这对未来的访问者可能会有所帮助。

【讨论】:

我认为 Clac 函数中的公式,似乎与 margin-left:-50px; 相同; 差异是错误的:你必须减去元素宽度的一半......在这种情况下左:calc(50% - 25px); 你是对的。谢谢!现在更新了。【参考方案4】:

根据我的经验,最好的方法是right:0;left:0;margin:0 auto。这样,如果 div 很宽,那么您就不会受到 left: 50%; 的阻碍,这会抵消您的 div 从而导致添加负边距等。

演示http://jsfiddle.net/kevinphpkevin/DeTJH/4/

#logo 
    background:red;
    height:50px;
    position:absolute;
    width:50px;
    margin:0 auto;
    right:0;
    left:0;

【讨论】:

是的,我曾经在这里说过同样的话***.com/a/16758185/1571437:D 谢谢,我更喜欢这种方法,因为它允许您在项目上设置动态尺寸,问候!【参考方案5】:

这是将 div 居中为绝对位置的最佳实践方法

DEMO FIDDLE

代码--

#header 
background:black;
height:90px;
width:100%;
position:relative; // you forgot this, this is very important


#logo 
background:red;
height:50px;
position:absolute;
width:50px;
margin: auto; // margin auto works just you need to put top left bottom right as 0
top:0;
bottom:0;
left:0;
right:0;

【讨论】:

【参考方案6】:

很简单,只需像这样将它包装在一个相对的盒子中:

<div class="relative">
 <div class="absolute">LOGO</div>
</div>

相对框有一个边距:0 Auto; 而且,重要的是,宽度...

【讨论】:

哇,太棒了!不敢相信有这么多方法可以使绝对定位的 div 居中,但是这绝对比设置负边距更好,并且也适用于任何宽度!

以上是关于如何在 100% 宽度的 div 内水平居中绝对定位的元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有绝对定位的情况下将主体元素内的 div 垂直和水平居中? [复制]

如何让DIV里面的DIV水平垂直居中

让DIV中的内容水平和垂直居中

如何制作垂直和水平居中的盒装div容器[重复]

CSS - 将 div 固定到顶部中心

使用最大宽度和绝对定位将流体 DIV 居中