作为CSS快速入门最后一篇,将介绍CSS单位、文本样式、字体样式、背景样式和流向的改变。
# CSS单位
body { font-size: 16px; } div { /* 19.2 px */ font-size: 1.2em; /* 23.04 px,不是19.2px */ padding: 1.2em; }
# 文本样式
# line-height
含义:行高,即两行基线的间距,也等于行距 + 字体大小
取值:默认值为normal(与字体有关,一般重置行高样式为20px)、数值、百分比、长度
1、值为数值、百分比、相对长度时,是相对于当前字体大小计算
2、在继承性上,值为数值时直接继承该值,而百分比和长度继承的是最终计算值
实现垂直居中效果
1、对于非替换元素的单行内联元素,可见高度完全由行高决定(幽灵空白节点撑开),所以实现"近似(中文中线会偏低点)"垂直居中,设置行高即可(行距的上下等分机制),如有设置高度则令行高等于高度,此时上、下行距相等
2、对于替换元素或多行文本元素实现"近似(所有字体中x字符位置会偏下点)"垂直居中,则依赖vertical-align
.vertical-center{ /* 一来重置line-height大小;二来保持内联元素特性,利用幽灵空白节点撑开高度 */ display: inline-block; line-height: 100px; vertical-align: middle; }
1
2
3
4
5
6
# vertical-align
含义:文本在垂直方向上的对齐方式
生效前提:只能作用在display值为inline、inline-block、inline-table或table-cell的元素上,如span、img、button、input、td默认是支持的。但是注意若是内联元素,需要设置行高,让内联元素的幽灵空白节点撑起高度,vertical-align才起效
取值
线类
baseline:默认值,非替换内联元素的基线是小写字母x下边缘,而替换元素以自身下边缘作为基线
middle:若作用在内联元素,元素的垂直中心(中线)和行框盒子基线往上1/2x-height处(字符x的交叉点,但是所有字体中x字符位置都会偏下点)对齐;若作用在table-cell元素,则单元格填充盒子相对于外面的表格行居中对齐
top:垂直上边缘对齐。若作用在内联元素,则元素顶部与当前行框盒子的顶部对齐;若作用在table-cell元素,则元素顶padding边缘和表格行的顶部对齐
bottom:垂直下边缘对齐。若作用在内联元素,则元素底部与当前行框盒子的底部对齐;若作用在table-cell元素,则元素底padding边缘和表格行的底部对齐
数值百分比类
相对于基线上移或下移,负值下移,正值上移。可利用它实现图文垂直居中对齐
百分比相对于当前line-height计算
*文本类
text-top:盒子顶部与父级内容区域(父级元素当前font-size和font-family下应有的内容区域大小)的顶部对齐
text-bottom:盒子底部与父级内容区域的底部对齐
上标下标类
super:提高盒子基线到父级合适的上标基线位置,类似sup标签,但不同的是vertical-align:super不会改变字体大小
sub:降低盒子基线到父级合适的下标基线位置,类似sub标签,但不同的是vertical-align:sub不会改变字体大小
经验&技巧
1、当遇到不同字体大小的混合文本高度比所设置的行高大一点、父元素的高度比内部唯一子图片元素高一点、margin-top负值比图片高度大但图片仍旧无法脱离容器等问题时,明白都是幽灵空白节点、vertical-align和line-height共同作用的结果。通过将vertical-align垂直对齐方式改为top/bottom即可
2、一个inline-block元素,如果里面没有内联元素,或者overflow不是visible,则该元素的基线就是其margin底边缘;否则其基线就是元素里面最后一行内联元素的基线。利用该特性可以实现图标总是垂直居中,见示例无论“测试”文字字体多大多小,旁边图标总是与它垂直对齐 (opens new window)
3、遇到垂直方向上高度、对齐等疑惑问题,尝试加字母x,方便定位问题,找到解决方案
<!-- 分析示例:利用vertical-align实现水平垂直居中的弹框 --> <style> .container { /* 1、格式化宽度和高度,实现水平居中 */ position: fixed; top: 0; bottom: 0; left: 0; right: 0; background: rgba(0,0,0,.5), none; text-align: center; white-space: nowrap; /* 4、保证字符x中心点与容器上边缘对齐 */ font-size: 0; z-index: 99; } /* 通过伪元素创建行框盒子,且中线与容器中心对齐 */ .container::after { content: ""; /* 2、使height生效 */ display: inline-block; /* 3、使vertical-align: middle发挥效果 */ height: 100%; /* 5、与容器中心对齐 */ vertical-align: middle; } .dialog { /* 6、与行框盒子中线对齐 */ display: inline-block; vertical-align: middle; border-radius: 6px; background-color: #fff; font-size: 14px; text-align: left; white-space: normal; } </style> <div class="container"> <div class="dialog"> <!-- 弹窗内容 --> </div> </div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# color
- 含义:文本颜色
- 取值:见颜色值
# 更多文本样式
text-align
text-align-last
text-decoration
none
underline(下划线)
overline(上划线)
line-through(删除线)
text-transform
text-shadow
text-overflow
text-indent
display值为inline的内联替换元素设置text-indent无效
letter-spacing
具有继承性、在inline元素取负值起效发生字符重叠
word-spacing
具有继承性、在inline元素取负值起效发生字符重叠、间隔算法会受到text-align:justify影响
word-break
overflow-wrap
hyphens
white-space
# 字体样式
font-size
支持绝对长度单位如px,也支持相对长度单位如%,其中百分比是相对用户对浏览器设置的默认字体大小
桌面端Chrome渲染字体有不小于12px的限制,但有一个值特殊,即0,效果是文字隐藏
font-family
可以指定一种字体名或字体族,字体名有空格需加单引号,也可以指定多种,用逗号分隔,按从左到右的顺序查找字体,一般字体名在前,字体族在后,且建议英在前,中在后,若都没找到则使用默认字体
字体族常见的有衬线字体serif(如SimSun、Times New Roman)、无衬线字体sans-serif(如Microsoft YaHei、PingFang SC、Arial)、等宽字体monospace(一般针对英文字体,在代码、图形呈现)、系统UI字体system-ui
font-weight
一般建议避免使用权重值和相对粗细值,直接使用关键字如normal、bold。因为我们常用的字体缺乏对应的字重字体,此时会走权重值不可用下的回退机制,参考自MDN
font-style
font-size-adjust
当应用字体的尺寸比低于指定值时,为了保证可读性,会调整字体大小,即当前font-size值乘以该系数
项目常用字体设置
/* 通用字体 */ @font-face { font-family: Emoji; src: local("Apple Color Emoji"), local("Segoe UI Emoji"), local("Segoe UI Symbol"), local("Noto Color Emoji"); unicode-range: U+1F000-1F644, U+203C-3299; } body { font-family: system-ui, —apple-system, 'Segoe UI', Rototo, Emoji, Helvetica, Arial, sans-serif; } /* 衬线字体 */ .font-serif { font-family: Georgia, Cambria, 'Times New Roman', Times, serif; } /* 无衬线字体 */ .font-sans-serif { font-family: Arial, Verdana, Tahoma, Helivetica, Calibri, 'Microsoft YaHei', 'PingFang SC', sans-serif; } /* 等宽字体 */ .font-mono { font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 背景样式
background是背景色、背景图、背景图重复方式、背景图依附方式、背景图位置、背景图大小、背景相对起始位置、背景作用范围的简写,各属性说明如下,
若也设置了背景色,则会覆盖它
定性格式:top\bottom\left\right\center的两两组合
定量格式:x y,一般单位是像素或百分比。其中值为百分比时,计算公式如下:
posX = (容器宽度 - 图片宽度) * x
posY = (容器高度 - 图片高度) * y
# 流向的改变
# 块联轴与内联轴
块联轴定义网站的文档块流方向,CSS的书写模式writing-mode影响块联轴的方向
内联轴定义网站的文本流方向,即文本阅读方式,CSS的direction或HTML的dir影响内联轴的方向
下图摘自网络,说明清晰完整
# writing-mode
作用:改变块流方向。在水平方向适用的规则在垂直方向仍适用,如margin水平合并、margin:auto垂直居中等等
取值:
horizontal-tb:默认值,文本流是水平方向,元素从上到下堆叠
vertical-rl:文本流是垂直方向,元素从右到左堆叠
vertical-lr:文本流是垂直方向,元素从左到右堆叠
# direction
作用:同dir属性,改变文本流方向
取值:
lrt:默认值,从左到右
rtl:从右到左
局限性:只能改变图片、按钮顺序
改变文字顺序unicode-bidi
含义:bidi是bidirectionality的简写,中文译为字符集双向性,即字符串方向混杂
取值:
normal:默认值
embed:通常与normal表现一致,只能作用在内联元素上
bidi-override:强制所有字符按direction设置的方向排列