如何水平居中元素
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 应用到内部 <div>
:
#inner
width: 50%;
margin: 0 auto;
当然,您不必将width
设置为50%
。任何小于包含 <div>
的宽度都可以使用。 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: <whatever_vertical_margin_you_need> auto
第二个是水平边距。【参考方案2】:
如果你不给它一个宽度,它就不能居中。否则,默认情况下会占用整个水平空间。
【讨论】:
如果您不知道宽度?说是因为内容是动态的? 最大宽度?那怎么样? 我使用width: fit-content;
和margin: 0 auto
。我认为这可以用于未知宽度。【参考方案3】:
设置width
并将margin-left
和margin-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 中的其他位置继承了 float
或 left
或 right
。
这是一个不错的解决方案。请记住,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
。如果您不想这样做,请删除 display
和 vertical-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-align
和50%
左技巧,您可以在水平和垂直方向上将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%);
<div class="content">This works with any content</div>
在Codepen 或JSBin 上进一步修改它。
【讨论】:
这是唯一一个可以完美居中的,即使在 div 中的内容被修改后也会保持居中。 这是一个不错的技巧,但有一点需要注意。如果元素的内联内容比父元素宽度的 50% 宽,那么从left
额外的 50% 偏移量将推断父元素的宽度,将内容分解到下一行以避免溢出。但是可以通过在居中的元素中将white-space
属性设置为nowrap
来保持内容内联。试试这个JSFiddle。以上是关于如何水平居中元素的主要内容,如果未能解决你的问题,请参考以下文章