当前位置:  开发笔记 > 前端 > 正文

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

如何解决《在页面上垂直和水平居中<div>的最佳方法是什么?》经验,为你挑选了19个好方法。

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

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



1> Vladimir Sta..:

最好,最灵活的方式

我在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;
}


2> tombul..:

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

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

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

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

.centerPseudo::before{
    content:'';
    display:inline-block;
    height:100%;
    vertical-align:middle;
    width:0px;
}

display:flex的用法,根据css-tricks和MDN如下:

.centerFlex {
  align-items: center;
  display: flex;
  justify-content: center;
}

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

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


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

3> robjez..:

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

标记:

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.

和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%);
}   

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


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

4> MDTech.us_MA..:

我会用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;
}
This div
is centered

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.

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.



5> 小智..:

我认为有两种方法可以通过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 */
}

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

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



6> Ulad Kasach..:

利用Flex Display的简单解决方案

 
This will be Centered

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

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

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



7> Kop4lyf..:

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

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

this is any div

而css应该是这样的:

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

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

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

这个怎么运作:

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

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

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



8> John Slegers..:

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

外容器

应该有 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;
}
You can put anything here!


9> AmazingTurtl..:
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);

说明:

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


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

10> Andreas Grec..:

这是我后来写的一个脚本(它是使用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();
};


可悲的是,OP没有要求JavaScript/jQuery解决方案.

11> 小智..:

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

div
{
  position:absolute;
  top:50%;
  left:50%;
  transform:translate(-50%,-50%);
}


12> 小智..:

在我看来使用Flex-box:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
Hello World!


13> Asur..:

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

样式:


HTML:

centered

DEMO:

看看这个演示.



14> 小智..:
div {
    border-style: solid;
    position: fixed;
    width: 80%;
    height: 80%;
    left: 10%;
    top: 10%;
}

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



15> giorgio..:

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

Text, images, whatever suits you.
.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%); }

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

JS小提琴演示



16> robjez..:

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

标记

...

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;
}


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

17> Tebe..:

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



    Laravel

    

    


    
This text is centered

结果看起来如此:

在此输入图像描述



18> 小智..:

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

.parent { display: flex; }
.child { margin: auto }



19> 1valdis..:
2018年使用CSS Grid的方式:
.parent{
    display: grid;
    place-items: center center;
}

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

请参见下面的代码段:

.parent{
    display: grid;
    place-items: center center;
}
.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;
}
推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!