在页面上垂直和水平居中<div>的最佳方法是什么?

509 html css alignment vertical-alignment centering

<div>在页面上垂直和水平居中元素的最佳方法是什么?

我知道这margin-left: auto; margin-right: auto;将以水平为中心,但垂直做的最佳方式是什么?

Vla*_*kov 696

最好,最灵活的方式

在dabblet.com上的演示

这个演示的主要技巧是在正常的元素流中从上到下,所以margin-top: auto设置为零.然而,绝对定位的元件作用为自由空间分布是相同的,并且类似地可以垂直于指定为中心top并且bottom(不IE7工作).

这个技巧适用于任何尺寸的div.

div {
	width: 100px;
	height: 100px;
	background-color: red;
	
	position: absolute;
	top:0;
	bottom: 0;
	left: 0;
	right: 0;
  	
	margin: auto;
}
Run Code Online (Sandbox Code Playgroud)
<div></div>
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案**仅在您的元素具有固定高度**时才有效.请参阅[tombul的答案](http://stackoverflow.com/a/18618259/34799),了解两个不会改变元素自然高度的解决方案. (94认同)
  • 这太棒了.我很想知道如何做到这一点.我用顶部尝试过它:0; 并且左:0;,但似乎添加了底部:0; 和右:0; 做一些改变.谢谢. (6认同)
  • 不适用于动态内容 (3认同)
  • @FlashThunder你建议非表数据表,不是吗? (2认同)
  • 优秀!我什至不知道 CSS 中存在 `bottom:` 和 `right:` ...... (2认同)

tom*_*bul 128

虽然OP在提出这个问题时没有用,但我认为,至少对于现代浏览器来说,最好的解决方案是使用display:flexpseudo class.

您可以在以下小提琴中看到一个示例.这是更新的小提琴.

对于伪类,一个例子可能是:

.centerPseudo {
    display:inline-block;
    text-align:center;
}

.centerPseudo::before{
    content:'';
    display:inline-block;
    height:100%;
    vertical-align:middle;
    width:0px;
}
Run Code Online (Sandbox Code Playgroud)

display:flex的用法,根据css-tricksMDN如下:

.centerFlex {
  align-items: center;
  display: flex;
  justify-content: center;
}
Run Code Online (Sandbox Code Playgroud)

还有其他可用于flex的属性,这些属性在上面提到的链接中进行了解释,并附有其他示例.

如果你必须支持不支持css3的旧浏览器,那么你应该使用javascript或其他答案中显示的固定宽度/高度解决方案.

  • 2012 - 2013年以上的所有浏览器都支持弹性框.从今天的角度来看,在大多数情况下将其用于新应用应该足够安全.我能想到的唯一情况是老模型应该首选的地方是依赖旧基础架构而无法升级的商业客户. (8认同)

rob*_*jez 87

这项技术的简单性令人惊叹:(
这种方法虽然有其含义,但如果您只需要将元素置于中心,无论其他内容的流量如何,它都可以.请小心使用)

标记:

<div>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum accumsan tellus purus, et mollis nulla consectetur ac. Quisque id elit at diam convallis venenatis eget sed justo. Nunc egestas enim mauris, sit amet tempor risus ultricies in. Sed dignissim magna erat, vel laoreet tortor bibendum vitae. Ut porttitor tincidunt est imperdiet vestibulum. Vivamus id nibh tellus. Integer massa orci, gravida non imperdiet sed, consectetur ac quam. Nunc dignissim felis id tortor tincidunt, a eleifend nulla molestie. Phasellus eleifend leo purus, vel facilisis massa dignissim vitae. Pellentesque libero sapien, tincidunt ut lorem non, porta accumsan risus. Morbi tempus pharetra ex, vel luctus turpis tempus eu. Integer vitae sagittis massa, id gravida erat. Maecenas sed purus et magna tincidunt faucibus nec eget erat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc nec mollis sem.</div>
Run Code Online (Sandbox Code Playgroud)

和CSS:

div {
  color: white;
  background: red;
  padding: 15px;
  position: absolute;
  top: 50%;
  left: 50%;
  -ms-transform: translateX(-50%) translateY(-50%);
  -webkit-transform: translate(-50%,-50%);
  transform: translate(-50%,-50%);
}   
Run Code Online (Sandbox Code Playgroud)

这也会使元素水平和垂直居中.没有负利润,只有转变的力量.我们也应该忘记IE8不应该吗?

  • 是的,我使用了很多这种方法......但是,如果元素比屏幕高度高得多("高度"未知),问题就会出现...中心元素的顶部会被切断.即使元素被放在父元素中,`overflow`被设置为`auto`或`scroll`.使用`flex`也是同样的问题.不幸的是,就像最后一次使用`table`来覆盖这个问题.只有当居中元素会更高,更高(动态填充). (6认同)

MDT*_*MAN 67

我会用translate:

首先将div的左上角定位在页面的中心(使用position: fixed; top: 50%; left: 50%).然后,translate将其向上移动div高度的50%,使其垂直居中于页面上.最后,translate还将div向右移动50%的宽度,使其水平居中.

我实际上认为这种方法比其他许多方法更好,因为它不需要对父元素进行任何更改.

translatetranslate3d由于它受到更多浏览器的支持,因此比某些情况更好.http://caniuse.com/#search=translate

总而言之,所有版本的Chrome,Firefox 3.5 +,Opera 11.5 +,所有版本的Safari,IE 9+和Edge都支持此方法.

.centered {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  
  font-size: 20px;
  background-color: cyan;
  border: darkgreen 5px solid;
  padding: 5px;
  z-index: 100;
}

table {
    position: absolute;
    top: 0;
    left: 0;
}

td {
    position: relative;
    top: 0;
    left: 0;
}
Run Code Online (Sandbox Code Playgroud)
<table>
<tr>
    <td>
        <div class="centered">This div<br />is centered</div>
        <p>
            Lorem ipsum dolor sit amet, nam sint laoreet at, his ne sumo causae, simul decore deterruisset ne mel. Exerci atomorum est ut. At choro vituperatoribus usu. Dico epicurei persequeris quo ex, ea ius zril phaedrum eloquentiam, duo in aperiam admodum fuisset. No quidam consequuntur usu, in amet hinc simul eos. Ex soleat meliore percipitur mea, nihil omittam salutandi ut eos. Mea et impedit facilisi pertinax, ea viris graeci fierent pri, te sonet intellegebat his. Vis denique albucius instructior ad, ex eum iudicabit elaboraret. Sit ea intellegam liberavisse. Nusquam quaestio maiestatis ut qui, eam decore altera te. Unum cibo aliquip ut qui, te mea doming prompta. Ex rebum interesset nam, te nam zril suscipit, qui suavitate explicari appellantur te. Usu brute corpora mandamus eu. Dicit soluta his eu. In sint consequat sed, quo ea tota petentium. Adhuc prompta splendide mel ad, soluta delenit nec cu.
        </p>
    </td>
    <td>
        <p>
            Lorem ipsum dolor sit amet, dico choro recteque te cum, ex omnesque consectetuer sed, alii esse utinam et has. An qualisque democritum usu. Ea has habeo labores, laoreet intellegat te mea. Eius equidem inermis vel ne. Ne eum sonet labitur, nec id natum munere. Primis graecis est cu, quis dictas eu mea, eu quem offendit forensibus nec. Id animal mandamus his, vis in sonet tempor luptatum. Ne civibus oporteat comprehensam vix, per facete discere atomorum eu. Mucius probatus volutpat sit an, sumo nominavi democritum eam ut. Ea sit choro graece debitis, per ex verear voluptua epicurei. Id eum wisi dicat, ea sit velit doming cotidieque, eu sea amet delenit. Populo tacimates dissentiunt has cu. Has wisi hendrerit at, et quo doming putent docendi. Ea nibh vide omnium usu.
        </p>
    </td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)

但请注意,此方法使此div在滚动页面时保持在一个位置.这可能是你想要的,但如果没有,还有另一种方法.


现在,如果我们尝试相同的CSS,但位置设置为绝对,它将位于具有绝对位置的最后一个父级的中心.

.centered {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);

  font-size: 20px;
  background-color: cyan;
  border: darkgreen 5px solid;
  padding: 5px;
  z-index: 100;
}

table {
    position: absolute;
    top: 0;
    left: 0;
}

td {
    position: relative;
    top: 0;
    left: 0;
}
Run Code Online (Sandbox Code Playgroud)
<table>
<tr>
    <td>
        <div class="centered">This div<br />is centered</div>
        <p>
            Lorem ipsum dolor sit amet, nam sint laoreet at, his ne sumo causae, simul decore deterruisset ne mel. Exerci atomorum est ut. At choro vituperatoribus usu. Dico epicurei persequeris quo ex, ea ius zril phaedrum eloquentiam, duo in aperiam admodum fuisset. No quidam consequuntur usu, in amet hinc simul eos. Ex soleat meliore percipitur mea, nihil omittam salutandi ut eos. Mea et impedit facilisi pertinax, ea viris graeci fierent pri, te sonet intellegebat his. Vis denique albucius instructior ad, ex eum iudicabit elaboraret. Sit ea intellegam liberavisse. Nusquam quaestio maiestatis ut qui, eam decore altera te. Unum cibo aliquip ut qui, te mea doming prompta. Ex rebum interesset nam, te nam zril suscipit, qui suavitate explicari appellantur te. Usu brute corpora mandamus eu. Dicit soluta his eu. In sint consequat sed, quo ea tota petentium. Adhuc prompta splendide mel ad, soluta delenit nec cu.
        </p>
    </td>
    <td>
        <p>
            Lorem ipsum dolor sit amet, dico choro recteque te cum, ex omnesque consectetuer sed, alii esse utinam et has. An qualisque democritum usu. Ea has habeo labores, laoreet intellegat te mea. Eius equidem inermis vel ne. Ne eum sonet labitur, nec id natum munere. Primis graecis est cu, quis dictas eu mea, eu quem offendit forensibus nec. Id animal mandamus his, vis in sonet tempor luptatum. Ne civibus oporteat comprehensam vix, per facete discere atomorum eu. Mucius probatus volutpat sit an, sumo nominavi democritum eam ut. Ea sit choro graece debitis, per ex verear voluptua epicurei. Id eum wisi dicat, ea sit velit doming cotidieque, eu sea amet delenit. Populo tacimates dissentiunt has cu. Has wisi hendrerit at, et quo doming putent docendi. Ea nibh vide omnium usu.
        </p>
    </td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)


小智 22

我认为有两种方法可以通过CSS使div中心对齐.

.middleDiv {
    position : absolute;    
    width    : 200px;
    height   : 200px;
    left     : 50%;
    top      : 50%;
    margin-left : -100px; /* half of the width  */
    margin-top  : -100px; /* half of the height */
}
Run Code Online (Sandbox Code Playgroud)

这是简单而好的方法.有关演示,请访问以下链接:

http://w3webpro.blogspot.in/2013/07/how-to-make-div-horizo​​ntally-and.html


Ula*_*ach 21

利用Flex Display的简单解决方案

 <div style = 'display:flex; position:absolute; top:0; bottom:0; right:0; left:0; '>
      <div id = 'div_you_want_centered' style = 'margin:auto;'> 
           This will be Centered 
      </div>
 </div>
Run Code Online (Sandbox Code Playgroud)

查看http://css-tricks.com/snippets/css/a-guide-to-flexbox/

第一个div占据整个屏幕并具有显示:为每个浏览器设置flex.第二个div(居中的div)利用了display:flex div其中margin:auto工作得非常出色.

注意 IE11 +兼容性.(IE10带前缀).


Kop*_*lyf 18

如果你正在寻找新的浏览器(IE10 +),

然后你可以利用transform属性来对齐中心的div.

<div class="center-block">this is any div</div>
Run Code Online (Sandbox Code Playgroud)

而css应该是这样的:

.center-block {
  top:50%;
  left: 50%;
  transform: translate3d(-50%,-50%, 0);
  position: absolute;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是你甚至不需要指定div的高度和宽度,因为它自己照顾.

此外,如果你想将div放在另一个div的中心,那么你可以只指定外部div的位置作为相对,然后这个CSS开始为你的div工作.

这个怎么运作:

当您将left和top指定为50%时,div将位于页面右下角的四分之一处,其左上端固定在页面的中心.这是因为,左/顶部属性(以%表示)是根据外部div的高度(在您的情况下,窗口)计算的.

但是变换使用元素的高度/宽度来确定平移,因此div将向左移动(50%宽度)和向上移动(高度为50%),因为它们以负数给出,因此将其与页面的中心对齐.

如果你必须支持旧的浏览器(并且抱歉包括IE9),那么表格单元格是最常用的方法.


Joh*_*ers 15

我喜欢垂直和水平对中框的方法是以下技巧:

外容器

  • 应该有 display: table;

内部容器

  • 应该有 display: table-cell;
  • 应该有 vertical-align: middle;
  • 应该有 text-align: center;

内容框

  • 应该有 display: inline-block;
  • 应该重新调整水平文本对齐,例如.text-align: left;或者text-align: right;,除非您希望文本居中

这种技术的优雅之处在于,您可以将内容添加到内容框中,而无需担心其高度或宽度!

演示

body {
    margin : 0;
}

.outer-container {
    position : absolute;
    display: table;
    width: 100%; /* This could be ANY width */
    height: 100%; /* This could be ANY height */
    background: #ccc;
}

.inner-container {
    display: table-cell;
    vertical-align: middle;
    text-align: center;
}

.centered-content {
    display: inline-block;
    text-align: left;
    background: #fff;
    padding : 20px;
    border : 1px solid #000;
}
Run Code Online (Sandbox Code Playgroud)
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        You can put anything here!
     </div>
   </div>
</div>
Run Code Online (Sandbox Code Playgroud)

另见这个小提琴!


编辑

是的,我知道你可以或多或少地获得相同的灵活性,transform: translate(-50%, -50%);或者transform: translate3d(-50%,-50%, 0);我提出的技术有更好的浏览器支持.即使使用浏览器前缀-webkit,-ms或者-moz,transform也不提供完全相同的浏览器支持.

因此,如果您关心旧浏览器(例如IE9及更低版本),则不应使用transform定位.


Ama*_*tle 14

position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
Run Code Online (Sandbox Code Playgroud)

说明:

给它一个绝对的定位(父母应该有相对定位).然后,左上角移动到中心.因为您还不知道宽度/高度,所以使用css变换将位置相对于中间转换.平移(-50%, - 50%)确实将左上角的x和y位置减小了宽度和高度的50%.

  • 虽然此代码可能有助于解决问题,但提供有关_why_和/或_how_的其他上下文可以回答问题,从而显着提高其长期价值.请[编辑]你的答案添加一些解释. (4认同)

And*_*ech 13

这是我后来写的一个脚本(它是使用jQuery库编写的):

var centerIt = function (el /* (jQuery element) Element to center */) {
    if (!el) {
        return;
    }
    var moveIt = function () {
        var winWidth = $(window).width();
        var winHeight = $(window).height();
        el.css("position","absolute").css("left", ((winWidth / 2) - (el.width() / 2)) + "px").css("top", ((winHeight / 2) - (el.height() / 2)) + "px");
    }; 
    $(window).resize(moveIt);
    moveIt();
};
Run Code Online (Sandbox Code Playgroud)

  • 可悲的是,OP没有要求JavaScript/jQuery解决方案. (13认同)

小智 11

这是水平和垂直居中div机器人的最佳代码

div
{
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);
}
Run Code Online (Sandbox Code Playgroud)


Mor*_*dri 9

在我看来使用Flex-box:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
Run Code Online (Sandbox Code Playgroud)
<div id="parent">
  <div id="child">Hello World!</div>
</div>
Run Code Online (Sandbox Code Playgroud)

您会看到只有三个CSS属性,您必须使用它们来垂直和水平居中子元素.display: center;通过激活Flex-box显示来完成主要部分,justify-content: center;垂直align-items: center;居中子元素并使其水平居中.为了看到最好的结果,我只需添加一些额外的样式:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 500px;
  width: 500px;
  background: yellow;
}

#child {
  width: 100px;
  height: 100px;
  background: silver;
}
Run Code Online (Sandbox Code Playgroud)
<div id="parent">
  <div id="child">Hello World!</div>
</div>
Run Code Online (Sandbox Code Playgroud)

如果您想了解有关Flex-box 的更多信息,可以访问W3Schools,MDNCSS-Tricks了解更多信息.


Asu*_*sur 8

我知道我迟到了,但这里有一种方法可以将未知维度的div放在未知维度的父级中心.

样式:

<style>

    .table {
      display: table;
      height: 100%;
      margin: 0 auto;
    }
    .table-cell {
      display: table-cell;
      vertical-align: middle;      
    }
    .centered {
      background-color: red;
    }
  </style>
Run Code Online (Sandbox Code Playgroud)

HTML:

<div class="table">
    <div class="table-cell"><div class="centered">centered</div></div>
</div>
Run Code Online (Sandbox Code Playgroud)

DEMO:

看看这个演示.


Mah*_*man 8

虽然我来不及,但这很简单.页面中心总是留50%,前50%.因此减去div宽度和高度50%并设置左边距和右边距.希望它适用于所有地方 -

body{
  background: #EEE;
}
.center-div{
  position: absolute;
  width: 200px;
  height: 60px;
  left: 50%;  
  margin-left: -100px;
  top: 50%;
  margin-top: -30px;
  background: #CCC;
  color: #000;
  text-align: center;
}
Run Code Online (Sandbox Code Playgroud)
<div class="center-div">
  <h3>This is center div</h3>
</div>
Run Code Online (Sandbox Code Playgroud)


小智 6

div {
    border-style: solid;
    position: fixed;
    width: 80%;
    height: 80%;
    left: 10%;
    top: 10%;
}
Run Code Online (Sandbox Code Playgroud)

相对于宽度和高度调整左侧和顶部,即(100% - 80%)/ 2 = 10%


gio*_*gio 6

实际上有一个解决方案,使用css3,它可以垂直居中一个未知高度的div.诀窍是将div降低50%,然后使用transformY它将其恢复到中间位置.唯一的先决条件是以中心为中心的元素具有父元素.例:

<div class="parent">
    <div class="center-me">
        Text, images, whatever suits you.
    </div>
</div>

.parent { 
    /* height can be whatever you want, also auto if you want a child 
       div to be responsible for the sizing */ 
    height: 200px;
}

.center-me { 
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* prefixes needed for cross-browser support */
    -ms-transform: translateY(-50%);
    -webkit-transform: translateY(-50%);
}
Run Code Online (Sandbox Code Playgroud)

由所有主流浏览器和IE 9及以上版本支持(不要担心IE 8,因为它在今年秋天与win xp一起死亡.感谢上帝.)

JS小提琴演示


rob*_*jez 5

使用'display:table'规则从这里采取的另一种方法(防弹):

标记

<div class="container">
  <div class="outer">
    <div class="inner">
      <div class="centered">
        ...
      </div>
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

.outer {
  display: table;
  width: 100%;
  height: 100%;
}
.inner {
  display: table-cell;
  vertical-align: middle;
  text-align: center;
}
.centered {
  position: relative;
  display: inline-block;

  width: 50%;
  padding: 1em;
  background: orange;
  color: white;
}
Run Code Online (Sandbox Code Playgroud)

  • @FlashThunder - 更新你的知识(我用下面的变换获得了新技术的第二个答案)并最终停止使用表格进行布局;) (2认同)

Teb*_*ebe 5

我正在查看Laravel的视图文件,并注意到它们将文本完美地置于中间.我立刻想起了这个问题.他们是这样做的:

<html>
<head>
    <title>Laravel</title>

    <!--<link href='//fonts.googleapis.com/css?family=Lato:100' rel='stylesheet' type='text/css'>-->

    <style>
        .container {
            margin: 0;
            padding: 0;
            width: 100%;
            height: 100%;
            display: table;

        }

        .inside {
            text-align: center;
            display: table-cell;
            vertical-align: middle;
        }


    </style>
</head>
<body>
    <div class="container">
            <div class="inside">This text is centered</div>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

结果看起来如此:

在此输入图像描述


小智 5

仅使用两行CSS,利用Flexbox的神奇力量

.parent { display: flex; }
.child { margin: auto }
Run Code Online (Sandbox Code Playgroud)


1va*_*dis 5

2018年使用CSS Grid的方式:

.parent{
    display: grid;
    place-items: center center;
}
Run Code Online (Sandbox Code Playgroud)

检查浏览器支持,Caniuse建议它可以在Chrome 57,FF 52,Opera 44,Safari 10.1,Edge 16上运行。我没有检查自己。

请参见下面的代码段:

.parent{
    display: grid;
    place-items: center center;
}
Run Code Online (Sandbox Code Playgroud)
.parent{
    display: grid;
    place-items: center center;
    /*place-items is a shorthand for align-items and justify-items*/
    
    height: 200px;
    border: 1px solid black;
    background: gainsboro;
}

.child{
    background: white;
}
Run Code Online (Sandbox Code Playgroud)