理解vertical-align或“如何竖向居中”<转>

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

时间: 2024-11-15 00:31:14

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

使用Flexbox实现CSS竖向居中

竖向居中需要一个父元素和一个子元素合作完成. <div class="flexbox-container"> <div>Blah blah</div> <div>Blah blah blah blah blah ...</div> </div> …但为了让子元素竖向居中,你只需要对父元素施加CSS样式: .flexbox-container { display: -ms-flexbox; display: -web

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

重点: 在scroll view和stack view之间加一个UIView. 竖向居中Tutorial: https://stackoverflow.com/questions/50766400/center-uiview-vertically-in-scroll-view-when-its-dynamic-labels-are-small-enough 横向右对齐: 原文地址:https://www.cnblogs.com/argenbarbie/p/11776070.html

line height 与 vertical align

一.line height 其中代表inline box(包含上下间距,若height==line-height,则行间距=line-height - font-size/2),big代表content area. 注: 若line-height < content area ,则line box要取line-height的值,这也是为什么会重叠的原因. line-height属性取值: 1. % 若自身没有设置line-height,则line-height = 父元素的font-size *

设置元素竖向居中的三种方式

/*No.1*/ li{ line-height: ;//设为页面高度 vertical-align: middle; } li,img{ vertical-align: middle; } /*No.2*/ li{ display: table-cell; vertical-align: middle; } /*No.3*/ li{ display: -webkit-box; -webkit-box-pack: center; -webkit-box-align: center; }

自适应居中

一.窗体居中 1 position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; /*height: 50px; width: 165px; */ 简析: position:固定位置显示(absolute|fixed): [absolute:窗口大小由上层position为absolute.fixed.relative的子父关系窗口决定:fixed:窗口大小由上层层position为fixed的子父关系窗口决定] t

理解SVG坐标系和变换:视窗,viewBox和preserveAspectRatio

SVG元素不像HTML元素一样由CSS盒模型管理.这使得我们可以更加灵活定位和变换这些元素-也许一眼看上去不太直观.然而,一旦你理解了SVG坐标系和变换,操纵SVG会非常简单并且很有意义.本篇文章中我们将讨论控制SVG坐标系的最重要的三个属性:viewport, viewBox, 和 preserveAspectRatio. 这是本系列三篇文章中的第一篇,这篇文章讨论SVG中的坐标系和变换. 理解SVG坐标系和变换(第一部分)-viewport,viewBox,和preserveAspectRa

css 居中,中央

在我的技巧里,有4中居中中央的方法: 1.position:absolute; top:50%;left:50%; margin : -x 0 0 -x; 这是绝对定位的方法,通过算法移动,坏处就是必须知道element的height & width. 2.vertical align middle 在element 里,只要知道父层的高,子层就能通过vertical align middle移动到中间,当然,父层同时也要有text align center,或者子层margin auto; d

CSS 居中大全

我看最近微博流行 CSS 居中技术,老外码农争相写相关的文章,一篇赛一篇的长啊,我把几篇归纳总结了一下,算是笔记. 孔乙己曾说:“茴香豆的回字有四种写法”,万一哪天有个面试官问你:“居中一共有几种写法”呢,哈哈,先备着吧~~ 各种方法各有利弊,大家自己权衡吧,至少在需要居中时多个思路. <center> 不建议用了. text-align:center 在父容器里水平居中 inline 文字,或 inline 元素 vertical-align:middle 垂直居中 inline 文字,in

关于垂直居中

做项目每次垂直居中的时候都折腾半天,在这边稍微整理一下垂直居中我所理解的一点知识吧. 1,行内元素 行内元素,比如,img,span等直接用vertical-align:middle,就可以搞定了. 2,块元素 垂直居中,最简单的方式是height:20px;line-height:20px;让他们相等,块元素就可以达到居中效果并且不破坏周围的布局. 还可以用绝对定位来布局,height:100px;position:absolute:top:50%:margin-top:-50px;也可以达到