National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 12

文字與字型

字型堆疊、自託管字型、行高、對齊與中文排版
Interaction 25 minute(s)

Learning Objectives

  • 寫出包含中文字型、並以通用字型結尾的字型堆疊,說明瀏覽器怎麼逐字遞補
  • 用 @font-face 載入網站自己提供的字型檔,並說明中文字型檔為什麼特別大
  • 設定 font-size、font-weight,知道字型沒有那個粗細時會發生什麼事
  • 說明 line-height 建議不加單位的原因,並用 text-align、letter-spacing、text-decoration 調整文字
  • 依中文排版的習慣設定行高、段落間距與行寬

網頁上大部分是文字

打開一篇文章、一份課程公告或一頁作品集,畫面上大部分都是文字。 字型選得好不好、行與行之間擠不擠、一行有多長,直接決定讀的人會不會累、會不會讀到一半就離開。

這一課學和文字有關的 CSS 屬性。它們大多會繼承(上一課),所以通常在 body 或文章的外框設定一次,裡面的元素就全部跟著變。

屬性 控制什麼
font-family 用哪一套字型
font-size、font-weight、font-style 大小、粗細、斜體
line-height 行高(一行佔多高)
text-align、letter-spacing、text-decoration 對齊、字距、底線與刪除線

font-family 與字型堆疊

font-family 列出一串字型名稱,叫做字型堆疊(font stack)。瀏覽器從第一個開始找,使用者的電腦裡有就用,沒有就試下一個:

body {
  font-family: "Noto Sans TC", "PingFang TC", "Microsoft JhengHei", sans-serif;
}
位置 寫什麼 說明
前面 你最想用的字型 名稱有空白要加引號
中間 各平台內建的字型 蘋方(PingFang TC)是 macOS、iOS 內建;微軟正黑體(Microsoft JhengHei)是 Windows 內建
最後 通用字型(generic family) sans-serif(無襯線,黑體類)、serif(襯線,明體類)、monospace(等寬,程式碼用)

最後一定要放通用字型:前面的字型全部找不到時,瀏覽器至少知道要用「某一種無襯線字」,而不是隨便拿一套。

遞補是逐字進行的:英文字型通常沒有中文字,遇到中文字時瀏覽器會往堆疊後面找有這個字的字型。 所以 font-family: Inter, "Noto Sans TC", sans-serif 的效果是:英文和數字用 Inter,中文用 Noto Sans TC。 反過來把中文字型放前面,英文也會用中文字型裡附的英文字母。

網站自己提供字型:@font-face

使用者的電腦裡不一定有你要的字型。網站可以把字型檔放在自己的伺服器上,用 @font-face 告訴瀏覽器去哪裡下載:

@font-face {
  font-family: "Playfair Display";          /* 自己取的名字,之後在 font-family 裡用 */
  src: url("/static/fonts/playfair.woff2") format("woff2");
  font-weight: 700;                         /* 這個檔案是哪一種粗細 */
  font-display: swap;                       /* 下載完成前先用備用字型顯示文字 */
}
h1 {
  font-family: "Playfair Display", serif;
}
  • woff2 是專為網頁壓縮的字型格式,目前主流瀏覽器都支援,優先使用它。
  • 字型檔原則上要和網頁在同一個網站;放在別的網域,對方的伺服器要允許跨來源讀取(CORS)才能用。
  • font-display: swap 讓文字先用備用字型出現,字型下載好再換上,使用者不必對著空白等待。

中文字型檔特別大:英文字型只要幾百個字元,中文字型要收錄上萬個字。 本平台自己提供的 Playfair Display 英文字型,拉丁字母的檔案約 38 KB;Noto Sans TC 中文字型則用 unicode-range 拆成 105 個小檔,合計約 4.3 MB, 瀏覽器只下載頁面上真的用到的字所在的那幾個檔。

很多網站會直接引用公開的字型服務(在 head 放一行別的網域的 link)。Uedu 平台的做法是把字型檔放在自己的伺服器上: 引用別的網域時,每一次開頁面,使用者的瀏覽器都會連到那個網站,對方因此得知有人在讀這一頁。

互動練習:字型堆疊與 @font-face

這份作品集現在全部是瀏覽器預設的襯線字。依任務修改 CSS。第 2 個任務的字型檔網址是:

/static/vendor/google-fonts/files/s/playfairdisplay/v40/nuFiD-vYSZviVYUb_rj3ij__anPXDTzYgA.woff2

小測驗:字型堆疊與 @font-face

1.

字型堆疊的最後為什麼要寫 sans-serif 這類通用字型?

2.

font-family: Arial, "Noto Sans TC", sans-serif;,段落內容是「Uedu 平台」。字型會怎麼用?

3.

下面哪一個是 @font-face 一定要有的兩個描述?

4.

某套中文字型只有 400(一般)和 700(粗體)兩個字重。寫 font-weight: 500 會怎樣?

第 1 次作答

字級、粗細與行高

font-size:內文通常在根元素的 1rem(瀏覽器預設 16px)左右,標題用 rem 往上加(第 9 課)。

font-weight:normal 等於 400、bold 等於 700,數字從 100 到 900。字型必須真的有那個粗細才會顯示得出來; 很多中文字型只有一般和粗體兩種,寫 300 或 500 時瀏覽器會找最接近的字重,看起來和 400 一樣。 字型完全沒有粗體時,瀏覽器可能把字描粗模擬,筆畫容易糊在一起。

line-height:行高。建議不加單位:

.box    { font-size: 15px; line-height: 1.1em; }   /* 算成 16.5px,這個「長度」傳給子元素 */
.box h2 { font-size: 30px; }                      /* h2 繼承 16.5px 的行高,兩行字會疊在一起 */

.box    { font-size: 15px; line-height: 1.1; }     /* 不加單位:傳下去的是「1.1 倍」這個比例 */
.box h2 { font-size: 30px; }                      /* h2 用自己的字級算:30 × 1.1 = 33px */

帶單位的行高(em、px、%)在父元素就算成固定長度,再原封不動繼承給子元素;不加單位的數字繼承的是比例,每個元素用自己的字級重新算。 內文的行高建議至少 1.5,中文因為筆畫密、沒有字母的上下伸展,常用 1.6 到 1.8。

互動練習:行高疊在一起了

按「執行」看預覽:標題換行之後,兩行字幾乎疊在一起。原因就在 .box 的 line-height。

對齊、字距、裝飾線與中文排版

屬性 常用的值 說明
text-align left、center、right、justify 對齊;justify 左右切齊,中文段落常用
letter-spacing 0.05em 字距;標題稍微拉開比較透氣,長篇內文不建議加太多
text-decoration underline、line-through、none 底線、刪除線;none 常用來拿掉連結的底線
text-indent 2em 段落首行縮排兩個字
font-style italic 斜體;中文字型通常沒有斜體,瀏覽器硬把字形歪斜,不好讀

中文網頁排版常見的習慣:

  • 行高比英文大:內文 line-height: 1.6 到 1.8。
  • 段落之間用 margin 留空間:例如 p { margin: 0 0 1em; };不要在 HTML 裡用好幾個 <br> 撐開。
  • 限制行寬:一行太長,眼睛換行時容易找錯行;文章外框可以加 max-width: 35em,以字為單位限制每行的長度。
  • 用全形標點:中文句子裡用全形的,、。:;「」(),不要混用半形的 , . : ;。中英文之間是否加空白,整個網站統一就好。
  • 強調用粗體,不用斜體(第 3 課)。
  • 連結不要只靠顏色區分:拿掉底線後,色弱或在陽光下看螢幕的人可能分不出哪些字可以點;內文的連結建議保留底線。

互動練習:讓中文文章好讀

這篇心得的行距太擠、段落黏在一起,連結也看不出可以點。依中文排版的習慣修改 CSS。

小測驗:行高與中文排版

1.

父元素 font-size: 16px,子元素 h2 font-size: 32px。父元素的 line-height 寫成哪一個,h2 的行高會是 48px?

2.

想讓中文段落之間空出一段距離,比較好的做法是?

3.

設計師把所有連結都改成 text-decoration: none,只用藍色區分。主要的問題是?

第 1 次作答

重點整理

  • 字型堆疊:想用的字型 → 各平台內建字型 → 通用字型(sans-serif、serif、monospace);遞補是逐字進行的。
  • @font-face 用 font-family 取名、src 指向字型檔(優先 woff2),加 font-display: swap;字型檔放在自己的網站上。中文字型檔大,常用 unicode-range 拆成很多小檔。
  • 字型要真的有那個粗細才顯示得出來,中文字型常只有一般與粗體。
  • line-height 不加單位,繼承的是比例;內文至少 1.5,中文常用 1.6 到 1.8。
  • 中文排版:段落間距用 margin、限制行寬、全形標點、強調用粗體、連結保留底線。

下一課講盒模型:每個元素都是一個盒子,內容、內距、邊框、外距怎麼決定它的大小和位置。

這一課完成了!
Next lesson:盒模型
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。