字母与基线
- 小写字母x的下边缘线就是基线baseline
- 小写字母x的上边缘线就是中线mean line(midline,距离基线到大写字母的上边缘线的1/2距离,即小写x的中间交叉点)
- 与x-height有关的CSS属性:vertical-align:middle,基线往上1/2 “x-height”高度
- vertical-align:middle不是相对容器中分线对齐的原因:因为内联元素垂直居中是对文字而言,并不是外部块级容器
ex单位
- 1ex = x-height
- 利用ex来设置inline-block元素高度实现视觉效果的垂直居中内联元素默认是基线对齐的,而基线就是x的底部,而1ex就是一个x的高度。图标高度就是1ex, 同时背景图片居中,那么图标和文字垂直居中,且完全不受字体和字号的影响。
.icon-arrow {
display: inline-block;
width: 20px;
height: 1ex;
background: url(http://www.zhangxinxu.com/study/201506/arrow.png) no-repeat
center;
}
<div id="divTest2" style="font-size: 24px;"> 垂直居中x
<i class="icon-arrow"></i>
xxAXA
</div>
line-height
- line-height撑开了外部元素的高度,font-size决定了文字的大小 ```javascript .line-height { line-height: 0; border: 1px solid; margin-bottom: 20px; } .font-size { font-size: 0; line-height: 16px; border: 1px solid; }
test
test
![image.png](https://cdn.nlark.com/yuque/0/2022/png/248010/1642757946680-cde6b3ca-39b0-4b4b-98a3-41f1b1c6d9a4.png#clientId=ucf488040-2957-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=49&id=ud04d5b2e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=98&originWidth=694&originalType=binary&ratio=1&rotation=0&showTitle=false&size=3562&status=done&style=none&taskId=u30367bd3-702b-4913-8482-60cf6a5da4d&title=&width=347)
2. **对于内联非替换元素,高度由line-height决定,line-height通过改变行距来改变高度**
- 行距 = line-height - font-size
- 内容区域与em-box,前者可理解为选中了文字的背景色所在区域,由font-family与font-size决定,后者由font-size决定(宋体的内容区域与em-box高度相同)
- 在设计师的标注中,如果标注的间距是从文字的上边缘到下边缘,就可以设置line-height为1,否则标注距离和使用的margin边距不一致
- 或者,通过计算margin-top = 设计师标注 - (line-height - font-size) / 2 (去整)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/248010/1642758113617-bfb192eb-de77-43c9-b9df-f487d50966ab.png#clientId=ucf488040-2957-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=226&id=u1c0b2e10&margin=%5Bobject%20Object%5D&name=image.png&originHeight=452&originWidth=1136&originalType=binary&ratio=1&rotation=0&showTitle=false&size=180171&status=done&style=none&taskId=u7dc4af90-8057-48ef-ad2e-7f1affc0fd2&title=&width=568)
3. **对于内联替换元素和内联非替换元素同时出现的情况,高度与line-height有关,它决定了最小高度**
![image.png](https://cdn.nlark.com/yuque/0/2022/png/248010/1642758152799-db5b9450-7e06-4847-b5c2-3e71aee5a956.png#clientId=ucf488040-2957-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=272&id=u1de3652c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=544&originWidth=1098&originalType=binary&ratio=1&rotation=0&showTitle=false&size=72804&status=done&style=none&taskId=u2920c50b-ce95-48d1-b036-feeb03034e6&title=&width=549)
javascript
test
div.one { font-size: 16px; box-sizing: border-box; line-height: 100px; width: 500px; }
4. **对于块级元素,line-height对其本身没有影响,通过改变内部的内联元素的高度影响块级元素的高度**
<a name="LI0Pw"></a>
## line-height与垂直居中
1. 单行的“近似”垂直居中。[https://codepen.io/ChloeFancy/pen/ERqGQK](https://codepen.io/ChloeFancy/pen/ERqGQK)
```javascript
div {
border: 1px solid;
line-height: 60px;
width: 200px;
}
<div>test</div>
近似的原因是,文字字形的垂直中线与行框盒子的垂直中线位置不一致,通常偏低
多行文字(块级元素)的“近似”垂直居中。近似的原因是,vertical-align:middle,与font-size以及总是偏低的x位置有关
line-height属性值
默认值normal,与font-family有关,字体确定后在不同浏览器下基本相同
- 数值/百分比/长度值
- 计算规则,1.5 / 150% / 1.5em
- 继承规则,后二者的子元素继承具体的计算值,而数值的自元素继承这个数值https://codepen.io/ChloeFancy/pen/ERqGeg
<div class="one">
<h3>title</h3>
<p>content</p>
</div>
<div class="two">
<h3>title</h3>
<p>content</p>
</div>
<div class="three">
<h3>title</h3>
<p>content</p>
</div>
div {
margin: 20px 0;
font-size: 14px;
}
h3,p {
margin: 0;
}
h3 {
font-size: 32px;
}
p {
font-size: 20px;
}
.one {
line-height: 1.5;
}
.two {
line-height: 150%;
}
.three {
line-height: 1.5em;
}
内联元素的line-height大值特性
<div class="box-one">
<!-- A -->
<span>内容......</span>
</div>
<div class="box-two">
<span>内容......</span>
<!-- <span>内容......</span> -->
</div>
.box-one {
line-height: 96px;
}
.box-one span {
line-height: 20px;
}
.box-two {
line-height: 20px;
}
.box-two span {
line-height: 96px;
}
.box-two span:last-of-type {
line-height: 106px;
}
- div的line-height > span的line-height
- div的line-height < span的line-height
无论哪一种情况,最终div的高度都是两个line-height中的最大值
原因分别是:
- 幽灵空白节点,即span前面的一个宽度为0,高度为所设置行高的一个元素节点,决定了行框盒子的高度
- 行框盒子的高度始终是高度最大的内联盒子的高度