<!-- 《CSS世界》张鑫旭著 -->

字母x——CSS世界中隐匿的举足轻重的角色

在各种内联相关模型中,凡是涉及垂直方向的排版或者对齐的,都离不开最基本的基线(baseline)。例如,line-height 行高的定义就是两基线的间距,vertical-align 的默认值就是基线,其他中线顶线一类的定义也离不开基线。

基线的定义:字母 x 的下边缘(线)就是我们的基线。

x-height 指的是小写字母 x 的高度,术语描述就是基线和等分线(mean line)(也称作中线,meanline)之间的距离。

vertical-align: middle 这里 middle 的意思是基线往上 1/2 x-height 高度。我们可以理解为字母 x 交叉点那个位置。

由此可见,vertical-align: middle 并不是绝对的垂直居中对齐,我们平常看到的 middle 效果只是一种近似效果。原因很简单,因为不同的字体在行内盒子中的位置是不一样的,比如,“微软雅黑”就是一个字符下沉比较明显的字体,所有字符的位置都比其他字体要偏下一点儿。也就是说,“微软雅黑”字体的字母 x 的交叉点是在容器中分线的下面一点。

ex 是CSS 中的一个相对单位,指的是小写字母 x 的高度,没错,就是指 x-height。

假如图标高度就是1ex,同时背景图片居中,岂不是图标和文字天然垂直居中,而且完全不受字体和字号的影响?因为 ex 就是一个相对于字体和字号的单位。

.icon-arrow {
display: inline-block;
width: 20px;
height: 1ex;
background: url(arrow.png) no-repeat center;
}

示例见 http://demo.cssworld.cn/5/1-1.php

内联元素的基石 line-height

对于非替换元素的纯内联元素,其可视高度完全由 line-height 决定。

对于文本这样的纯内联元素,line-height 就是高度计算的基石,用专业说法就是指定了用来计算行框盒子高度的基础高度。比方说,line-height 设为 16px,则一行文字高度是 16px,两行就是 32px,三行就是 48px,所有浏览器渲染解析都是这个值,1像素不差。

line-height 的作用细节都是使用“行距”和“半行距”来解释的。

在 CSS 中,“行距”分散在当前文字的上方和下方。一般业界的共识是:行距 = 行高 - em-box。转换成 CSS 语言就是:行距 = line-height - font-size。

em-box 是 CSS 世界中比较虚的一个概念,我们无法有效感知这个盒子具体的位置在哪里,就是其高度正好是 1em。

有了“行距”,我们一分为二,就有了“半行距”,分别加在 em-box 上面和下面就构成了文字的完整高度了。

很多人把文字图形区域看成是 em-box 范围,实际上这是不正确的,比方说,一些带尾巴的英文字符 q 或者 g,其小尾巴是在 em-box 范围之外的,而对于汉字,很多字体图形高度实际上要小于 em-box 高度的。

内容区域可以近似理解为 Firefox/IE 浏览器下文本选中带背景色的区域。大多数场景下,内容区域和 em-box 是不一样的,内容区域高度受 font-family 和 font-size 双重影响,而 em-box 仅受 font-size 影响,通常内容区域高度更高一些。但是,当我们的字体是宋体时,内容区域和 em-box 是等同的,因为宋体是一种正统的印刷字体,方方正正。

假设 line-height 是1.5,font-size 大小是14px,那么我们的半行距大小就是:(14px * 1.5 - 14px) / 2 = 3.5px。border 以及 line-height 等传统 CSS 属性并没有小数像素的概念,因为这里的3.5px需要取整处理,如果标注的是文字上边距,则向上取整;如果是文字下边距,则向上取整,因为绝大多数的字体在内容区域中都是偏下的.

line-height 不可以影响替换元素。

.box {
line-height: 256px;
} <div class="box">
<img src="1.jpg" height="218">
</div>

<div> 元素中,就一张图片,可是此时.box的高度却是256px,这并不是 line-height 把图片占据的高度变高了,而是把“幽灵空白节点”的高度变高了。

图片为内联元素,会构成一个“行框盒子”,在HTML5文档模式下,每一个“行框盒子”的前面都有一个宽度为0的“幽灵空白节点”,其内联特性表现和普通字符一模一样,所以这里的容器高度会等于 line-height 设置的属性值 256px。

对于块级元素,line-height 对其本身是没有任何作用的,我们平时改变line-height块级元素的高度跟着变化实际上是通过改变块级元素里面内联级别元素占据的高度实现的。

《CSS世界》读书笔记(十五)的更多相关文章

  1. JavaScript权威设计--JavaScript脚本化文档Document与CSS(简要学习笔记十五)

    1.Document与Element和TEXT是Node的子类. Document:树形的根部节点 Element:HTML元素的节点 TEXT:文本节点   >>HtmlElement与 ...

  2. How tomcat works 读书笔记十五 Digester库 下

    在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...

  3. How tomcat works 读书笔记十五 Digester库 上

    Digester库 在前面的几个章节里,我们对tomcat里各个组件的配置完全是使用写硬编码的形式完成的. 如 Context context = new StandardContext(); Loa ...

  4. Java 读书笔记 (十五) Java 异常处理

    捕获异常 使用try 和catch关键字可以捕获异常.try/catch 代码块放在异常可能发生的地方. try/catch 代码块中的代码称为保护代码 ,使用try/catch的语法如下: try ...

  5. CSS揭秘读书笔记 (一)

    CSS揭秘读书笔记      (一) 一.半透明边框 要想实现半透明边框可以使用border: border: 10px  solid  hsla(0,0%,100%,.5); background: ...

  6. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  7. 《Linux内核设计与实现》读书笔记——第五章

    <Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ...

  8. 《CSS世界》笔记二:盒模型四大家族

    上一篇:<CSS世界>笔记一:流/元素/尺寸下一篇:<CSS世界>笔记三:内联元素与对齐 写在前面 在读<CSS世界>第四章之前,粗浅的认为盒模型无非是margin ...

  9. 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理

    <C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...

  10. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

随机推荐

  1. (65)Wangdao.com第十天_JavaScript 垃圾回收机制 GC

    垃圾积累过多,致使程序运行缓慢,什么是垃圾? 当堆中某个内容,再也没有指针指向它,我们将再也用不了它,此时就是一个垃圾. 出现这种情况是因为 obj = null; 此时,js 中的垃圾回收机制会自动 ...

  2. SpringMVC的坑

    The request sent by the client was syntactically incorrect. 这个错误的原因是 因为 提交的表单数据和目标方法的入参不一致所导致   然后我就 ...

  3. App测试方法总结

    安全测试   一.安全测试 1.软件权限 1)扣费风险:包括短信.拨打电话.连接网络等. 2)隐私泄露风险:包括访问手机信息.访问联系人信息等. 3)对App的输入有效性校验.认证.授权.数据加密等方 ...

  4. viewport的故事(一)

    部分翻译 自原文 https://www.quirksmode.org/mobile/viewports.html   概念:设备像素和CSS像素   设备像素可以通过 screen.width/he ...

  5. centos7下NFS使用与配置

    NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. nfs为什么需要RPC?因为NFS支持的功能很多,不同功能会 ...

  6. js的作用域题

    ---恢复内容开始--- 1. var a = 12 function fn() { console.log(a) var a = 45; console.log(a) } fn() 2. funct ...

  7. laravel整合workerman做消息推送系统

    官方建议分离 workerman和mvc框架的结合,我去,这不是有点脑缺氧吗? 大量的业务逻辑,去独立增加方法和类库在写一次,实际业务中是不现实和不实际的 gateway增加一些这方面的工作,但是我看 ...

  8. 修改了my.ini没有效果,MySql的字符集还是没有变成utf8——mysql中文乱码

    https://www.jianshu.com/p/554b9575c5da Windows下修改MySql 5.6的字符集,根据网上提供的方法.就是修改my.ini配置文件,然后增加几个字段就可以了 ...

  9. 20175303 2018-2019-2 《Java程序设计》第7周学习总结

    20175303 2018-2019-2 <Java程序设计>第7周学习总结 教材学习内容总结 1.String类: Java专门提供了用来处理字符序列的String类 构造String对 ...

  10. LeetCode 171 Excel Sheet Column Number 解题报告

    题目要求 Given a column title as appear in an Excel sheet, return its corresponding column number. For e ...