在各种技术论坛里经常会有这样的问题提出,“我如何能将这个东西竖向居中?”这个问题通常会跟随着这样一句话,“我使用了 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. iOS 检查app版本更新操作

    iOS 检查app版本更新操作 1:获取本地安装的版本信息: [NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle ...

  2. localhost连接慢如何解决?

    localhost连接慢如何解决 php 环境本地用ip连接mysql响应快, 今天碰到一个连接mysql的怪问题,我在php 环境本地用ip连接mysql响应快,用localhost连接慢,后来百度 ...

  3. web前端开发文档

  4. Drupal 7 driver for SQL Server and SQL Azure

    Drupal 7 driver for Microsoft SQL Server database engines. It supports both SQL Server (version 2008 ...

  5. Ubuntu下开启root登陆--并开启SSH登录验证

    Ubuntu下开启root登陆亲手安装过Ubuntu的童鞋都知道,默认安装只会添加一个普通用户名和密码,而超级用户权限则是利用sudo命令来执行.在Ubuntu下使用root登陆或者在shell中用s ...

  6. hdu 4494 Teamwork (可行流的最小流)

    去年通话邀请赛的B题,当时居然过的那么少...明明是一道非常裸的可行流最小流麽..仅仅要对每种人分别求一下可行最小流加起来就能够了.建图是对每一个点拆点,容量上下届都设为v[i],然后每一个点间能连边 ...

  7. 【laravel5.4】DB::table的操作

    基于laravel5.4版本的查询构造器的简单几个操作:(相对于TP3.2版本) //获取指定多行多列,二维,,对象 [select] $names = ''; $names = DB::table( ...

  8. webqq协议分析之~~~~验证是否需要验证码

    对于小黄鸡我想大家(喜欢在群里bb的人...)肯定一点都不陌生,那段时间大家在群里对小鸡是各种调戏啊,都有点不忍直视.那时我便想能不能自己也做个呢,后来想想还是算了吧,自己技术太渣渣,然后就不了了之. ...

  9. Linux命令-压缩解压命令:tar

    tar [选项] [打包后文件名] [打包前的文件或者目录名称] -c表示创建(create-创建) -z表示压缩(gzip-压缩) -j表示压缩(bzip2-压缩) -v显示进度(verbose-冗 ...

  10. 通过XmlDocument读写Xml文档参考地址

    /// <summary> /// 获取一个报表的参数 http://blog.csdn.net/hdhai9451/article/details/12170069 /// </s ...