中心文本垂直位于<div> </div>中

时间:2011-09-30 23:13:14

标签: html css

我有一个固定高度的<div>元素,我想在该元素中垂直居中一些文字。

我一直在尝试按照http://phrogz.net/css/vertical-align/index.html的说明操作。但是,它似乎对我不起作用。

我已经在http://jsfiddle.net/scwebgroup/74Rnq/发布了我正在尝试的内容。如果我将HeaderBrand的margin-top更改为大约-22px,那么它似乎是正确的。

任何人都可以看到为什么文章中描述的技术不能按预期工作吗?

注意:最佳答案here仅在文本未换行到第二行时才有效。

7 个答案:

答案 0 :(得分:45)

此:

<!DOCTYPE html>
<style>
  .outer { outline: 1px solid #eee; }
  .outer > p { display: table-cell; height: 200px; vertical-align: middle; }
</style>

<div class="outer">
  <p>This text will be vertically aligned</p>
</div>

<div class="outer">
  <p>This longer text will be vertically aligned. Assumenda quinoa cupidatat messenger bag tofu. Commodo sustainable raw denim, lo-fi keytar brunch high life nisi labore 3 wolf moon readymade eiusmod viral. Exercitation velit ex, brooklyn farm-to-table in hoodie id aliquip. Keytar skateboard synth blog minim sed. Nisi do wes anderson seitan, banksy sartorial +1 cliche. Iphone scenester tumblr consequat keffiyeh you probably haven't heard of them, sartorial qui hoodie. Leggings labore cillum freegan put a bird on it tempor duis.</p>
</div>

适用于现代浏览器,无论文本是否仅跨越一行或多行。

同时更新了http://jsfiddle.net/74Rnq/135/的小提琴。当事物本身宽度仅为150px时,不确定左边是625px边距你做了什么...通过删除内联样式并使用一点点来整理一下填充也是如此。

答案 1 :(得分:13)

您可以尝试将line-height设置为div的高度,如下所示:

<div style="height:200px;border:1px solid #000;"> 
    <span style="line-height:200px;">Hello world!</span> 
</div> 

这是另一种似乎有效的技术:

#vertical{
    position:absolute;
    top:50%;    
    left:0;
    width:100%;
}

<div style="position:relative;height:200px;">
    <div id="vertical">
        Hello world!
    </div>              
</div>

答案 2 :(得分:4)

我知道这种方法会添加一些HTML,但它似乎适用于所有主流浏览器(甚至是IE7 +)。

基本HTML结构

<div id="hold">
  <div>Content</div>
  <div class="aligner">&nbsp;</div>
</div>​

需要CSS

#hold{
    height:400px;
}
div{
    display:        -moz-inline-stack;
    display:        inline-block;
    zoom:            1;
    *display:        inline;
    vertical-align:middle;
}
.aligner{
    width:0px;
    height:100%;
    overflow:hidden;
}​

The jsFiddle

答案 3 :(得分:3)

如下图所示,您可以轻松地将文本元素的父级设置为position:relative,将text元素本身设置为position:absolute;然后使用方向属性在父级内的文本中移动。见下面的例子......

&#13;
&#13;
<!--Good and responsive ways to center text vertically inside block elements-->
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Centered Text&reg;</title>
<style type="text/css">
@charset "UTF-8";
* {
	margin: 0;
	padding: 0;
}

body {
	font-family: Helvetica;
}

#wrapper {
	width: 100%;
	height: auto;
}

#wrapper > div {
	margin: 40px auto;
	overflow: hidden;
  	position: relative;
  	height: 100px;
  	width: 50%;
}

p {
	position: absolute;
	word-wrap: break-word;
	text-align: center;
	color: white;
	background-color: rgba(0,0,0,0.5);
}

#parent1 {
  background-color: orange;
}

#parent1 p {
  	top: 10px;
  	bottom: 10px;
  	left: 10px;
  	right: 10px;
  	height: auto;
  	width: auto;
  	padding-top: 30px; /* Parent1's height * 0.5 = parent1 p's padding-top (Adjust to make look more centered) */
}

#parent2 {
	background-color: skyblue;

}

#parent2 p {
	left: 50%;
	top: 50%;
	padding: 10px;
	transform: translate(-50%, -50%);
}

#parent3 {
	background-color: hotpink;
}

#parent3 p {
	top: 50%;
	left: 0;
	transform: translateY(-50%);
	width: 100%;
}
</style>
</head>
<body>
<div id="wrapper">
	<div id="parent1">
		<p>Center Method 1</p>
	</div>
	<div id="parent2">
		<p>Center Method 2</p>
	</div>
	<div id="parent3">
		<p>Center Method 3</p>
	</div>
</div>
</body>
</html>
&#13;
&#13;
&#13; 我希望这有帮助!

答案 4 :(得分:1)

当前设置的一种方法是将margin-top设置为-25%

http://jsfiddle.net/ycAta/

它看起来很奇怪的唯一原因是因为位置是基于文本的顶部而且存在必要的间隙,因为并非所有字母都是相同的高度。

作为手动修复-30%看起来更好。 :P

答案 5 :(得分:1)

我无法确定我引用的文章中的代码对我不起作用的原因。有几个人提供了答案,但没有任何东西让我觉得可靠的浏览器。

最终,我决定将我的文字放在一行,我不喜欢这样。但我确实需要我的技术清晰,易于理解,并使其可靠地工作。

答案 6 :(得分:1)

我最近很高兴发现Flexbox可以为您解决这个问题。下面的CSS中的flex-center类将使div的文本垂直和水平居中。这个例子有点破碎,所以我建议调整窗口大小,直到div边框与文本不齐齐。

至于您是否可以使用flexbox关于兼容性,请参阅Can I use...

我不完全理解为什么这是有效的,如果有人对灵活盒机器有更深入的了解,我会很喜欢这个解释。

.border-boxed {
  box-sizing: border-box;
}

*, *:before, *:after {
  box-sizing: inherit;
}

body {
  /* This is just to make it look pretty */
  box-sizing: border-box;
  background: linear-gradient(135deg, 
    rgba(85,239,203,1) 0%,
    rgba(30,87,153,1) 0%,
    rgba(85,239,203,1) 0%,
    rgba(91,202,255,1) 100%);
  color: #f7f7f7;
  font-family: 'Lato', sans-serif;
  font-weight: 300;
  font-size: .8rem;
  
  /* Expand <body> to entire viewport height */
  height: 100vh;
  
  /* Arrange the boxes in a centered, vertical column */
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

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


.box {
  width: 25%;
  height: 25%;
  border: 2px solid #f7f7f7;
  border-radius: 16px;
  margin: .5rem; 
  text-transform: uppercase;
  text-align: center;
}

.small {
  height: 8%; 
}
<div class="box large flexitem flex-center">
  Large Box. <br>
  So big. <br>
  My god.
</div>

<div class="box small flexitem flex-center">
  Smaller Box
</div>