【翻译】关于vertical-align所有你需要知道的

本文是翻译过来的,如果有不对的地方还请指教~,原文链接:Vertical-Align: All You Need To Know

前面一些说明,可以略过不看吧

我经常需要对元素进行垂直方向上的布局

CSS提供了一些方法来实现这个功能,比如float,position: absolute,手动地增加margin或padding。

我并不是很喜欢这些方法。Floats只能让元素在顶端布局,而且需要手动清除浮动。absolute定位让元素离开文档流,且不再影响它的周围环境。利用固定的margigin和padding会让布局不够灵活。

但还有另一个方法:vertical-align。我想它应该得到更多的信任。技术上,使用vertical-align来布局是一个hack。因为,它不是为此而设计的。它主要是用来布局文本和文本旁的元素。当然,你也可以在不同的上下文中用vertical-align来灵活地布局元素。该方式下,元素的大小不需要被知道,元素在文档流中,其它元素可以对它的改变做出相应改变

古怪的vertical-align

vertical-align有时很奇怪。使用它有时会让人沮丧。比如,对于有些元素设置vertical-align后它会有影响,但是有些却不会。我仍然在vertical-align的黑暗中一次又一次摸索。

不幸的是,大多数的分析比较表面。尤其是如果我想用vertical-align进行布局。他们主要关注解释尝试利用vertical-align来布局一个元素中所有元素是一个错误。他们给出了vertical-align的基本介绍,并说明在一些简单情况下元素如何布局。但是,他们没有解释tricky的部分。

所以,我把这篇文章的目标设置为:一次性完全地阐明vertical-align的行为。通过学习W3C CSS规范以及一些实例得到这篇文章。

正文开始——

哪些元素可以使用vertical-align

vertical-align是用于inline级元素。这些元素的display属性为:

  • inline:包裹文本的基本标签
  • inline-block:块元素以inline方式呈现。它们可以设置宽度和高度,也可以设置padding、border和margin
  • inline-table(在本文中没有考虑)

inline级元素分布在一个行中。如果元素过多在一行中放不下时,那么一个新行就会在下面被创建。所有这些行都叫做line盒子,它包裹了这一行中的所有内容不同的内容大小意味着line盒子有不同的高度。下图用红线标出line盒子的顶边和底边。

line盒子会勾勒出在其中内容的轮廓。在这些line盒子中,vertical-align用于对一个独立的元素进行布局。

基线baseline和外边缘outer-edge

垂直布局的最重要的关键点是它包含的元素的基线。在有些情况下,包裹元素的line盒子的顶边和底边也很重要。让我们来看看不同元素类型的基线和外边缘

  • inline元素

图中线的标识说明:红线:line height顶边和底边;绿线:字体font的高度font-size(=基线上方的高度+基线下方的深度);蓝线:基线

line-height = font-size的高度 line height = font-size的2倍 line height = font-size的一半

inline元素的外边缘让元素布局在line的顶边和底边之间。如果line-height小于font的高度,这就不重要了。所以,外边缘就是图中的红线。

inline元素的基线是字符所在的位置。就是图中的蓝线。粗略地说,就是字体高度的中间的下方。

  • inline-block元素

元素盒子模型:红线:外边距margin;黄色:border,绿色:padding,蓝色:内容区域;蓝线:inline-block元素的基线

inline-block元素的外边缘是它的margin的顶边和底边,就是上图中的红线。

inline-block元素的baseline依赖于元素是否包含处于在正常流中的内容


inline-block元素中一个字符c

inline-block元素的baseline为正常流中的

最后一个内容元素的baseline


inline-block元素中一个字符c,且overflow: hidden

inline-block元素的baseline为盒子margin的底边


inline-block元素中没有内容,但是为内容区域设置了宽高

inline-block元素的baseline为盒子margin的底边

  • line盒子

text盒子在line盒子中,它的顶边和底边由图中绿色标识。这个text盒子可以看作是一个line盒子中没有任何布局的inline元素。它的高度与父元素的font-size高度对应。因此,text盒子就是包含line盒子中未格式化的文本。也就是图中的绿色部分。因为,text盒子与baseline是绑定在一起,当baseline移动时它也会随着移动。

对文本元素用灰色进行标亮

line盒子顶边与最上面元素的顶边一致,line盒子底边与最下面元素的底边一致。它是由红线标识。

line盒子的基线由蓝线标识。因为line盒子的基线是不可见的,可能不是很明显看到baseline在哪。但是,你可以在line的开头添加一个字符,比如图中的X,如果这个元素没有用任何方法布局,那么它默认在baseline上

CSS 2.1 does not define the position of the line box‘s baseline.

这可能是最令人疑惑的部分。这意味着,baseline被放置在需要满足其它条件如vertical-align以及最小化line盒子的高度。

总结两点

  • line盒子,它是垂直布局发生的位置。它有baseline,text盒子,顶边,底边
  • inline级元素。它们是被布局的对象。它们有baseline,顶边和底边(font-size)

vertical-align的值

vertical-align不同的设置值相对于不同的元素

  • 根据line盒子的baseline分布元素的baseline

baseline sub super <percentage> <length>
与line盒子baseline重合 line盒子baseline下 line盒子baseline上 相对于line-height的大小 绝对长度
  • 根据line盒子的baseline分布元素的外边缘

middle:元素顶边、底边的中点是在(line盒子baseline+X高度一半)位置

  • 根据line盒子的text盒子分布元素的外边缘

text-top:元素的顶边与line盒子的text盒子的顶边重合

text-bottome:元素的底边是line盒子的text盒子的底边重合

  • 根据line盒子的外边缘分布元素的外边缘

top:元素的顶边和line盒子的顶边重合

bottom:元素的底边和line盒子的底边重合

为什么vertical-align以这种方式来呈现?(几个实例)

  • 让一个icon和文本都垂直居中

<!-- left mark-up -->
<span class="icon middle"></span>
Centered?
<!-- right mark-up -->
<span class="icon middle"></span>
<span class="middle">Centered!</span>

<style type="text/css">
  .icon   { display: inline-block;
            /* size, color, etc. */ }
  .middle { vertical-align: middle; }
</style>


Centered?  没有设置样式,默认在基线上

因为取的是小写字母x的高度,而C是大写,

所以Centered?看起来并没有垂直居中

对Centered!设置垂直居中
  • line盒子基线移动

为了满足vertical-align的布局设置,line盒子的基线会自动发生移动

    • 情形一

<!-- left mark-up -->
<span class="tall-box text-bottom"></span>
<span class="short-box"></span>
<!-- right mark-up -->
<span class="tall-box text-top"></span>
<span class="short-box"></span>
<style type="text/css">
  .tall-box,
  .short-box   { display: inline-block;
                /* size, color, etc. */ }

  .text-bottom { vertical-align: text-bottom; }
  .text-top    { vertical-align: text-top; }
</style>


两个元素一高一矮,矮的不设置分布,默认在baseline上

高的设置text-bottom


两个元素一高一矮,矮的不设置分布,默认在baseline上

高的设置text-top,而text盒子是在baseline周围,

为了让高的能实现text-top布局,所以需要让baseline上移

    • 情形二

<!-- left mark-up -->
<span class="tall-box bottom"></span>
<span class="short-box"></span>
<!-- right mark-up -->
<span class="tall-box top"></span>
<span class="short-box"></span>
<style type="text/css">
  .tall-box,
  .short-box { display: inline-block;
               /* size, color, etc. */ }
  .bottom    { vertical-align: bottom; }
  .top       { vertical-align: top; }
</style>

高:vertical-align: top   矮:默认
高:vertical-align: bottom   矮:默认

虽然设置的是相对于line盒子的top,基线也会上移

    • 情形三

<!-- left mark-up -->
<span class="tall-box text-bottom"></span>
<span class="tall-box text-top"></span>

<!-- mark-up in the middle -->
<span class="tall-box text-bottom"></span>
<span class="tall-box text-top"></span>
<span class="tall-box middle"></span>

<!-- right mark-up -->
<span class="tall-box text-bottom"></span>
<span class="tall-box text-top"></span>
<span class="tall-box text-100up"></span>

<style type="text/css">
  .tall-box    { display: inline-block;
                 /* size, color, etc. */ }

  .middle      { vertical-align: middle; }
  .text-top    { vertical-align: text-top; }
  .text-bottom { vertical-align: text-bottom; }
  .text-100up  { vertical-align: 100%; }
</style>

 

两个较高的元素,

一个text-top,一个text-bottom


增加第三个元素,设置为middle

该元素没有超过line盒子的边界,故

对baseline位置和line盒子高度没有影响


增加第三个元素,设置为vertical-align: 100%

左图是原文的,右图是自己实现的,好像有点不太一样

黄色部分元素x的基线应该在line盒子基线上line盒子高度的100%

  • inline级元素底部有小间隙

比如布局一个li列表,这是由于baseline底部会留一些空间来放置文本的下行部分

<ul>
  <li class="box"></li>
  <li class="box"></li>
  <li class="box"></li>
</ul>

<style type="text/css">
  .box { display: inline-block;
         /* size, color, etc. */ }
</style>

解决方案:让这些元素设置成vertical-align

<ul>
  <li class="box middle"></li>
  <li class="box middle"></li>
  <li class="box middle"></li>
</ul>

<style type="text/css">
  .box    { display: inline-block;
            /* size, color, etc. */ }
  .middle { vertical-align: middle; }
</style>

这种情形不会在有文本内容的inline-block元素中发生,因为内容已经把baseline移到上方

  • inline级元素水平方向的间隙会破坏布局

两个inline-block宽度都设置为50%,且html中有换行符,那么这两个元素间会有一个间隙,导致一行放不下它们,使得第二个元素会被放在第二行

<!-- left mark-up -->
<div class="half">50% wide</div>
<div class="half">50% wide... and in next line</div>

<!-- right mark-up -->
   <div class="half">50% wide</div><!--
--><div class="half">50% wide</div>

<style type="text/css">
  .half { display: inline-block;
          width: 50%; }
</style>

让vertical-align不再神秘!

当vertical-align并不如你所相像地那样表现,那么请考虑以下两个问题:

  • line盒子的baseline、顶边、底边在哪?
  • 内联级元素的baseline、顶边、底边在哪?
时间: 2024-11-10 01:23:45

【翻译】关于vertical-align所有你需要知道的的相关文章

[翻译]关于Jmeter3.0,你必须要知道的5点变化

2016.5.18日,Apache 发布了jmeter 3.0版本,本人第一时间上去查看并下载使用了,然后群里或同事都会问有什么样变化呢?正好在网上看到一遍关于3.0的文章,但是是英文的.这里翻译一下,照顾英文不好的同学. Jmeter已发布了3.0,一个大版本的开源测试工具,加入了一些新的特性及软件的改进. Jmeter已隔10年的大版本更新 这是在过去12年里jmeter第一个大版本的更新,jmeter 2.0版本发布在2004年4月,直接从2.14版本跳 至3.0,这意味着什么样呢 大版本

[转]在做自动化测试之前你需要知道的

[转]在做自动化测试之前你需要知道的 2015-06-09 转自:在做自动化测试之前你需要知道的 什么是自动化测? 做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多.一直想动笔写一篇文章分享自动化测试实践中的一些经验.终于决定花点时间来做这件事儿. 首先理清自动化测试的概念,广义上来讲,自动化包括一切通过工具(程序)的方式来代替或辅助手工测试的行为都可以看做自动化,包括性能测试工具(loadrunner.jmeter),或自己所写的一段程序,用于生成1到100个测试数据.

你需要知道的CSS3 动画技术

译自:你需要知道的CSS3 动画技术 译自:What You Need To Know About Behavioral CSS 请尊重版权,转载须注明本站链接! 译序:本文译自Smashingmagazine,但是原文讲述的内容有些浅,也不是很完整,前端观察在翻译的前提下,增加了更多的更系统的内容.如有不足之处,欢迎指正补充. 随着网络的发展,浏览器具有更强的渲染更高级代码的能力,我们正逐步实现跨越所有平台和浏览器的目标.我们不但可以要花费更少的时间来确保我们的盒模型在IE6中看起来正常,而且

你应该知道的25个非常有用的CSS技巧

在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单. 说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与知识能事半功倍的给大家以帮助,经验丰富的CSS程序员通常都知道这一点,但初学者不要错过了! 这里有25个非常有用的CSS技巧,将帮助你解决让你棘手的CSS代码问题.你可以直接使用到你现在的项目当中 1.更改文本突出显示颜色(Change Text Highlight Color) 您可能不知道!使用

Web 设计与开发者必须知道的 15 个站点

新闻来源:catswhocode.com公司博客整整一个月没有更新了,最近一段时间,全公司都忙于两件事,为海尔集团做定制,为一个合作伙伴做 OEM,终于有了眉目.工作期间,常用到一些工具与帮助站点,今天读到一篇文章,介绍了15个对 Web 设计与开发师极端有用的站点,里面有不少也是我们一直在使用的,也许对很多人都有用,翻译出来以饷同仁. ColorCombos 配色是 Web 设计的首要大事,Color Combos 帮你预备了数千种配色方案,可以根据色调浏览选取.LIpsum Lorem Ip

StackExchange:Web开发中你需要知道的事

在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需要知道的?)里面给出的答案非常不错,所以,我翻译转载过来. 顺便说一下,StackExchange真是非常好,大家可以对同一个答案做贡献和修订,看看这个问题的修订过程你就知道了——专业的问答网站应该怎么去做.这就是我在这篇文章中也说过真正的用户体验是什么样的. 好了,下面是正文(我对原文做了一些批注

我们必须要知道的RESTful服务最佳实践

看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标准并不是很多,也没有必要.但是在实际运用中,有RESTful标准可以参考,是十分有必要的. 实际上在工作中对api接口规范.命名规则.返回值.授权验证等进行一定的约束,一般的项目api只要易测试.足够安全.风格一致可读性强.没有歧义调用方便我觉得已经足够了,接口是给开发人员看的,也不是给普通用户去调

使用Yeoman你必须要知道的

不得不说,这年头写JS程序变得越来越复杂了.虽然大家都为了让写JS变得更简单而创建框架.创建工具,但是感觉已经开始偏离了最初的目的. 今天来说说Yeoman,一帮人为了让写AngularJS程序更高端智能而创建的一个工具.可以利用简单的命令行操作帮你初始化一个Angular App,CSS.图片.View和JS应该放哪都帮你决定好了,连复杂的Grunt都帮你配好了.前端同志只要用"grunt serve"就可以预览你的Web App而不用配置Web服务器,用"grunt bu

在开发第一个Android应用之前需要知道的5件事:

你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的通用编程语言,但是Android还包括学习用于app界面设计的XML语言,学习Android概念,以及从Java编程角度运用这些概念. 学了Java和XML之后,再用Android理念将两者连接起来. 我也有分享过一些学习Activities和 Fragments等的Android相关知识.我最喜欢