作者: 刘倩 时间: 2020-12-22
在各种内联相关模型中,凡是涉及到垂直方向的排版或者对齐的,都离不开最最基本的基线(baseline
)。
字母 x 的下边缘(线)就是我们的基线。
x-height, 指的是字母'x'
的高度。术语描述就是基线base line和等分线mean line之间的距离
line-height
行高的定义就是两基线的间距用来指定行内元素或表格元素的垂直对齐方式
语法: baseline | sub | super | top | text-top | middle | bottom | text-bottom | <百分比> | <长度> | inherit
说明:
设置元素内容的垂直对齐方式。
参数:
其中 middle 和 x-height 有关,
middle
指的是基线往上 1/2 "x-height"
高度,也可以理解为 x 的叉点高度。
vertical-align
的百分比值不是相对于字体大小或者其他什么属性计算的,而是相对于line-height
计算的。
{
line-height: 30px;
vertical-align: -10%;
}
实际上,等同于:
{
line-height: 30px;
vertical-align: -3px; /* = 30px * -10% */
}
再看一个例子:
图片下方出现了空白,这是由于 img 元素的 vertical-align 属性默认为 baseline,baseline 意味着元素的基线通父元素的基线对齐,父元素的基线为字母 x 的下边缘(线),但是像图片或者输入框这种元素,本身没有基线,则是将其底端通父元素的基线对齐。
这个空白距离是由 line-height 决定的,而 line-height 的默认值是 normal,我们经常将 normal 理解为 1,或者 1.2。line-height 的值为数字时,表示的相对于 font-size 的倍数,而 font-size 相同,font-family 不同,是会影响到 line-height 值的。
解决方法:
1. 让 vertical-align 失效
img {
display: block;
}
2. 使用其他 vertical-align 值
取用其他属性值,比方说bottom
/middle
/top
都是可以的
.container {
width: 1rem;
height: 1rem;
line-height: 1rem;
font-size: 0.12rem;
color: green;
background: lightblue;
}
.container {
width: 1rem;
height: 1rem;
font-size: 0.12rem;
color: green;
background: lightblue;
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
}
1)内容区域(content area):
内容区域,上面图片中并没有指示出来。他是一种围绕文字的看不见的盒子,张鑫旭将其理解为“可以把文本选中的背景色区域作为内容区域”。内容区域没有明确的定义,所以将其理解为 em 盒(em-box,可看成是中文字符占据的 1em 高度区域)。内容区域是一个模糊而又重要的概念是理解后面一系列内容的基础。
2)内联盒子(inline box):分为内联盒子和匿名内联盒子。分别是蓝色部分和红色部分。
内联盒子不会让内容成块显示,而是拍成一行。
3)行框盒子(line box):每一行就是一个行框盒子,如黄线部分
一旦给定的某一行已经生成了所有的行内框,行框的构造就会考虑这些行内框,是行框的高度足以包含最高行内框的顶端和最低行内框的底端;行框包含很多行内框;
4)包含盒子(containing box):p 标签就是一个包含盒子。由一个个行框盒子构成。
“幽灵空白节点”是内联盒模型中非常重要的一个概念,具体指的是:在 HTML5 文档声明中,内联元素的所有解析和渲染表现就如同每个行框盒子的前面有一个“空白节点”一样。这个“空白节点”永远透明,不占据任何宽度,看不见也无法通过脚本获取,就好像幽灵一样,但又确确实实地存在,表现如同文本节点一样,因此,我称之为“幽灵空白节点”。
<!-- css: -->
<style>
div {
background-color: #cd0000;
}
span {
display: inline-block;
}
</style>
<!-- html: -->
<div><span></span></div>
;
可见 div 有高度,但是样式未设置其高度,span 也未设置高度。
注意:在谷歌上看不到 strut 效果,在火狐上才能看到