字母x ?

《css世界》中提到:“我们这里的字母x就是26个英文字母中的x。由于自身形态的一些特殊性,这个小小的不起眼的字母担当大任,在css世界中扮演了一个重要的角色。”


笔者在这两天写一个项目中遇到了“居中”的困惑:我发现代码段

li{verticle-align: middle;
}

失效!

经过一番查证,发现:vertical-align属性只对行内元素有效,对块元素无效
但我很快想到:有时候为什么写了line-height也会出错、或者说反而会出错呢?

有时使用display:inline-block会导致verticle-align:middle失效。为何?因为display:inline-block会导致line-height有偏差

这又是什么原理?

字母x与“基线”

在各种内联相关模型中,凡是涉及垂直方向的排版或者对齐的,都离不开最基本的——基线。
例如,line-height行高的定义就是两基线的间距,verticle-align的默认值就是基线;其它中线顶线一类的定义也离不开基线。
基线也延伸出了很多其它的概念:
比如字母基线悬挂基线表意基线

而【基线】的定义就离不开本文的主角“X”。

字母x的下边缘(所在直线)就是我们所说的基线

上面所说内容当然和开头的“问题”没有直接关系,但是它确实引出了下面的一系列概念:

字母x与CSS中的x-height

要更深层次的了解字母x,或者说基线与居中有何关系,那就不得不说CSS中的一个概念——x-height
它指的是字母x的高度!

通俗的讲,x-height就是指小写字母x的高度,术语描述就是基线和等分线(也叫“中线”)之间的距离:

为什么要说这个?
CSS中有些属性值的定义其实就和这个x-height有关,最典型的代表就是verticle-align: middle;。这里的middle是中间的意思。注意:跟上面所说【中线】不是一个意思(图中baseline上面那根就是median——中线)。
在CSS中,middle指的是基线往上1/2 x-height高度的位置。我们可以近似理解为“字母x的交叉点所在位置”。

由此可见,verticle-align: middle 并不是绝对的垂直居中对齐 —— 我们平时看到的middle效果只是一种近似效果。原因很简单:不同字体在行内盒子中的位置是不一样的。

事实上,“微软雅黑”是一个字符比较下沉的字体——所有字符的位置都比其它字体要偏下一点。

也就是说,“微软雅黑”字体中的字母x的交叉点是在容器中分线的下面一点。而此时我们就不难理解为什么verticle-align不是相对容器的中分线对其的了。

让我们回到开头的一段代码,我们此时可以很容易想到:先将其变为行内

li{display: inline-block;verticle-align: middle;
}

发现没啥用。。。
然后我们“恍然大悟”,想到:这是缺少“参照”的表现啊!

而对于li列表,适合用什么布局呢?——table:

li{display: table-cell;   /* 转化为单元格 */verticle-align: middle;
}

其实line-block失效的原因有很多:比如你再元素外层又包裹了div,对div设置display、本来就是line…这里是恰好碰上li罢了

这样就解决了。

字母x与CSS中的ex

我们可能都听过em、rem、px、rpx,但是这个ex是什么鬼。。。
说起这个,他可能就会很自豪:毕竟是连IE6都支持的属性单位。

ex是CSS中的一个相对单位,指的就是小写字母x的高度。没错,就是指x-height。
而且——不受字体和自号影响的内联元素的垂直居中对其效果!

我们都知道,内联元素默认是基线对齐的,而基线就是x的底部,而1ex就是一个x的高度。设想一下,假如图片(标)的高度就是1ex,将其作为背景图片显示,这时如果(背景)图片居中,那岂不是图标和文字“天然”垂直居中对齐?而且不受字体和自号的影响。

<div class="mxc">yunxiaomeng<i class="icon-arrow"></i>
</div>
<style>.icon-arrow {display: inline-block;width: 20px;height: 1ex;background: url("/img/up.png") no-repeat center/20px 20px;}
</style>


然后就对齐了 —— 完全没有verticle-align的出场机会嘛!


当然,关于“居中偏差”的问题我们也可以用伪元素解决,比如这里:

li:after{content: "";display: inline-block;height: 100%;vertical-align: middle;
}

【本文所有资料来源:《CSS世界》;感谢张鑫旭大大】

CSS世界Bug般的存在——字母x与“居中”相关推荐

  1. 字母‘x‘在CSS世界中的角色和故事

    字母'x'在CSS世界中的角色和故事 by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordp ...

  2. 《css世界》的那些实用技巧

    下面所有的内容都来至张鑫旭所著的<css世界>. <css世界>这是一本专门写css的书,书中并没有涉及css3的知识,但是它所展现的东西很多都是我从未知道或以前未重视的.这是 ...

  3. 《CSS世界》读书笔记:line-height

    line-height 1. 行距与半行距 2. 半行距与精确的布局 3. 为什么line-height可以让内联元素"垂直居中"? 4. 使用line-height实现多行文本& ...

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

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

  5. 张鑫旭和他的《CSS世界》

    说到本书的作者,前端圈里没见过他的人有很多,但没读过他文章的人很少,他就是很多前端同行眼中的,张老师,张大神--张鑫旭(以下简称"张") 前一段时间,去参加"前端体验大会 ...

  6. 学习笔记——css世界

    流 "流"又叫文档流,是css的一种基本定位和布局机制.流是html的一种抽象概念,暗喻这种排列布局方式好像水流一样自然自动."流体布局"是html默认的布局机 ...

  7. css transparent张鑫旭,【灵感杂谈】张鑫旭和他的《CSS世界》

    原标题:[灵感杂谈]张鑫旭和他的<CSS世界> 说到本书的作者,前端圈里没见过他的人有很多,但没读过他文章的人很少,他就是很多前端同行眼中的,张老师,张大神--张鑫旭(以下简称" ...

  8. 读张鑫旭老师的《CSS世界》总结

    概述 整个css世界围绕"流"来展开,映射现实世界的流 现实世界,水流(div)放到一个容器里面,一定是平铺展开,如果放一个木头(span),它会漂在水流上面,再放一个,还是会跟前 ...

  9. 《CSS世界》读书笔记(十一)

    激进的margin属性 margin与元素尺寸以及相关布局 元素尺寸 border box尺寸,对应jQuery中的$().outerWidth()和$().outerHeight()方法,在原生DO ...

  10. jQuery+CSS五类验证码(字母、数字、滑动、点击)

    用到了js插件 <!DOCTYPE html> <html><head><meta charset="utf-8" /><li ...

最新文章

  1. JAVA的输入输出基本操作样例
  2. mockito_Mockito – JAXB的RETURNS_DEEP_STUBS
  3. idea无法创建javaclass文件
  4. 1号店11.11:分布式搜索引擎的架构实践
  5. c#后台线程更新界面
  6. boost::describe模块宏BOOST_DESCRIBE_PP_POINTER的测试程序
  7. python315题的漫漫通关之路
  8. f1 score 代码_腾讯广告算法大赛冠军代码解读:稠密特征工程
  9. Vivado Design Suite用户指南之约束的使用第二部分(约束方法论)
  10. Knative Eventing 中 Channel 如何注入默认 Provisioner
  11. JBPM工作流入门总结
  12. python里面的函数
  13. 【LeetCode从零单排】No118 Pascal#39;s Triangle
  14. Nginx + tornado + supervisor部署
  15. 零基础小白如何学习UI设计
  16. cn域名注册国外_国内注册域名有什么规则?有什么要求?
  17. 象棋名手手机版2019最新版_象棋名手326手机版-象棋名手增强版v6.58 安卓版-单机手游网...
  18. 猿创征文|[CM311-1A Armbian]-烧录制作 Armbian 系统盘以及写入 CM311-1A 机顶盒的 EMMC 刷成服务器
  19. [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
  20. 打印表格留标题怎么设置_表格怎么样设置打印出来有标题

热门文章

  1. WoShop分销积分拼团裂变APP小程序商城全开源无加密商城源码
  2. 使用网上软件激活win10后,默认谷歌浏览器被锁定hao123 解决思路
  3. cassandra数据库可视化工具
  4. 默纳克系统服务器怎么查故障,默纳克查历史故障
  5. Win7 Hotfix KB2685811 (64-bit)疑难杂症状之解药
  6. Gradle下载及安装,配置IDEA
  7. 英特尔固态硬盘测试软件,英特尔固态硬盘工具(Intel SSD Datacenter Tool)
  8. 专利:专利说明书的主要组成部分
  9. 经验分享——家长与学校应该怎样沟通
  10. (已解决)利用LiveReload插件实现vscode和谷歌浏览器实时刷新