资讯专栏INFORMATION COLUMN

[翻译]关于Vertical-Align你需要知道的事情

reclay / 739人阅读

摘要:在元素的和固定的情况下,一点小的改变也很有可能对布局造成影响。其中高度有可能是由元素的内容决定的。行高的上下边界是红线。元素也有和上下边界,元素是需要对齐的对象。因此文字的最高点超过了的高度。在第二种情况下,另外两个元素的位置发生了下移。

写在前面的话

开始学习前端以来,在CSS相关知识当中困扰我最多的就是Vertical-Align这个属性。在stackoverflow上查找相关问题的时候看到了这篇文章,于是将它翻译出来,作为自己的一次学习笔记吧。

正文

在遇到将元素在垂直方向上对齐的需求时,CSS提供了多种方法,有时候我用float解决,有时候我使用position:absolute解决,还有时候采用的方法是手动调整marginpadding
其实我并不喜欢这些解决方法,float会让元素的顶端对齐而且需要手动清楚浮动。绝对定位让元素脱离了正常流,这样这些元素就不会再影响到周围的元素。在元素的paddingmargin固定的情况下,一点小的改变也很有可能对布局造成影响。
接下来登场的就是本文的主角了:Vertical-align。通常来说使用这个属性进行布局是一种hack行为,因为它本来并不是被用于这个目的。它用在文本和与文本相邻元素的垂直方向上的对齐问题。然而,你也可以使用Vertical-align在不同的上下文中对元素进行灵活的,细粒度的排布。元素的尺寸无需知晓,元素任然处于正常流当中,因此元素的变化会影响到周围的元素,这使得Vertical-align是非常有价值的排布方案的选择。

Vertical-align的奇特之处

Vertical-align有时候会变的面目狰狞。它似乎有一些谜一样的规则。举例来说,有时候你改变了Vertical-align的值,但是该元素垂直方向上没有发生改变反而别的元素改变了位置。
一些资料在谈到Vertical-align这个问题的时候深入程度不够,特别是当人们想使用这个属性布局的时候。这些资料更多的将精力集中在了一个误区上,就是尝试将元素内的一切都垂直对齐。他们给出了一下在简单情况下的例子来解释Vertical-align这个属性而忽略了一些复杂奇怪的方面。

使用Vertical-align的要求

Vertical-align被用于垂直对齐inline元素,也就是display值为inlineinline-block的元素。inline-table的元素不在本文的讨论范围内。
inline元素基本上值得就是文本
inline-block元素就像它的名字一样,同时具备inline元素和block元素的特点,这样的元素有padding,margin,border,width,height。其中高度有可能是由元素的内容决定的。
inline元素一个挨着一个的摆放在行内,当行内元素太多的情况下,一个新行会被创建出来,这些行也叫做line--box。它将行内的所有内容都包裹了起来。根据行内内容的不同,line-box的尺寸也会不同,在接下来的图里面,红线代表了line-box的上下边界
在这些line-box内,Vertical-align属性负责对齐一些独立的元素。那么,这些元素是要和谁对齐呢?

关于边界和baseline

对于垂直对齐这个知识点来说最重要的就是涉及元素的baseline。有时候元素的盒模型的上下边界也会变的很重要。下面上图

如图所示有三行文字。行高的上下边界是红线。文字的上下边界是绿色的线,蓝色的线就是baseline了,左边文字的高度与行高是一致的,因此绿线和红线重合了,中间的行高是文字大小的两倍,而在右边,行高是文字大小的二分之一。
行内元素的外边缘在行高的上边缘和下边缘这个范围内对齐,如果行高小于文字的高度也无所谓。关于baseline的定义还是直接给出标准的链接

inline-block元素


从左到右的三幅图片都是inline-block元素,不同的是,左面包含着没有脱离正常流的内容c,中间的除了没有脱离正常流的内容以外还加了overflow:hidden,右面的没有内容但是内容区还有高度。红线代表了margin-box的边界。黄色代表的是border,绿色的是padding,蓝色的是content,蓝色的线代表的还是baseline。
inline-block元素的外边缘就是margin-box的边缘。
inline-block元素的baseline的位置要看该元素有没有处于正常流之内的内容。
(1)在有处于正常流内容的情况下,inline-block元素的baseline就是最后一个作为内容存在的元素的baseline,这个元素的baseline的确定就要根据他自身来确定了。
(2)在overflow属性不为visible的情况下,baseline就是margin-box的下边界了。
(3)第三种情况下baseline还是margin-box的下边界。

line-box


关于line-box的图上面已经给过了,这次我将文字部分高亮显示。line-box的上边界与最高元素的上边界对齐,下边界与最低元素的下边界对齐。
W3C标准中并没有定义line-box的baseline的位置。这一点很让人困惑,baseline的位置需要满足vertical-align属性的值以及让line-box的高度最小等条件,是一个很灵活的参数。
line-box的baseline是不可见的,但是可以很轻松的将它可视化出来,在行的开头添加一个字母,比如"x",这个字母的下边界默认就是baseline的位置。围绕着baseline在line-box中形成了文字盒。文字盒可以被认为是没有和任何元素对齐的line-box中的inline元素,它的告诉与它的父元素的font-size的值相同。因此,文字盒仅仅包含非格式化的line-box的文本,文字盒的边界由绿线来表示。因为文字盒是紧挨着baseline的,所以baseline的位置发生变化的话,文字盒的位置也会跟着改变(这里所说的文字盒在标准中被叫做strut)。
总结起来的话有以下两点:

有一个区域叫做line-box,垂直方向上的对齐都是发生在这个区域里面,它有baseline,有文字盒,有上下边界。

inline元素也有baseline和上下边界,inline元素是需要对齐的对象。

Vertical-align属性的值


有关Vertical-align各个取值的说明读者还是上MDN看吧。也可以看看天镶大神的博客上的文章

Vertical这个属性到底是怎么起作用的呢? 对齐一个Icon

我想将一个icon与文字对齐仅仅使icon的vertical-align属性的值设置为middle似乎不能产生令人满意的结果,例子如下图



Centered?



Centered!


下面给出上图的辅助线版本

原因就是左面的文字根本就没有发生对齐行为,它还是对齐于line-box的baseline。而vertical-align对齐的点是baseline加上半个x的距离(half of the x-height)。因此文字的最高点超过了icon的高度。
而右面的例子,文字与icon都对齐于一个中点,文字的baseline稍微下移,位于line-box的baseline的下方。结果是很好的达到了icon与文字对齐的效果。

line-box的baseline的移动问题

这是一个Vertical-align的坑,line-box中的所有元素都会影响到baseline的位置。假设,一个元素按某种方式垂直对齐了,但是这种对齐方式会引起baseline的移动,又因为大部分的垂直对齐方式(除了top和bottom)和baseline有关,因此这个元素的垂直方向对齐的行为会引起该line-box内其他元素位置的调整。
下面还是一些例子

一个很高的元素,其高度占满了整个line-box,那么vertical-align对其实没有影响的,在它的top和bottom之外没有空间让其移动。但是为了满足它的vertical-align的值,line-box的baseline会发生移动,左面的高元素的取值为text-bottom,矮元素的取值为baseline。右面的高元素的取值为text-top,你会看到baseline跳上去了










如果把高元素的vertical-align设置为其他值,也能看到类似的行为
甚至将vertical-align设置为bottom或者是top也会让baseline发生移动。这很奇怪,因为这时候应该就没baseline什么事儿了。










将两个更大的元素放在一个line里面,并且设置vertical-align的值让line-box的baseline移动。在满足vertical-align数值对齐的条件下,line-box的高度会自我调整,如左面的图。再增加第三个元素,第三个元素如果因为其vertical-align的设置不会超过line-box的边缘的话,它是不会影响到line-box的高度和baseline的位置的,如果它会超过line-box的边缘,那么line-box的高度和baseline的位置也会进行调整。在第二种情况下,另外两个元素的位置发生了下移。
















inline元素下方可能会有一点空隙

下面给出一个例子,如果尝试将li元素在垂直方向上进行对齐的话在,这个现象非常常见。



正如你所见,li元素是对齐baseline的,baseline的下方会给字母的一部分留出空间,因此会产生一个空隙。解决方案就是改变line-box的baseline的位置,比如将这些li这是为vertical-align:middle



inline元素之间的空隙造成布局效果与理想状态发生偏差
这主要是因为inline元素本身的原因,但是因为如果要让vertical-align的值产生作用的话,inline元素是必备要求,因此了解一点也不错嘛
这个空隙来源于inline元素之间的空格,所有的inline元素之间的空白都会变成一个空格。如果你想让inline元素在水平上紧挨着,设置它们的宽度是不行的。因为之间存在空隙,所以行的宽度不够放下两个inline元素。一行会被破坏为两行。解决方案如下图的右侧




50% wide
50% wide... and in next line
50% wide
50% wide
注意

两个建议,如果vertical-align属性不起作用,那么问问自己:

line-box的上下边缘以及baseline的位置在哪里?

inline元素的上下边缘以及baseline的位置在哪里?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111033.html

相关文章

  • Vertical-Align: 应该知道事情

    摘要:引言说起大家都知道他是用在对相邻的文字和内联元素上,比如常见的将一个图标和相邻的文字居中对齐。每个内联元素也有其自己的基线,顶线和底线。内联元素的基线位置低于行框的基线。内联元素的基线相对于行框基线移动相应于行高百分比的数值。 平时遇到vertical-align时候会有各种抓狂的时刻,调来调去虽然也弄好了但是心里面一直很虚,因为一直没有透彻理解过这个属性,搜索时候发现了一篇很棒的文章...

    yacheng 评论0 收藏0
  • 主流CSS水平和垂直居中技术大全

    摘要:水平居中行内元素的水平居中在父元素中设置只对内联元素或行内块元素有效需要放置于父元素中块级元素的水平居中只对块级元素有效指的是自适应宽度。参考张鑫旭实现绝对定位元素的居中及原理居中方式水平居中垂直居中块级元素设置内联元素设置。 原文地址:https://www.xksblog.top/CSS-mainstream-centering-techniques.html 几个月也零零散散学...

    KoreyLee 评论0 收藏0
  • CSS居中完整版

    摘要:块级元素对于块级元素,可以通过设置他的属性为来达到居中的效果。与其它情况不同,这个是用来处理一行内的元素居中的。在包含块里放置一个高度为的伪元素,这样,文本就居中了。 翻译自https://css-tricks.com/centering-css-com... 我将原作者的代码整理成了Github Repo,并且在持续更新使用CSS居中的方法,欢迎fork和star我的项目css-ce...

    TIGERB 评论0 收藏0
  • [译]关于vertical-align:需要知道一切

    摘要:绝对定位让元素脱离文档流,所以他们不再影响他们的周边元素。元素在文档流中,也能感知其他元素尺寸的改变。中间,一个在文档流中的元素并且带有属性的元素。最右,不在文档流中的元素但是内容区域有高度。元素的基线依赖于元素是否是文档流中的元素。 原文:Vertical-Align: All You Need To Know 通常我都有需要垂直对齐在一排上一个接着一个的元素。CSS提供了很多种可能...

    wuyangchun 评论0 收藏0
  • 居中css:完全指南(翻译)

    摘要:水平水平居中有行内元素和块元素,行内元素有文字图片链接等块元素主要是等元素。块元素对于一个块元素,可以设置其和自动,就像这样在线查看无论块元素的宽度是否已知,都可以实现水平居中。 这里主要参考的是CHRIS COYIER写的一篇的文章(点击查看),主要讲了关于css水平、垂直居中的一些方法,每个方法后面都有一个demo,可以在线查看效果。 1 水平 水平居中有行内元素和块元素,行内元素...

    Integ 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<