在各种技术论坛里经常会有这样的问题提出,“我如何能将这个东西竖向居中?”这个问题通常会跟随着这样一句话,“我使用了 vertical-align:middle,但是不管用! ”

这个问题其实有三个层面的原因

  1. HTML布局通常都不是专门针对竖向呈现而设计的。这很自然,一般文字占宽会自动扩展,内容的高度是依据内容的多少和有效宽度而定。很显然,横向宽度和横向布局很容易实现;竖向高度和布局被动跟随横向布局适应。
  2. vertical-align:middle没有按预期的设想起作用的原因通常是程序员没有理解其正确的用法,但…
  3. … 这又是因为CSS规范(以我的观点)把它给弄拧巴了—依赖vertical-align使用的场合的不同(vertical-align只对inline和inline-block依赖),它实际上会表现出两种完全不同的用法。

Table单元格中的vertical-align

当出现在Table单元格中时,vertical-align的效果会如大多数人的预期一样,它会跟(老的,不鼓励使用)的valign属性的作用一样。在现代浏览器里,下面的这三种写法的效果是一样的:

<td valign="middle"> <!-- 这是一种会逐渐被淘汰的用法 --> </td> <td style="vertical-align:middle"> ... </td> <div style="display:table-cell; vertical-align:middle"> ... </div>

在浏览器中,它们的现实效果是下面这样:

<td> 使用valign="middle" <td> 使用valign="bottom"
<td> 使用vertical-align:middle <td> 使用vertical-align:bottom
<div> 使用display:table-cell; vertical-align:middle
<div> 使用display:table-cell; vertical-align:bottom

vertical-align在inline元素上效果

然而,当vertical-align被应用的到inline元素上时,它的作用却是类似(老的,不鼓励使用)的valign属性对<img>的作用一样。在现代浏览器里,下面的这三种写法的效果是一样的:

<img align="middle" ...> <img style="vertical-align:middle" ...> <span style="display:inline-block; vertical-align:middle"> ... </span>

在浏览器中,它们的现实效果是下面这样:

在这个段落中,我放了两个图片——作为例子。

在这个段落中,我放了两个图片——作为例子。

在这个段落中,我用<span> display:inline-block
vertical-align:middle 和 display:inline-block
vertical-align:text-bottom 作为例子。

vertical-align在其它元素上的效果

技术上,某个CSS属性并不是在任何的HTML元素上都是生效。当一个新手将vertical-align属性应用到一个block元素(例如标准的<div>)上时,大多数浏览器会依照继承的原则,将所有它的inline子元素也应用这个属性。

那么,如何将一个元素竖向居中?

如果你在读这篇文章,你很可能对为什么你的写法不好用并不感兴趣。你感兴趣的很可能是如何能让它起作用。

方法一

下面的方法有两个(小)前提。如果你能做到这些前提,那么这个方法适用于你:

  • 你需要把想要竖向居中的内容放到一个block元素中,并给这个想要居中的元素指定固定的高度。
  • 绝对定位(absolutely-position)这个元素。(通常这样做是没问题的,因为你这个想要居中的元素的父元素仍然可以使用相对位置)。

如果你能接受上面的两个必要条件,那么,方法是这样的:

  1. 指定父元素为position:relative 或 position:absolute
  2. 给子元素指定固定的高度。
  3. 给子元素设定position:absolute 以及 top:50%,让子元素移动到父元素内部上下居中的位置。
  4. 给子元素设定 margin-top:-yy,这里的 yy 的值是你的子元素的高度的一半,弥补居中时的偏差。

下面是CSS代码:

<style type="text/css"> #myoutercontainer { position:relative } #myinnercontainer { position:absolute; top:50%; height:10em; margin-top:-5em } </style>

下面是HTML代码:

<div id="myoutercontainer"> <div id="myinnercontainer"> <p>Hey look! I'm vertically centered!</p> <p>How sweet is this?!</p> </div> </div>

在浏览器中,上面的代码会产生如下的效果:

海,看看!我竖向居中了!

好厉害,不是吗?!

方法二

这个方法需要你满足下面的前提条件:

  • 需要竖向居中的内容只有一行文字。
  • 需要对父元素设定固定的高度。

如果你能接受上面的条件,那么,方法是这样:

  1. 将父元素的line-height设置为你想要的高度。

下面是CSS代码的写法:

<style type="text/css"> #myoutercontainer2 { line-height:4em } </style>

下面是HTML代码的写法:

<p id="myoutercontainer2"> 嗨,我竖向居中了,耶! </p>

在浏览器中,上面的代码会产生如下的效果:

嗨,我竖向居中了,耶!
转自 http://www.webhek.com/vertical-align

理解vertical-align或“如何竖向居中”<转>的更多相关文章

  1. 使用Flexbox实现CSS竖向居中

    竖向居中需要一个父元素和一个子元素合作完成. <div class="flexbox-container"> <div>Blah blah</div& ...

  2. What is Vertical Align?

    https://css-tricks.com/what-is-vertical-align/ ************************************************* CSS ...

  3. 通过vertical-align属性实现“竖向居中”显示

    自学编程大概有大半年的时间了,从15年7月开始学习使用人数最多的JAVA,到后来喜欢上了前端,但由于之间在建筑设计院的工作加班颇为频繁,每天刨去工作,基本没有多少自己个人的时间,只能每天6,7点起床, ...

  4. 可滚动UIStackView 竖向居中 / 横向右对齐

    重点: 在scroll view和stack view之间加一个UIView. 竖向居中Tutorial: https://stackoverflow.com/questions/50766400/c ...

  5. 关于Vertical Align的理解

    1:vertical-align 翻译就是垂直-对齐... 2:关于line-height的点 2.1:如果一个标签没有定义height属性,那么其最终表现的高度一定是由line-height起作用. ...

  6. 浏览器兼容CSS代码:按钮文字垂直居中(input button text vertical align)

    经过测试的浏览器:IE6, IE7, IE8, IE9, Firefox, Chrome, Safiri, Maxthon 按钮的HTML代码: <input id="btn_comm ...

  7. 三行代码CSS竖向居中

    .element{ position:relative; top:50%; transform:translateY(-50%); } 这里无需设置高度或者父元素的position属性.(IE9可用) ...

  8. 前端知识点回顾之重点篇——CSS中vertical align属性

    来源:https://www.cnblogs.com/shuiyi/p/5597187.html 行框的概念 红色(line-height)为行框的顶部和底部,绿色(font-size)为字体的高度, ...

  9. Vertical Center TextView . 竖直居中的UITextView

    @interface VerticalCenterTextView : UITextView @end @implementation VerticalCenterTextView - (void) ...

随机推荐

  1. 【翻译自mos文章】在一次失败的 &#39;Shutdown Immediate&#39;之后,数据库job 不能执行。

    在一次失败的 'Shutdown Immediate'之后.数据库job 不能执行. 參考原文: Database Jobs Do Not Run After a Failed 'Shutdown I ...

  2. js和jquery判断事件流

    $('body').on('click',function(e){ var $target = $(e.target); if($target.parents('.fixNav>div').le ...

  3. Report studio交叉表求指定维度和的问题

    场景:有年份,维度值,不求所有的维度值的和,只求自己想要的省份的和,其中有些省份的值可能为空. 交叉表设计: 运行如图示: 下面要求在交叉表下方多出一列,求上海市与河南省的和.然后空白显示0 解决: ...

  4. Microsoft Bot Builder Overview

    微软机器人构建器概述 微软机器人Builder是一个强大的框架构建机器人可以处理自由交互和更多的引导,这种可能性是显式地显示给用户. 它很容易使用和利用c#写机器人提供一个自然的方式. 高级功能: 强 ...

  5. easyui window refresh 刷新两次解决办法

    这样写刷新两次 $("#windowid").window('refresh','url01.php'); $("#windowid").window('ope ...

  6. Keepalived+Nginx实现高可用和双主节点负载均衡

    简介 Nginx可以实现高并发反向代理,lvs集群可以实现负载均衡,但是他们都有一个共同的弊端,就是Nginx,lvs架构中Director是单点故障,有没有一个好的方案解决这个问题呢?答案是有.通过 ...

  7. struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

    实现目标:       1.使用验证框架对用户注冊信息进行验证       2.验证username.password.邮箱不能为空       3.验证username.password长度     ...

  8. C#返回多个参数 ref及out

    out 关键字会导致参数通过引用来传递.这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化.若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字.例如 ...

  9. springmvc 入门(1)

    1.1 Springmvc 本套课程基于spring4.X来讲解的 SpringMVC 概述 Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的 MVC 框架之一 ...

  10. ExecutorService的execute和submit方法

    三个区别: 1.接收的参数不一样 2.submit有返回值,而execute没有 Method submit extends base method Executor.execute by creat ...