中心对齐固定位置div


126

我正在尝试使div position:fixed在页面上居中对齐。

我始终能够使用此“ hack”与绝对定位的div做到这一点

left: 50%; width: 400px; margin-left:-200px

...其中margin-left的值是div宽度的一半。

这似乎不适用于固定位置的div,而只是将其最左角放置在50%处,而忽略margin-left声明。

关于如何解决此问题的任何构想,以便我可以使固定定位的元素居中对齐?

如果您能告诉我一种比上面概述的方法更好地居中对齐绝对定位元素的方法,我将提供额外的M&M。


为我工作。除IE6外,其他所有功能(显然)。
bobince 2010年

@Kyle,如果您可以选择答案,它将帮助其他用户找到您问题的解决方案。
andreihondrari

Answers:


200

Koen的答案并不能使元素居中。

正确的方法是使用CCS3 transform属性。尽管某些旧版浏览器不支持。而且,我们甚至不需要设置固定的或相对的width

.centered {
    position: fixed;
    left: 50%;
    transform: translate(-50%, 0);
}

这里工作jsfiddle比较。


1
那很完美。我将其用于cordova应用程序,并有望在主要的更新浏览器中运行:)
saurabh 2015年

2
非常简单,但完全有用。谢谢。
GilbertoSánchez'15

哇谢谢!我一直试图在两个不均匀的div之间居中放置文本,这是唯一在不破坏标记的情况下起作用的文本!
Andrey Kaipov

4
实际答案+1
sn3ll

3
@Alex left: 50%将div移至页面的50%。但您必须记住,它是从div的左侧开始移动的,因此div尚未居中。translate(-50%, 0)这基本上是translateX(-50%)是考虑div的当前宽度,并将其宽度的-50%从实际位置移到左侧。
emil.c

168

对于具有相同问题但采用响应式设计的用户,也可以使用:

width: 75%;
position: fixed;
left: 50%;
margin-left: -37.5%;

div即使采用响应式设计,这样做也将始终使您的固定内容在屏幕上居中。


2
这帮助我完成了RWD项目:)
tctc91

6
这些37.5%的来源是什么?
奥罗拉2014年

7
@aurora-这是位置设置的-1/2(所以-(75/2)在这种情况下)
Inaimathi 2014年

1
为什么这个公认的答案不是一个谜,它只是有效(tm)
CGK 2014年

2
Cropis有更好的解决方案
Arnaldo Capo

44

您也可以为此使用flexbox。

.wrapper {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  
  /* this is what centers your element in the fixed wrapper*/
  display: flex;
  flex-flow: column nowrap;
  justify-content: center; /* aligns on vertical for column */
  align-items: center; /* aligns on horizontal for column */
  
  /* just for styling to see the limits */
  border: 2px dashed red;
  box-sizing: border-box;
}

.element {
  width: 200px;
  height: 80px;

  /* Just for styling */
  background-color: lightyellow;
  border: 2px dashed purple;
}
<div class="wrapper"> <!-- Fixed element that spans the viewport -->
  <div class="element">Your element</div> <!-- your actual centered element -->
</div>


12
为什么不愿意提到center和align =“ center”?text-align:center是其中的方式
wlf 2012年

1
您应该在示例中包括文本对齐样式。
Manatax 2014年

非常感谢!这真的帮了我!
Joan.bdm

我已经删除了<center>不推荐使用的内容,并使用了诸如display: flex和和一些相关属性之类的现代技术,从而改变了答案。
andreihondrari

33

从上面的帖子中,我认为最好的方法是

  1. 有一个固定的div width: 100%
  2. 在div内,使用margin-left: auto和新建一个静态div margin-right: auto,或者对于table使其成为align="center"
  3. 塔达阿,您现在已将固定div居中

希望这会有所帮助。


2
如果您还需要将div以固定宽度居中,则+1非常有用。例如990像素。
dcernahoschi

这也是我知道允许max-widths用于固定位置元素的唯一方法。您是否需要固定的侧边栏以占您max-width: 1200px网页的30%作为响应?这将带您到那里。
迈克尔

7

普通div应该使用margin-left: automargin-right: auto,但不适用于固定div。解决该问题的方法类似于安德鲁的答案,但不使用已弃用的<center>东西。基本上,只需给固定div一个包装即可。

#wrapper {
    width: 100%;
    position: fixed;
    background: gray;
}
#fixed_div {
    margin-left: auto;
    margin-right: auto;
    position: relative;
    width: 100px;
    height: 30px;
    text-align: center;
    background: lightgreen;
}
<div id="wrapper">
    <div id="fixed_div"></div>
</div

这将使div内的固定div居中,同时允许div与浏览器反应。也就是说,如果有足够的空间,div将居中,但如果没有足够的空间,它将与浏览器的边缘碰撞;类似于常规居中div的反应。


4

如果要垂直和水平对齐居中对齐固定位置div,请使用此选项

position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);

3

我想如果您知道宽度为400像素,这将是最简单的方法。

 left: calc(50% - 200px);

3
<div class="container-div">
  <div class="center-div">

  </div>
</div>

.container-div {position:fixed; left: 0; bottom: 0; width: 100%; margin: 0;}
.center-div {width: 200px; margin: 0 auto;}

这应该做相同的。


2

如果您希望元素像另一个导航栏一样跨页面显示,则此方法有效。

宽度:计算(宽度:100%-宽度,无论其他偏离中心)

例如,如果您的侧面导航栏为200px:

宽度:calc(100%-200px);


1

使用宽度很容易:70%;左:15%;

将元素宽度设置为窗口的70%,两侧留15%


1

我在Twitter Bootstrap(v3)中使用了以下内容

<footer id="colophon" style="position: fixed; bottom: 0px; width: 100%;">
    <div class="container">
        <p>Stuff - rows - cols etc</p>
    </div>
</footer>

即制作一个固定位置的全宽元素,然后将容器推入其中,容器相对于整个宽度居中。也应该反应良好。


0

一种使用弹性盒的解决方案;完全响应:

parent_div {
    position: fixed;
    width: 100%;
    display: flex;
    justify-content: center;
}

child_div {
    /* whatever you want */
}

-1

如果您不想使用包装方法。那么您可以执行以下操作:

.fixed_center_div {
  position: fixed;
  width: 200px;
  height: 200px;
  left: 50%;
  top: 50%;
  margin-left: -100px; /* 50% of width */
  margin-top: -100px; /* 50% of height */
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.