《CSS世界》读书笔记(十五)
<!-- 《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世界》读书笔记(十五)的更多相关文章
- JavaScript权威设计--JavaScript脚本化文档Document与CSS(简要学习笔记十五)
1.Document与Element和TEXT是Node的子类. Document:树形的根部节点 Element:HTML元素的节点 TEXT:文本节点 >>HtmlElement与 ...
- How tomcat works 读书笔记十五 Digester库 下
在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...
- How tomcat works 读书笔记十五 Digester库 上
Digester库 在前面的几个章节里,我们对tomcat里各个组件的配置完全是使用写硬编码的形式完成的. 如 Context context = new StandardContext(); Loa ...
- Java 读书笔记 (十五) Java 异常处理
捕获异常 使用try 和catch关键字可以捕获异常.try/catch 代码块放在异常可能发生的地方. try/catch 代码块中的代码称为保护代码 ,使用try/catch的语法如下: try ...
- CSS揭秘读书笔记 (一)
CSS揭秘读书笔记 (一) 一.半透明边框 要想实现半透明边框可以使用border: border: 10px solid hsla(0,0%,100%,.5); background: ...
- 《Linux内核设计与实现》第四周读书笔记——第五章
<Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...
- 《Linux内核设计与实现》读书笔记——第五章
<Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ...
- 《CSS世界》笔记二:盒模型四大家族
上一篇:<CSS世界>笔记一:流/元素/尺寸下一篇:<CSS世界>笔记三:内联元素与对齐 写在前面 在读<CSS世界>第四章之前,粗浅的认为盒模型无非是margin ...
- 《C#从现象到本质》读书笔记(五)第5章字符串第6章垃圾回收第7章异常与异常处理
<C#从现象到本质>读书笔记(五)第5章字符串 字符串是引用类型,但如果在某方法中,将字符串传入另一方法,在另一方法内部修改,执行完之后,字符串的只并不会改变,而引用类型无论是按值传递还是 ...
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...
随机推荐
- prometheus + grafana + node_exporter + alertmanager 的安装部署与邮件报警 (一)
大家一定要先看详细的理论教程,再开始搭建,这样报错后才容易找到突破口 参考文档 https://www.cnblogs.com/afterdawn/p/9020129.html https://www ...
- SpringBoot中使用springfox+swagger2书写API文档
随着前后端的分离,借口文档变的尤其重要,springfox是通过注解的形式自动生成API文档,利用它,可以很方便的书写restful API,swagger主要用于展示springfox生成的API文 ...
- Appium自动化测试之Appium的安装与配置
Appium自动化测试- Appium环境的安装与配置Appium中文文档: https://github.com/appium/appium/tree/master/docs/cn Appium的安 ...
- 《Redis 命令操作》
一:Redis 的启动与关闭 - 关闭指定端口的 Redis - redis-cli -p 9200 shutdown - 开启 Redis - redis-server redis.config 二 ...
- Windows命令行设置dns
管理员运行cmd 1.dns配置成192.168.1.200 netsh interface ip set dns name="以太网" source=static addr=19 ...
- [转]k8s核心概念
转载自 https://blog.csdn.net/real_myth/article/details/78719244 什么是kubernetes 首先,他是一个全新的基于容器技术的分布式架构领先方 ...
- CatLog_小鱼要加油
python datetime 计算时间差 面向对象:类中的特殊成员 python中字符串的拼接 Django Django中一个项目使用多个数据库 Django中cookie和session使用 在 ...
- spring 数据库多数据源路由
项目中需要根据不同业务进行分库,首先是将业务不同业务映射到不同过的数据库( biz --> db,可能存在多对一情况), 查看springjdbc源码发现AbstractRoutingDataS ...
- keras笔记
函数式模型 函数式模型算是本文档比较原创的词汇了,所以这里要说一下 在Keras 0.x中,模型其实有两种,一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相 ...
- webclient 操作超时
Client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/ ...