如何水平居中元素

Posted

技术标签:

【中文标题】如何水平居中元素【英文标题】:How to horizontally center an element 【发布时间】:2010-09-11 23:42:57 【问题描述】:

如何使用 CSS 在另一个 <div> 中水平居中 <div>

<div id="outer">
  <div id="inner">Foo foo</div>
</div>

【问题讨论】:

在那些很棒的答案中,我只想强调你必须给“#inner”一个“宽度”,否则它将是“100%”,你无法判断它是否已经居中. 【参考方案1】:

您可以将此 CSS 应用到内部 &lt;div&gt;:

#inner 
  width: 50%;
  margin: 0 auto;

当然,您不必将width 设置为50%。任何小于包含 &lt;div&gt; 的宽度都可以使用。 margin: 0 auto 是实际居中的位置。

如果您的目标是 Internet Explorer 8(及更高版本),最好使用这个:

#inner 
  display: table;
  margin: 0 auto;

它将使内部元素水平居中,并且无需设置特定的width即可工作。

这里的工作示例:

#inner 
  display: table;
  margin: 0 auto;
  border: 1px solid black;


#outer 
  border: 1px solid red;
  width:100%
<div id="outer">
  <div id="inner">Foo foo</div>
</div>

编辑

使用flexbox 可以很容易地设置 div 水平和垂直居中的样式。

#inner   
  border: 1px solid black;


#outer 
  border: 1px solid red;
  width:100%;
  display: flex;
  justify-content: center;
<div id="outer">
  <div id="inner">Foo foo</div>
</div>

要将 div 垂直居中对齐,请使用属性align-items: center

【讨论】:

对于垂直居中,我通常使用“line-height”(line-height == height)。这很简单也很好,但它只适用于单行内容文本:) 您必须在您的 html 页面上使用 !DOCTYPE 标签才能使其在 IE 上正常运行。 请注意,可能需要添加“float:none;”对于#inner。 您还将顶部和底部边距设置为 0,这是不相关的。最好把margin-left: auto; margin-right: auto 我认为。 不一定是margin:0 auto:可以是margin: &lt;whatever_vertical_margin_you_need&gt; auto第二个是水平边距。【参考方案2】:

如果你不给它一个宽度,它就不能居中。否则,默认情况下会占用整个水平空间。

【讨论】:

如果您不知道宽度?说是因为内容是动态的? 最大宽度?那怎么样? 我使用width: fit-content;margin: 0 auto。我认为这可以用于未知宽度。【参考方案3】:

设置width 并将margin-leftmargin-right 设置为auto。不过,这仅适用于横向。如果你想要两种方式,你就两种方式都做。不要害怕尝试;你不会破坏任何东西。

【讨论】:

【参考方案4】:

如果您不想在内部 div 上设置固定宽度,您可以执行以下操作:

#outer 
  width: 100%;
  text-align: center;


#inner 
  display: inline-block;
<div id="outer">  
    <div id="inner">Foo foo</div>
</div>

这使得内部div 成为一个内联元素,可以以text-align 为中心。

【讨论】:

@SabaAhang 正确的语法是 float: none; 并且可能只需要因为 #inner 从 CSS 中的其他位置继承了 floatleftright 这是一个不错的解决方案。请记住,inner 将继承 text-align,因此您可能需要将 inner 的 text-align 设置为 initial 或其他值。 但是这个问题不是与完全居中 div 而不仅仅是文本有关吗?可以使用 text-align 来居中对齐 div 吗?还是仅用于文本?【参考方案5】:

我最近不得不将一个“隐藏”的 div(即display:none;)居中,其中有一个表格形式,需要在页面上居中。我编写了以下 jQuery 代码来显示隐藏的 div,然后将 CSS 内容更新为自动生成的表格宽度并将边距更改为居中。 (显示切换是通过单击链接触发的,但此代码不是显示所必需的。)

注意:我正在分享这段代码,因为谷歌把我带到了这个 Stack Overflow 解决方案,除了隐藏元素没有任何宽度并且不能调整大小之外,一切都会正常工作/在它们显示之前居中。

$(function()
  $('#inner').show().width($('#innerTable').width()).css('margin','0 auto');
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inner" style="display:none;">
  <form action="">
    <table id="innerTable">
      <tr><td>Name:</td><td><input type="text"></td></tr>
      <tr><td>Email:</td><td><input type="text"></td></tr>
      <tr><td>Email:</td><td><input type="submit"></td></tr>
    </table>
  </form>
</div>

【讨论】:

【参考方案6】:

#centered 
  position: absolute;
  left: 50%;
  margin-left: -100px;
<div id="outer" style="width:200px">
  <div id="centered">Foo foo</div>
</div>

确保父元素是positioned,即相对、固定、绝对或粘性。

如果不知道 div 的宽度,可以使用transform:translateX(-50%); 代替负边距。

使用CSS calc(),代码可以变得更简单:

.centered 
  width: 200px;
  position: absolute;
  left: calc(50% - 100px);

原理还是一样的;将项目放在中间并补偿宽度。

【讨论】:

我不喜欢这个解决方案,因为当内部元素对于屏幕来说太宽时,您无法水平滚动整个元素。 margin: 0 auto 效果更好。 左边距:自动;边距右:自动;居中一个块级元素 大多数块级元素的默认宽度是自动的,它会填充屏幕上的可用区域。只是居中将其放置在与左对齐相同的位置。如果你希望它在视觉上居中,你应该设置一个宽度(或一个最大宽度,尽管 Internet Explorer 6 和更早版本不支持这个,IE 7 只在标准模式下支持它)。【参考方案7】:

CSS 3's box-align property

#outer 
    width: 100%;
    height: 100%;
    display: box;
    box-orient: horizontal;
    box-pack: center;
    box-align: center;

【讨论】:

【参考方案8】:

如果您不想设置固定宽度并且不想要额外的边距,请将display: inline-block 添加到您的元素中。

你可以使用:

#element 
    display: table;
    margin: 0 auto;

【讨论】:

我也用过这个,但我以前从未遇到过display: table;。它有什么作用?【参考方案9】:

对于 Firefox 和 Chrome:

<div style="width:100%;">
  <div style="width: 50%; margin: 0px auto;">Text</div>
</div>

对于 Internet Explorer、Firefox 和 Chrome:

<div style="width:100%; text-align:center;">
  <div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>

text-align: 属性对于现代浏览器是可选的,但在 Internet Explorer Quirks Mode 中它是必需的以支持旧版浏览器。

【讨论】:

text-align 实际上是它在 IE 快速模式下工作所必需的,所以如果你不介意添加一个小表达式来支持旧浏览器,请保留它。 (带有 IE8 规则的 IE8 和 IE7 规则都可以在没有 text-align 的情况下工作,所以可能只有 IE6 和更早的版本有问题)【参考方案10】:

最好的方法是使用CSS 3。

盒子模型:

#outer 
  width: 100%;
  /* Firefox */
  display: -moz-box;
  -moz-box-pack: center;
  -moz-box-align: center;
  /* Safari and Chrome */
  display: -webkit-box;
  -webkit-box-pack: center;
  -webkit-box-align: center;
  /* W3C */
  display: box;
  box-pack: center;
  box-align: center;


#inner 
  width: 50%;
<div id="outer">
  <div id="inner">Foo foo</div>
</div>

根据您的可用性,您也可以使用box-orient, box-flex, box-direction 属性。

弹性

#outer 
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;

阅读有关使子元素居中的更多信息

Link 2

Link 3

Link 4

这就解释了为什么盒子模型是最好的方法

Why is the W3C box model considered better?

【讨论】:

Safari,到目前为止,仍然需要 -webkit flexbox 标志(display: -webkit-flex;-webkit-align-items: center;-webkit-justify-content: center; 我一直认为使用很多代码是不好的做法,例如使用此代码我将 div 居中: display: table;边距:自动;简单易行【参考方案11】:

居中:自动宽度边距

此框通过将其左右边距宽度设置为“自动”来水平居中。这是使用 CSS 实现水平居中的首选方式,并且在大多数支持 CSS 2 的浏览器中都能很好地工作。不幸的是,Internet Explorer 5/Windows 没有响应这种方法——这是浏览器的缺点,而不是技术。

有一个简单的解决方法。 (在你抵抗那个词引起的恶心时停顿了一下。)准备好了吗? Internet Explorer 5/Windows 错误地将 CSS“文本对齐”属性应用于块级元素。为包含的块级元素(通常是 BODY 元素)声明“text-align:center”,使 Internet Explorer 5/Windows 中的框水平居中。

这种解决方法有一个副作用:继承了 CSS“text-align”属性,将内联内容居中。通常需要为居中的框显式设置“文本对齐”属性,以抵消 Internet Explorer 5/Windows 解决方法的影响。相关的 CSS 如下。

body 
    margin: 50px 0px;
    padding: 0px;
    text-align: center;


#Content 
    width: 500px;
    margin: 0px auto;
    text-align: left;
    padding: 15px;
    border: 1px dashed #333;
    background-color: #EEE;

http://bluerobot.com/web/css/center1.html

【讨论】:

这不是div居中,而是文本居中。【参考方案12】:

我通常的做法是使用绝对位置:

#inner
  left: 0;
  right: 0;
  margin-left: auto;
  margin-right: auto;
  position: absolute;

外部 div 不需要任何额外的属性即可工作。

【讨论】:

如果您在居中的 div 下方有其他 div,这可能不起作用。【参考方案13】:

一些发帖人提到了使用 display:box 居中的 CSS 3 方式。

此语法已过时,不应再使用。 [另见this post]。

因此,为了完整起见,这里是使用 Flexible Box Layout Module 在 CSS 3 中居中的最新方法。

因此,如果您有简单的标记,例如:

<div class="box">
  <div class="item1">A</div>
  <div class="item2">B</div>
  <div class="item3">C</div>
</div>

...并且您想将您的项目置于框内,这就是您需要的父元素 (.box):

.box 
    display: flex;
    flex-wrap: wrap; /* Optional. only if you want the items to wrap */
    justify-content: center; /* For horizontal alignment */
    align-items: center; /* For vertical alignment */

.box 
  display: flex;
  flex-wrap: wrap;
  /* Optional. only if you want the items to wrap */
  justify-content: center;
  /* For horizontal alignment */
  align-items: center;
  /* For vertical alignment */

* 
  margin: 0;
  padding: 0;

html,
body 
  height: 100%;

.box 
  height: 200px;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  border: 2px solid tomato;

.box div 
  margin: 0 10px;
  width: 100px;

.item1 
  height: 50px;
  background: pink;

.item2 
  background: brown;
  height: 100px;

.item3 
  height: 150px;
  background: orange;
<div class="box">
  <div class="item1">A</div>
  <div class="item2">B</div>
  <div class="item3">C</div>
</div>

如果您需要支持使用旧语法的旧浏览器,那么 flexbox here's 是个好地方。

【讨论】:

“语法已过时”是什么意思,是否已弃用? Flexbox 规范经历了 3 次重大修订。最新的草稿来自 2012 年 9 月,正式弃用了所有以前的草稿。但是,浏览器支持参差不齐(尤其是旧的 android 浏览器):***.com/questions/15662578/… 这在 Chrome 中对我有用,而 Justin Poliey 的版本却没有。 不是“justify-content: center;”用于垂直对齐和“对齐项目:中心;”水平对齐? @WouterVanherck 它取决于 flex-direction 值。如果它是“行”(默认) - 那么justify-content: center; 用于水平对齐(就像我在答案中提到的那样)如果它是“列” - 那么justify-content: center; 用于垂直对齐。【参考方案14】:

我最近找到了一种方法:

#outer 
    position: absolute;
    left: 50%;


#inner 
    position: relative;
    left: -50%;

两个元素必须具有相同的宽度才能正常工作。

【讨论】:

只为#inner 设置此规则:#inner position:relative; left:50%; transform:translateX(-50%); 。这适用于任何宽度。【参考方案15】:

我已将内联样式应用于内部 div。使用这个:

<div id="outer" style="width:100%">  
    <div id="inner" style="display:table;margin:0 auto;">Foo foo</div>
</div>

【讨论】:

【参考方案16】:

用途:

#outerDiv 
  width: 500px;


#innerDiv 
  width: 200px;
  margin: 0 auto;
<div id="outerDiv">
  <div id="innerDiv">Inner Content</div>
</div>

【讨论】:

【参考方案17】:

我创建了this example 来展示如何垂直水平 align

代码基本上是这样的:

#outer 
 position: relative;

还有……

#inner 
  margin: auto;
  position: absolute;
  left:0;
  right: 0;
  top: 0;
  bottom: 0;

即使您调整大小屏幕,它也会保留在center

【讨论】:

+1 这个方法,我正准备用它来回答。请注意,您必须在要水平居中的元素上声明一个宽度(如果垂直居中,则为高度)。这是一个全面的解释:codepen.io/shshaw/full/gEiDt。垂直和/或水平居中元素的一种更通用且受广泛支持的方法。 你不能在 div 中使用填充,但如果你想给错觉使用相同颜色的边框。【参考方案18】:

#inner div 使用以下 CSS 内容:

#inner 
  width: 50%;
  margin-left: 25%;

我主要使用这个 CSS 内容来居中 divs。

【讨论】:

【参考方案19】:

你可以这样做

#container 
   display: table;
   width: <width of your container>;
   height: <height of your container>;


#inner 
   width: <width of your center div>;
   display: table-cell;
   margin: 0 auto;
   text-align: center;
   vertical-align: middle;

这也将垂直对齐#inner。如果您不想这样做,请删除 displayvertical-align 属性;

【讨论】:

【参考方案20】:

Chris Coyier 在他的博客上写了一篇关于“以未知为中心”的 excellent post。这是多种解决方案的综合。我发布了一个未在此问题中发布的内容。它比Flexbox 解决方案具有更多的浏览器支持,而且您没有使用display: table;,这可能会破坏其他东西。

/* This parent can be any width and height */
.outer 
  text-align: center;


/* The ghost, nudged to maintain perfect centering */
.outer:before 
  content: '.';
  display: inline-block;
  height: 100%;
  vertical-align: middle;
  width: 0;
  overflow: hidden;


/* The element to be centered, can
   also be of any width and height */
.inner 
  display: inline-block;
  vertical-align: middle;
  width: 300px;

【讨论】:

【参考方案21】:

我最近发现的一件好事,混合使用line-height+vertical-align50% 左技巧,您可以在水平和垂直方向上将center 一个动态大小的框放入另一个动态大小的框内使用纯 CSS。

请注意,您必须使用跨度(和 inline-block),在现代浏览器 + Internet Explorer 8 中进行了测试。 HTML:

<h1>Center dynamic box using only css test</h1>
<div class="container">
  <div class="center">
    <div class="center-container">
      <span class="dyn-box">
        <div class="dyn-head">This is a head</div>
        <div class="dyn-body">
          This is a body<br />
          Content<br />
          Content<br />
          Content<br />
          Content<br />
        </div>
      </span>
    </div>
  </div>
</div>

CSS:

.container 
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  overflow: hidden;


.center 
  position: absolute;
  left: 50%;
  top: 50%;


.center-container 
  position: absolute;
  left: -2500px;
  top: -2500px;
  width: 5000px;
  height: 5000px;
  line-height: 5000px;
  text-align: center;
  overflow: hidden;


.dyn-box 
  display: inline-block;
  vertical-align: middle;
  line-height: 100%;
  /* Purely asthetic below this point */
  background: #808080;
  padding: 13px;
  border-radius: 11px;
  font-family: arial;


.dyn-head 
  background: red;
  color: white;
  min-width: 300px;
  padding: 20px;
  font-size: 23px;


.dyn-body 
  padding: 10px;
  background: white;
  color: red;

See example here.

【讨论】:

【参考方案22】:

试着玩弄

margin: 0 auto;

如果您也想将文本居中,请尝试使用:

text-align: center;

【讨论】:

【参考方案23】:

我发现了一个选项:

每个人都说要使用:

margin: auto 0;

但还有另一种选择。为父 div 设置此属性。它 随时随地完美运行:

text-align: center;

看,孩子去中心。

最后是为你准备的 CSS:

#outer
     text-align: center;
     display: block; /* Or inline-block - base on your need */


#inner

     position: relative;
     margin: 0 auto; /* It is good to be */

【讨论】:

text-align 用于其容器中的文本对齐,而不是用于其容器与其父级的对齐。 我测试它,我将孩子设置为中心的问题,当你有更多一个孩子时,必须有更多的边距:0 自动字体答案,但是,文本对齐中心,让父母让这个孩子成为center ,即使它们是元素而不是文本,测试并看看会发生什么 仅文本居中对齐。你现在是对的,但是当你编写一个包含不同宽度和颜色的孩子的容器 css 时,你的代码不起作用。再测试一次!!!! 看看这个例子jsfiddle.net/uCdPK/2,告诉我你怎么看!!!!!!【参考方案24】:
<center>

我被已知最简单的中心宠坏了?

</center>

【讨论】:

这对我有用,但不确定为什么它不是答案。有人能解释一下这有什么问题吗? @DaveWalley 虽然有效,但有两个很好的理由说明这不是一个好的答案。第一个问题是针对 CSS 解决方案,这是一个纯 HTML 解决方案。第二个the CENTER tag was already deprecated in HTML 4【参考方案25】:

例如,请参阅this link 和下面的 sn-p:

div#outer 
  height: 120px;
  background-color: red;


div#inner 
  width: 50%;
  height: 100%;
  background-color: green;
  margin: 0 auto;
  text-align: center; /* For text alignment to center horizontally. */
  line-height: 120px; /* For text alignment to center vertically. */
<div id="outer" style="width:100%;">
  <div id="inner">Foo foo</div>
</div>

如果你的父母下有很多孩子,那么你的 CSS 内容必须是这样的example on fiddle。

HTML 内容如下所示:

<div id="outer" style="width:100%;">
    <div class="inner"> Foo Text </div>
    <div class="inner"> Foo Text </div>
    <div class="inner"> Foo Text </div>
    <div class="inner"> </div>
    <div class="inner"> </div>
    <div class="inner"> </div>
    <div class="inner"> </div>
    <div class="inner"> </div>
    <div class="inner"> Foo Text </div>
</div>

然后看这个example on fiddle。

【讨论】:

【参考方案26】:

如果内容的宽度未知,可以使用以下方法。假设我们有这两个元素:

.outer -- 全角 .inner -- 没有设置宽度(但可以指定最大宽度)

假设元素的计算宽度分别为 1000 像素和 300 像素。进行如下操作:

    .inner 包裹在.center-helper 内 使.center-helper 成为内联块;它的大小与.inner 相同,宽度为 300 像素。 将.center-helper 相对于其父项向右推50%;这将其左侧放置在 500 像素处。外层。 将.inner 相对于其父级向左推50%;这将其左侧放置在 -150 像素处。中心助手,这意味着它的左边是 500 - 150 = 350 像素 wrt。外层。 将.outer 上的溢出设置为隐藏以防止水平滚动条。

演示:

body 
  font: medium sans-serif;


.outer 
  overflow: hidden;
  background-color: papayawhip;


.center-helper 
  display: inline-block;
  position: relative;
  left: 50%;
  background-color: burlywood;


.inner 
  display: inline-block;
  position: relative;
  left: -50%;
  background-color: wheat;
<div class="outer">
  <div class="center-helper">
    <div class="inner">
      <h1>A div with no defined width</h1>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
          Duis condimentum sem non turpis consectetur blandit.<br>
          Donec dictum risus id orci ornare tempor.<br>
          Proin pharetra augue a lorem elementum molestie.<br>
          Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p>
    </div>
  </div>
</div>

【讨论】:

【参考方案27】:

这是您想要的最短路径。

JSFIDDLE

#outer 
  margin - top: 100 px;
  height: 500 px; /* you can set whatever you want */
  border: 1 px solid# ccc;


#inner 
  border: 1 px solid# f00;
  position: relative;
  top: 50 % ;
  transform: translateY(-50 % );

【讨论】:

垂直居中。【参考方案28】:

好吧,我设法找到了一个可能适合所有情况的解决方案,但使用 javascript

结构如下:

<div class="container">
  <div class="content">Your content goes here!</div>
  <div class="content">Your content goes here!</div>
  <div class="content">Your content goes here!</div>
</div>

这里是 JavaScript sn-p:

$(document).ready(function() 
  $('.container .content').each( function() 
    container = $(this).closest('.container');
    content = $(this);

    containerHeight = container.height();
    contentHeight = content.height();

    margin = (containerHeight - contentHeight) / 2;
    content.css('margin-top', margin);
  )
);

如果您想在响应式方法中使用它,可以添加以下内容:

$(window).resize(function() 
  $('.container .content').each( function() 
    container = $(this).closest('.container');
    content = $(this);

    containerHeight = container.height();
    contentHeight = content.height();

    margin = (containerHeight - contentHeight) / 2;
    content.css('margin-top', margin);
  )
);

【讨论】:

【参考方案29】:

我知道我回答这个问题有点晚了,而且我没有费心阅读每一个答案,所以这个可能是重复的。 Here's my take:

inner  width: 50%; background-color: Khaki; margin: 0 auto; 

【讨论】:

是的,我相信这是重复的。 Justin Poliey 的最佳答案以同样的方式解决了这个问题。【参考方案30】:

将未知高度和宽度的 div 居中

水平和垂直。它适用于相当现代的浏览器(Firefox、Safari/WebKit、Chrome、Internet & Explorer & 10、Opera 等)

.content 
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
&lt;div class="content"&gt;This works with any content&lt;/div&gt;

在Codepen 或JSBin 上进一步修改它。

【讨论】:

这是唯一一个可以完美居中的,即使在 div 中的内容被修改后也会保持居中。 这是一个不错的技巧,但有一点需要注意。如果元素的内联内容比父元素宽度的 50% 宽,那么从 left 额外的 50% 偏移量将推断父元素的宽度,将内容分解到下一行以避免溢出。但是可以通过在居中的元素中将white-space 属性设置为nowrap 来保持内容内联。试试这个JSFiddle。

以上是关于如何水平居中元素的主要内容,如果未能解决你的问题,请参考以下文章

-水平居中垂直居中水平垂直居中

CSS常见布局问题整理

CSS未知宽高元素水平垂直居中

常用的布局及技巧

css如何实现span在div中水平居中

如何在堆栈中垂直或水平居中小部件?