【问题标题】:css single or multiple line vertical aligncss 单行或多行垂直对齐
【发布时间】:2012-02-29 19:59:52
【问题描述】:

我有一个可以有一行或多行的标题。

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

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

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

【问题讨论】:

标签: html css


【解决方案1】:

不要使用vertical-align: centerdisplay: 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>

【讨论】:

  • 效果很好,但很难将其限制为行数,它会溢出
  • 新浏览器的最佳答案!感谢您将这个新的弹性解决方案添加到旧问题中。
【解决方案2】:

我喜欢这种解决方案。我在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>

【讨论】:

    【解决方案3】:

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

    <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 标签之间的空格,因为这些是内联块

    归功于Hades。我从Here得到它

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

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

    【讨论】:

    • 这是一个很棒的解决方案 :) 谢谢!我讨厌依赖表!
    • 我不敢相信这有效!迄今为止唯一有效的解决方案!
    • 这是最符合我口味的解决方案。我想知道 CSS 规范是否会在我有生之年提供一种非 hacky 的方式。
    【解决方案4】:

    为此,您可以使用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 Tricks: Vertically Center Multi-Lined Text

    【讨论】:

    • 我想要完全相同的东西,但也需要 div 应该占用整个可用高度。这应该会有所帮助:stackoverflow.com/a/16837667/260665
    • 如果您不希望.wrap 拥有heightwidth幻数,您可以将它们分别设置为100%。然后将widthheight 应用于.wrap 元素的父元素。
    【解决方案5】:

    如果您希望文本具有响应性,将单词从一行换成多行,因为宽度是动态变化的,上面提到的 inline-block helper 技巧(这里有最好的兼容性)可能是不够的,因为 .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 on #content 重置为 span 自身包装的能力;

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

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

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

    【讨论】:

      【解决方案6】:

      类似的东西

      HTML

      <div>
          <p>
             Lorem Ipsum is simply
          </p>
      </div>
      

      CSS

      div {
         display: table;
      }
      p {
         display:table-cell;
         vertical-align: middle;
      }
      

      【讨论】:

        【解决方案7】:

        如果您不喜欢 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,除非内容更高,否则它会增长。
        现场示例here

        编辑:哦,这应该适用于哪些浏览器? IE8 不会合作。

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

        【讨论】:

        • 很酷的技术。我遇到的一个问题是,当框中的文本自行包装时(而不是示例中显示的&lt;br&gt; 标签),我在 Chrome 中的每个元素的底部都有大量额外的空白。似乎伪元素正在换行。知道如何减轻这种情况吗?
        • @DominicP 你是对的。显然::after 块认为它确实有宽度(因为它的内容),所以它不适合在p 之后。不幸的是,它确实需要内容,否则它会完全崩溃并且不起作用。但我不确定为什么它只使用换行而不是单行 ps。
        • 无论如何,我用解决方案更新了答案。诀窍是使p 的宽度小于div,因此它的右侧有空间用于零宽度::after 块。希望这会有所帮助!
        • 如果可访问性是一个问题,这是正确的答案。您不应该将&lt;div&gt; 归类为table-item,它会混淆屏幕阅读器,当然还有用户。
        【解决方案8】:

        在样式方面,表格是布局内容的最佳方式(将样式标签放在 CSS 中):

        <table style="border:1;collapse;width:300px;padding:5px;background-color:red;">
        <tr>
            <td style="width:250px;vertical-align:middle;">Lorem ipsum dolor sit amet ipswum dolor</td>
            <td style="width:50px;vertical-align:top;color:white;">1 Line</td>
        </tr>
        

        行数需要 JS 脚本,看这里:

        http://www.webdeveloper.com/forum/archive/index.php/t-44333.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-17
          • 1970-01-01
          • 2014-05-01
          • 2016-10-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多