CSS `Writing Modes` (`vertical-lr`, `vertical-rl`) 与文本流排版

各位观众,掌声欢迎!(假装有掌声)今天咱们聊聊 CSS 里有点意思,但又容易被忽视的“Writing Modes”。别怕,这玩意儿没那么玄乎,搞明白了,能让你的网页排版瞬间高大上。

开场白:文本流的那些事儿

在深入 Writing Modes 之前,咱们得先回忆一下网页上的文本是怎么流动的。默认情况下,文本就像水一样,从左到右,从上到下,填满容器。这就是所谓的“水平书写模式”(horizontal-tb),也是咱们最常见的模式。

但是,世界那么大,文字的流动方式可不止这一种。比如,古代的竹简,文字就是竖着写的。CSS 里的 Writing Modes 就是用来控制文本流动的方向的。

主角登场:Writing Modes 家族

Writing Modes 主要有以下几种:

  • horizontal-tb:水平方向,从上到下。这是默认值,不用特意设置。
  • vertical-rl:垂直方向,从右到左。
  • vertical-lr:垂直方向,从左到右。

注意,这里说的“方向”指的是的排列方向。每行里面的文字方向是由 direction 属性控制的,后面咱们会讲到。

实战演练:vertical-rl 初体验

咱们先来个简单的例子,看看 vertical-rl 是怎么工作的。

<!DOCTYPE html>
<html>
<head>
<style>
.vertical-text {
  writing-mode: vertical-rl;
  width: 100px; /* 必须设置宽度,否则容器会塌陷 */
  height: 200px;
  border: 1px solid black;
  font-size: 20px;
}
</style>
</head>
<body>

<div class="vertical-text">
  这是一段垂直方向从右到左排列的文字。
</div>

</body>
</html>

这段代码会把文字垂直排列,并且从右到左显示。注意,我们必须给容器设置宽度,否则容器会塌陷成一条线,因为在垂直书写模式下,容器的宽度变成了文字的高度。

vertical-lr:你的另一半

vertical-lrvertical-rl 类似,只是文字的排列方向相反,是从左到右。

<!DOCTYPE html>
<html>
<head>
<style>
.vertical-text {
  writing-mode: vertical-lr;
  width: 100px; /* 必须设置宽度 */
  height: 200px;
  border: 1px solid black;
  font-size: 20px;
}
</style>
</head>
<body>

<div class="vertical-text">
  这是一段垂直方向从左到右排列的文字。
</div>

</body>
</html>

direction 属性:控制文字方向

direction 属性用来控制文字在行内的排列方向。它有两个值:

  • ltr:从左到右(left-to-right),这是默认值。
  • rtl:从右到左(right-to-left)。

direction 属性通常和 unicode-bidi 属性一起使用,处理双向文本(比如同时包含英文和阿拉伯文)。这里咱们先不深入探讨双向文本,只关注 direction 属性对垂直书写模式的影响。

在垂直书写模式下,direction 属性会影响文字的旋转方向。默认情况下,文字会顺时针旋转 90 度。如果设置 direction: rtl;,文字会逆时针旋转 90 度。

<!DOCTYPE html>
<html>
<head>
<style>
.vertical-text {
  writing-mode: vertical-rl;
  width: 100px;
  height: 200px;
  border: 1px solid black;
  font-size: 20px;
  direction: rtl; /* 设置文字方向为从右到左 */
}
</style>
</head>
<body>

<div class="vertical-text">
  这是一段垂直方向从右到左排列的文字。
</div>

</body>
</html>

在这个例子中,文字会垂直排列,从右到左显示,并且逆时针旋转 90 度。

text-orientation 属性:更精细的控制

text-orientation 属性用来控制垂直书写模式下文字的显示方向。它有以下几个值:

  • mixed:允许字符垂直和水平显示。这是默认值,通常用于拉丁字母和数字。
  • upright:强制所有字符都直立显示。
  • sideways:强制所有字符都侧向显示(顺时针旋转 90 度)。
  • sideways-right:等同于 sideways
  • use-glyph-orientation:使用 SVG 的 glyph-orientation-* 属性(很少使用)。

咱们来看几个例子:

<!DOCTYPE html>
<html>
<head>
<style>
.vertical-text {
  writing-mode: vertical-rl;
  width: 100px;
  height: 200px;
  border: 1px solid black;
  font-size: 20px;
}

.upright {
  text-orientation: upright;
}

.sideways {
  text-orientation: sideways;
}
</style>
</head>
<body>

<div class="vertical-text">
  默认:这是一段文字。
</div>

<div class="vertical-text upright">
  upright: 这是一段文字。
</div>

<div class="vertical-text sideways">
  sideways: 这是一段文字。
</div>

</body>
</html>

在这个例子中,upright 类会让文字直立显示,而 sideways 类会让文字侧向显示。

表格总结:Writing Modes 相关属性

为了方便大家理解,咱们用一个表格来总结一下 Writing Modes 相关的属性:

属性 描述
writing-mode horizontal-tb (默认), vertical-rl, vertical-lr 设置文本的行排列方向。
direction ltr (默认), rtl 设置文字在行内的排列方向。在垂直书写模式下,会影响文字的旋转方向。
text-orientation mixed (默认), upright, sideways, sideways-right, use-glyph-orientation 设置垂直书写模式下文字的显示方向。

高级应用:结合 Flexbox 和 Grid

Writing Modes 可以和 Flexbox 和 Grid 结合使用,创建更复杂的布局。

例如,我们可以使用 Flexbox 来垂直居中一个垂直排列的文本:

<!DOCTYPE html>
<html>
<head>
<style>
.container {
  display: flex;
  justify-content: center; /* 水平居中 */
  align-items: center; /* 垂直居中 */
  width: 200px;
  height: 200px;
  border: 1px solid black;
}

.vertical-text {
  writing-mode: vertical-rl;
  text-orientation: upright;
}
</style>
</head>
<body>

<div class="container">
  <div class="vertical-text">
    垂直居中的文字
  </div>
</div>

</body>
</html>

在这个例子中,container 使用 Flexbox 布局,将 vertical-text 垂直居中。

注意事项:兼容性问题

虽然 Writing Modes 已经得到了广泛的支持,但仍然存在一些兼容性问题。特别是在一些老版本的浏览器中,可能需要添加浏览器前缀才能正常工作。

例如,对于 writing-mode 属性,可能需要添加 -webkit--ms- 前缀:

.vertical-text {
  -webkit-writing-mode: vertical-rl; /* Safari 和 Chrome */
  -ms-writing-mode: tb-rl; /* IE */
  writing-mode: vertical-rl;
}

在实际开发中,建议使用 Autoprefixer 这样的工具,自动添加浏览器前缀,提高代码的兼容性。

实际应用场景:不止于花哨

Writing Modes 并非只是为了让网页看起来更炫酷。在某些情况下,它可以解决实际问题。

  • 垂直导航栏: 可以使用 vertical-rlvertical-lr 创建垂直导航栏。
  • 亚洲语言排版: 对于一些亚洲语言(比如中文、日文),垂直排版是很常见的。
  • 创意排版: 可以结合其他 CSS 属性,创造出独特的排版效果。

进阶练习:制作一个垂直导航栏

咱们来做一个简单的垂直导航栏,巩固一下所学知识。

<!DOCTYPE html>
<html>
<head>
<style>
.navbar {
  width: 50px;
  height: 200px;
  background-color: #f0f0f0;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.nav-item {
  writing-mode: vertical-rl;
  text-orientation: upright;
  padding: 10px;
  text-decoration: none;
  color: #333;
}

.nav-item:hover {
  background-color: #ddd;
}
</style>
</head>
<body>

<div class="navbar">
  <a class="nav-item" href="#">首页</a>
  <a class="nav-item" href="#">产品</a>
  <a class="nav-item" href="#">关于</a>
  <a class="nav-item" href="#">联系</a>
</div>

</body>
</html>

这个例子使用 Flexbox 布局,将导航项垂直排列,并使用 writing-modetext-orientation 属性将文字垂直显示。

总结:掌握文本流动的力量

今天咱们聊了 CSS 的 Writing Modes,了解了如何控制文本的流动方向。掌握了这些技巧,你就可以创建更灵活、更具创意的网页布局。

记住,CSS 的世界是无限的,勇于尝试,你会发现更多惊喜!

课后作业:

  1. 尝试使用 Writing Modes 创建一个更复杂的布局。
  2. 研究 unicode-bidi 属性,了解如何处理双向文本。
  3. 分享你使用 Writing Modes 的经验和心得。

好啦,今天的讲座就到这里。谢谢大家!(假装有掌声)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注