首页 《CSS揭秘》笔记4 — 字体排印
文章
取消

《CSS揭秘》笔记4 — 字体排印

此篇博客是学习《CSS 揭秘》一书的学习笔记。

1. 连字符断行

当文字超出容器元素的宽度时,会换行。默认情况下,文字左对齐且一个完整的单词不会跨行显示,这样每行的末尾会产生参差不齐的空白(见下面左图)。

text-align: justify; 属性能够使文字两端对齐,最后一行无效(见下方右图)。

此属性有个缺点:当容器宽度很小,且单词长度差距很大时,会导致每行文字间隙的差异很大。

The hyphens CSS property specifies how words should be hyphenated when text wraps across multiple lines.
The hyphens CSS property specifies how words should be hyphenated when text wraps across multiple lines.

CSS3 中引入了一个新的属性 hyphens 告知浏览器在换行时如何使用连字符连接单词。它接受三个值:

  • none: 即使文字中的字符表示换行符,文字也不会在换行符处断开;
  • manual: 只有在单词内部的字符(­)表示换行的情况下,单词才会被断开;
  • auto: 只要遵循它所选择使用的任何规则,浏览器就可以自由地在合适的连字点处自动分词。

注: 部分支持,如谷歌浏览器目前仅在安卓和 Mac 平台支持该属性。

The hyphens CSS property specifies how words should be hyphenated when text wraps across multiple lines.

2. 插入换行

在通常情况下,采用定义列表是因为我们立志在互联网上以身作则,坚持使用合适的标签、合理的语义——哪怕在视觉上所要呈现的只是 一行行的名值对,我们也会认真对待。举例来说,如下面这段结构代码:

HTML

1
2
3
4
5
6
7
8
9
10
11
<dl class="wrap-5-2">
  <dt>姓名</dt>
  <dd>No One</dd>

  <dt>电话</dt>
  <dd>13100000000</dd>
  <dd>13200000000</dd>

  <dt>邮箱</dt>
  <dd>EMAIL@domain.com</dd>
</dl>

我们期望的显示效果如下:

姓名
No One
电话
13100000000
13200000000
邮箱
EMAIL@domain.com

CSS 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dl.wrap-5-2 {
  padding: 10px;
  background: #ff7873;
  border-radius: 5px;
}
dl.wrap-5-2 dt,
dl.wrap-5-2 dd {
  display: inline; /* 取 inline-block 时,换行符 \A 无效 */
  margin-inline-start: 0;
}
dl.wrap-5-2 dd {
  font-weight: bold;
}
dl.wrap-5-2 dt::after {
  content: ': ';
}
dl.wrap-5-2 dd + dt::before {
  content: '\A'; /* \000A 或 \A 表示换行符 */
  white-space: pre; /* 连续的空白符会被保留。在遇到换行符或者<br>元素时才会换行。 */
}
dl.wrap-5-2 dd + dd::before {
  content: ', ';
}

注:

  1. CSS 中 \000A\A 表示换行符。默认情况下,这些换行符会与相邻的其他空白符进行合并,因此需要配合第2条实现换行。
  2. white-space: pre;: 连续的空白符会被保留。在遇到换行符或者 <br> 元素时才会换行。
  3. +相邻兄弟选择器, dd + dt 表示 dd 元素的下一个 dt 兄弟元素(两者相邻);~ 则为通用兄弟选择器。

3. 文本行的斑马条纹

我们会经常在表格中使用 :nth-child():nth-of-type() 伪类实现斑马条纹。

此方法并不适用于文本行,但我们可以使用渐变来给文本生成一个条纹背景。

让我们用这个方法给代码加上斑马条纹。

HTML

1
2
3
4
5
<pre class="zebra-5-3">
  <code>
    代码省略...
  </code>
</pre>

效果及 CSS 代码如下:


pre.zebra-5-3{
  padding: 0 1em;
  line-height: 1.5;
  background-color: #f2f2f2;
  background-image: linear-gradient(rgba(255,120,115,.1) 50%, transparent 0);
  background-size: auto 3em;
  background-origin: content-box;
}
pre.zebra-5-3 code {
  background: none;
  color: #333;
}

注:

  1. 条纹背景尺寸使用 em 单位来自适应 font-size 的变化。
  2. 由于 line-height: 1.5; ,所以条纹背景高度为 3em ,因此这两个值要相互匹配。
  3. background-origin: content-box; 使背景图片的摆放以 content 区域为参考。

4. 下划线

使用 text-decoration: underline; 生成下划线很方便,但当我们想要自定义此下划线时就不那么简单了。

我们可以通过设置背景来生成自定义样式的下划线。

直线下划线

The linear-gradient() CSS function creates an image consisting of a progressive transition between two or more colors along a straight line.

CSS

1
2
3
4
5
.underline-5-4 span {
  background: linear-gradient(gray, gray) no-repeat;
  background-size: 100% 1px;
  background-position: 0 1em;
}

虚线下划线

The linear-gradient() CSS function creates an image consisting of a progressive transition between two or more colors along a straight line.

CSS

1
2
3
4
5
.underline-5-4-dashed span {
  background: linear-gradient(90deg, gray 66%, transparent 0) repeat-x;
  background-size: 1em 1px;
  background-position: 0 1em;
}

波浪下划线

The linear-gradient() CSS function creates an image consisting of a progressive transition between two or more colors along a straight line.

CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.underline-5-4-wave span {
  font-size: 20px;
  background: linear-gradient(-45deg, 
              transparent 40%, 
              red 0, 
              red 60%, 
              transparent 0) 
              0 1em, /* 0 1em 为 background-position */
              linear-gradient(45deg, 
              transparent 40%, 
              red 0, 
              red 60%, 
              transparent 0) 
              .1em 1em; /* .1em 1em 为 background-position */
  background-repeat: repeat-x;
  background-size: .2em .1em;
}

5. 字体效果

5.1 凸版印刷效果

在拟物化风格的网页中,凸版印刷效果是最流行的文字美化手法之一。

这种效果尤其适用于中等亮度背景配上深色文字的场景;但它也可用于深色底、浅色字的场景,只要文字不是黑色并且背景不是纯黑或纯白就行。

实际上,在最早期的图形界面中,为按钮生成按下或浮起效果就用到了类似的原理:出现在底部的浅色投影(或者出现在顶部的暗色投影)会让人产生物体是凹进平面内的错觉。同理,出现在底部的暗色投影(或者出现在顶部的浅色投影)会让人产生物体从平面上凸起的错觉。这种方法之所以奏效,是因为我们在现实世界中早已习惯了光源总是悬在头顶。在这样的环境里,凸起物的下方会产生阴影,而凹陷的底部边缘则会被打亮。

The text-shadow CSS property adds shadows to text.
The text-shadow CSS property adds shadows to text.

CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.font-5-5-1 {
  display: inline-block;
  margin: 0 14px 14px 0;
  padding: 10px;
  width: 200px;
  font-size: 20px;
  border-radius: 5px;
  background: hsl(210, 13%, 60%);
  color: hsl(210, 13%, 30%);
}
.font-5-5-1.shadow-1 {
  /* offset-x | offset-y | blur-radius | color */
  text-shadow: 0 .05em .05em hsla(0, 0%, 100%, .8);
}

注: text-shadow 前后四个值分别为x偏移、y偏移、模糊半径和颜色,颜色也可以放在第一位。

当背景为深色,字体为浅色时,我们需要把 text-shadow 颜色改为深色,并把阴影改为 -Y 方向偏移。

The text-shadow CSS property adds shadows to text.
The text-shadow CSS property adds shadows to text.

CSS

1
2
3
4
5
6
7
.font-5-5-1.reverse {
  background: hsl(210, 13%, 40%);
  color: hsl(210, 13%, 75%);
}
.font-5-5-1.reverse.shadow-1 {
  text-shadow: 0 -.05em .05em black;
}

5.2 空心字效果

目前浏览器还不支持 text-shadow 属性中的扩张参数,因此我们可以使用多个 text-shadow 来生成空心字效果。

空心字 stroked-text

HTML

1
<div class="font-5-5-2 stroked-text">空心字 stroked-text</div>

CSS

1
2
3
4
.font-5-5-2.stroked-text {
  text-shadow: 1px 1px #333, 1px -1px #333,
               -1px 1px #333, -1px -1px #333;
}

5.3 文字发光效果

在某些类型的网站中,文字外发光效果常用于凸显标题,或给链接添加鼠标悬停效果。

文字发光效果

CSS

1
2
3
.font-5-5-3.glow {
  text-shadow: 0 0 .1em, 0 0 .3em;
}
鼠标移入时文字发光

CSS

1
2
3
4
5
6
7
.font-5-5-3.glow-hover {
  cursor: pointer;
  transition: text-shadow 1s;
}
.font-5-5-3.glow-hover:hover {
  text-shadow: 0 0 .1em, 0 0 .3em;
}

5.4 文字凸起效果

另一种在拟物化风格的网站中流行(且被滥用)的效果是文字凸起(伪3D)效果。

这其中的主要思路就是使用一长串累加的投影,不设模糊并以 1px 的跨度逐渐错开,使颜色逐渐变暗,然后在底部加一层强烈模糊的暗投影,从而模拟完整的立体效果。

CSS3d
CSS3d

CSS

1
2
3
4
5
6
7
8
.font-5-5-4.extruded {
  text-shadow: 0 1px hsl(0,0%,85%),
               0 2px hsl(0,0%,80%),
               0 3px hsl(0,0%,75%),
               0 4px hsl(0,0%,70%),
               0 5px hsl(0,0%,65%),
               0 5px 10px black;
}
本文由作者按照 CC BY 4.0 进行授权