CSS单行或多行垂直对齐


80

我的标题可以包含一行或多行。

如何垂直对齐文本?如果总是一行,我可以将line-height设置为容器的高度。

我可以使用JavaScript来做到这一点,但是我真的不喜欢它,我正在寻找一种纯CSS方式。

另外,如果容器可以用线条扩展,那将是完美的,因此我始终可以在顶部和底部使用相同的填充。

在此处输入图片说明


万一集装箱的高度可以改变……那怎么办?jsbin.com/idiqih/edit#preview
Joonas

Answers:


113

为此,您可以使用display:table-cell属性:

.inline {
  display: inline-block;
  margin: 1em;
}
.wrap {
  display: table;
  height:  100px;
  width:   160px;
  padding: 10px;
  border:  thin solid darkgray;
}
.wrap p {
  display:        table-cell;
  vertical-align: middle;
}
<div class="inline">
  <div class="wrap">
    <p>Example of single line.</p>
  </div>
</div>

<div class="inline">
  <div class="wrap">
    <p>To look best, text should really be centered inside.</p>
  </div>
</div>

但它适用于IE8及更高版本。阅读本文以获取更多信息:CSS技巧:垂直居中的多行文本


我想要完全一样的东西,但是还需要div应该消耗整个可用高度。这应该对此有所帮助:stackoverflow.com/a/16837667/260665
Raj Pawan Gumdal,2015年

如果你不;吨希望.wrap幻数heightwidth,可以将每个人设定100%。然后将widthheight应用于.wrap元素的父级。
Polywhirl先生16年

9

如果您不喜欢这个display:table窍门(我知道我不喜欢),那么这里有个解决方案:

.cen {
  min-height:5em; width:12em; background:red; margin:1em 0;
}
.cen p {
  display:inline-block; vertical-align:middle;
  margin:0 0 0 1em; width:10em;
}
.cen::after {
   display:inline-block; vertical-align:middle; line-height:5em;
   width:0; content:"\00A0"; overflow:hidden;
}

与HTML

<div class="cen">
 <p>Text in div 1</p>
</div>

这使div的高度为5em,除非内容更高,否则它会增长。这里的
例子

编辑:哦,这应该在哪些浏览器上工作?IE8无法合作。

(后来编辑:更新了CSS以处理Chrome中的问题)


很酷的技术。我遇到的一个问题是,包装盒中的文本单独包装(而不是<br>示例中显示的标签)时,我在Chrome中每个元素的底部都留出了很多额外的空白。伪元素似乎正在换行。任何想法如何减轻这种情况?
Dominic P

@DominicP你是对的。显然,该::after块认为它确实有一个宽度(由于其内容),因此它在后面不适合p。不幸的是,它确实需要内容,否则将完全崩溃,并且无法正常工作。但是我不确定为什么只用换行而不是单行ps来做到这一点。
李斯特先生,2013年

无论如何,我用解决方案更新了答案。诀窍是使p宽度小于div,因此零宽度::after块在其右边有空间。希望这可以帮助!
李斯特先生,2013年

如果需要考虑可访问性,那么这是正确的答案。您不应该将a归类<div>table-item,这会使屏幕阅读器以及用户感到困惑。
克苏鲁2015年

9

我真的很喜欢这个解决方案:

<div>
    <span style="display: inline-block; vertical-align: middle; height: --The height of your box here--"></span>
    <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here</span>
</div>

随意使用样式表,高度为100%...

也可能必须注释掉span标记之间的空格,因为它们是内联块

幸得阎王。我从这里拿到的

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here.</span>
</div>

<div style="outline:thin solid red;">
  <span style="display: inline-block; vertical-align: middle; height: 60px;"></span>
  <span style="display: inline-block; vertical-align: middle;">Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here. Put your multi-line content here.</span>
</div>

注意:这似乎不适用于多行内容。


2
这是一个很棒的解决方案:)谢谢!我讨厌依靠桌子!
3066d0 2014年

我不敢相信这行得通!到目前为止,唯一有效的解决方案!
keji 2015年

1
这是最符合我口味的解决方案。我不知道CSS规范是否会在我的一生中提供一种非骇人听闻的方法。
DannyB 2015年

4

除了使用vertical-align: centerand之外display: table-cell,您可能还想看看称为CSS display flex的较新方法,它更简单

.box {
    width: 200px;
    height: 50px; 
    padding: 10px;
    margin-bottom: 20px;
    background-color: red;
    
    /* Only add these 2 lines */
    display: flex;
    align-items: center;
  }
<div class="box">Lorem ipsum dolor</div>
<div class="box">Lorem ipsum dolor sit amet ipsum dolor</div>


效果很好,但很难将其限制为行数,它会溢出
幸运的

新浏览器的最佳答案!感谢您将此新的flex解决方案添加到旧问题中。
Kai Noack


3

如果您希望文本具有响应能力,则随着宽度的动态变化,将单词从一行换成多行,上述带inline-block助手的技巧(此处具有最佳的兼容性)可能还不够,因为.inlinehelper可以将文本自动向下压入。
这是完成此类简单任务的完整解决方案:

HTML:

<div id="responsive_wrap">
    <span class="inlinehelper"><span id="content">        
</div>

CSS:

#responsive_wrap {   
   display: block;    
   height: 100%; //dimensions just for   
   width: 100%;  //example's sake
   white-space: nowrap;
}

#content {   
   display: inline-block;        
   white-space: initial;
}

.inlinehelper {
   height: 100%;    
   width: 0;
   vertical-align: middle;
   display: inline-block;
}

注意white-space:nowrap属性,该属性可以防止.inlinehelper#content相互包装。 white-space:initial#content复位能力包的span本身;

另一个选择: 更多是个人喜好问题。您可以使用伪元素代替.inlinehelper。删除.inlinehelpercss规则和元素,并添加以下伪元素css选择器:

#responsive_wrap:before {
    content: "";
    display: inline-block;
    vertical-align: middle;
    height: 100%;
    width: 0px;
}

PS:我发现这确实是一个老问题,为时已晚,因此让这个答案成为可能,也许对某人会有帮助。



0

我喜欢这种解决方案。我在某个地方看到了stackoverflow中的这个技巧,但不记得确切的位置。非常有用!:)

ul {
background: #000; 
  padding-left: 0;
}
ul li {
  height: 130px;
  position: relative;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  border-bottom: 3px solid #F7F7F7;
}
ul li:last-of-type {
  border-bottom: none;
}
ul li:after {
  color: #333;
  position: absolute;
  right: 35px;
  font-size: 40px;
  content: ">";
  top: 50%;
  margin-top: -24px;
  color: #FFDA00;
  -webkit-transition: 0.25s all ease;
  transition: 0.25s all ease;
}
ul li a {
  font-size: 35px;
  font-family: Arial;
  color: #fff;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
  padding-left: 40px;
  height: 100%;
  line-height: 38px;
  display: inline-block;
  width: 100%;
  text-align: left;
  text-decoration: none;
}
ul li a:before {
  display: inline-block;
  vertical-align: middle;
  content: " ";
  height: 100%;
}
ul li a span {
  display: inline-block;
  vertical-align: middle;
}
<ul>
	<li class="dn">
		<a href="kapec.ru.php"><span> Lorem ipsum 1 LINE</span></a>
		</li>
		<li>
			<a href="varianti.ru.php"><span>Lorem ipsum <br> 2 lines </span></a>
		</li>

	</ul>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.