最好的中心方式 on a page vertically and horizontally? [duplicate]

问题描述 投票:491回答:30

这个问题在这里已有答案:

<div>元素纵向和横向居中在页面上的最佳方法是什么?

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

html css alignment vertical-alignment centering
30个回答
683
投票

最好,最灵活的方式

我的demo on dabblet.com

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

这个技巧适用于任何大小的div

div {
	width: 100px;
	height: 100px;
	background-color: red;
	
	position: absolute;
	top:0;
	bottom: 0;
	left: 0;
	right: 0;
  	
	margin: auto;
}
<div></div>

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

11
投票

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

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

8
投票

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

样式:

<style>

    .table {
      display: table;
      height: 100%;
      margin: 0 auto;
    }
    .table-cell {
      display: table-cell;
      vertical-align: middle;      
    }
    .centered {
      background-color: red;
    }
  </style>

HTML:

<div class="table">
    <div class="table-cell"><div class="centered">centered</div></div>
</div>

DEMO:

看看这个demo


8
投票

在我看来使用Flex-box:

#parent {
  display: flex;
  justify-content: center;
  align-items: center;
}
<div id="parent">
  <div id="child">Hello World!</div>
</div>

您会看到只有三个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;
}
<div id="parent">
  <div id="child">Hello World!</div>
</div>

如果您想了解有关Flex-box的更多信息,可以访问W3SchoolsMDNCSS-Tricks获取更多信息。


6
投票
div {
    border-style: solid;
    position: fixed;
    width: 80%;
    height: 80%;
    left: 10%;
    top: 10%;
}

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


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

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

JS Fiddle Demo


5
投票

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

标记

<div class="container">
  <div class="outer">
    <div class="inner">
      <div class="centered">
        ...
      </div>
    </div>
  </div>
</div>

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

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>

结果看起来如此:


5
投票

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

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

5
投票

2018 way using 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;
    /*place-items is a shorthand for align-items and justify-items*/
    
    height: 200px;
    border: 1px solid black;
    background: gainsboro;
}

.child{
    background: white;
}
<div class="parent">
    <div class="child">Centered!</div>
</div>

125
投票

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

您可以在以下fiddle中看到一个示例。这是updated fiddle

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

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

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

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

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

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

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


4
投票

另一个答案是this

<div id="container"> 
    <div id="centered"> </div>
</div>

和css:

#container {
    height: 400px;
    width: 400px;
    background-color: lightblue;
    text-align: center;
}

#container:before {
    height: 100%;
    content: '';
    display: inline-block;
    vertical-align: middle;
}

#centered {
    width: 100px;
    height: 100px;
    background-color: blue;
    display: inline-block;
    vertical-align: middle;
    margin: 0 auto;
}

4
投票

我很惊讶尚未提及,但最简单的方法是使用视口大小设置高度,边距(和宽度,如果需要)。 您可能知道,视口的总高度= 100vh。 假设您希望容器的height占据屏幕的60%(60vh),您可以在顶部和底部边缘之间平均分配剩余部分(40vh),以便元素自动在中心对齐。 将margin-leftmargin-right设置为auto,将确保容器水平居中。

.container {
         width: 60vw; /*optional*/
         height: 60vh;
         margin: 20vh auto;
         background: #333;
 }
<div class="container">
</div>

4
投票

虽然我来不及,但这很简单。页面中心总是留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;
}
<div class="center-div">
  <h3>This is center div</h3>
</div>

3
投票

如果你知道你的div定义的大小,你可以使用calc

实例:https://jsfiddle.net/o8416eq3/

注意:仅当你在CSS中硬编码``div`的宽度和高度时才有效。

#target {
  position:fixed;
  top: calc(50vh - 100px/2);
  left: calc(50vw - 200px/2);
  width:200px;
  height:100px;
  background-color:red;
}
<div id='target'></div>

3
投票

在父母身上使用display:grid并将margin:auto设置为centrerd elemnt就可以了:

见下面的片段:

html,body {
  width :100%;
  height:100%;
  margin:0;
  padding:0;
}

.container {
  display:grid;
  height:90%;
  background-color:blue;
}

.content {
  margin:auto;
  color:white;
}
<div class="container">
  <div class="content"> cented div  here</div>
</div>

3
投票

div {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    -ms-transform: translate(-50%, -50%); /* IE 9 */
    -webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera */	    
}
<body>
    <div>Div to be aligned vertically</div>
</body>

position:正文中的绝对div

位置为绝对的元素;相对于最近定位的祖先定位(而不是相对于视口(主体标签)定位,如固定)。

然而;如果绝对定位元素没有定位祖先,它将使用文档正文,并随页面滚动一起移动。

来源:CSS position


3
投票

如果你们正在使用JQuery,你可以使用.position()来做到这一点;

<div class="positionthis"></div>

CSS

.positionthis {
    width:100px;
    height:100px;
    position: absolute;
    background:blue;
}

Javascript(JQuery)

$(document).ready(function () {
    $('.positionthis').position({
        of: $(document),
        my: 'center center',
        at: 'center center',
        collision: 'flip flip'
    });
});

的jsfiddle:http://jsfiddle.net/vx9gV/


2
投票

这个解决方案对我有用

    .middleDiv{
        position : absolute;
        height : 90%;
        bottom: 5%;
    }

(或高度:70%/底部:15%

身高:40%/底:30%...)


2
投票

浏览器是否支持它,使用translate功能强大。

position: absolute;
background-color: red;

width: 70%;     
height: 30%; 

/* The translate % is relative to the size of the div and not the container*/ 
/* 21.42% = ( (100%-70%/2) / 0.7 ) */
/* 116.666% = ( (100%-30%/2) / 0.3 ) */
transform: translate3d( 21.42%, 116.666%, 0);

1
投票

请在水平和垂直方向使用以下CSS属性作为中心对齐元素。这对我来说很好。

div {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0px;
  margin: auto;
  width: 100px;
  height: 100px;
}

83
投票

这种技术的简单性令人惊叹: (这种方法虽然有其含义,但是如果你只需要将元素置于中心,而不管内容的其余部分是什么,那就没关系。请小心使用)

标记:

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

和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不应该吗?


0
投票

对不起,迟到的回复最好的方法是

  div {
      position: fixed;
      top: 50%;
      left: 50%;
      margin-top: -50px;
      margin-left: -100px;
    }

margin-top和margin-left应该根据你的div框大小


67
投票

我会用translate

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

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

translate在某些情况下比translate3d更好,因为它得到了更多浏览器的支持。 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;
}
<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>

但请注意,此方法使此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;
}
<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>

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 */
}

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

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


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>

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

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

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


18
投票

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

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

<div class="center-block">this is any div</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),那么表格单元格是最常用的方法。


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;
}
<div class="outer-container">
   <div class="inner-container">
     <div class="centered-content">
        You can put anything here!
     </div>
   </div>
</div>

另见this Fiddle


编辑

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

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


14
投票
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%。

© www.soinside.com 2019 - 2024. All rights reserved.