word-break 和 word-wrap 的區別

elvinnn發表於2019-03-04

本文主要要介紹的是 CSS 中 word-break: break-allword-wrap: break-word 的區別,雖然這兩個屬性都有使用過,但都是屬於使用時查一查文件隨手就用,用完了也不會深入去探究的範疇,希望藉著這篇文章來深入的探究一下這兩者的區別。

有一句話是“沒圖說個 xx”,我覺得這句話在探究 CSS 時特別正確。先讓我們來看一張圖:

換行舉例
換行舉例

上面的圖是同一段 HTML 程式碼由不同的 CSS 控制產生的效果,大家能猜到具體是哪些 CSS 值嗎?答案在 jsfiddle.net/elvinn/88p8… 中,可以去看看猜的對不對 ^_^ 如果猜對了的話,那麼可以殘忍地關閉這篇文章了;不過假如沒有猜對的話,那麼不妨和我一起來探究一番吧。

word-break

word-break 在 MDN 上的官方解釋是 specifies whether or not the browser should insert line breaks wherever the text would otherwise overflow its content box,翻譯一下就是它決定了當文字要溢位容器時,瀏覽器是否應該插入換行符避免溢位,它有下列值:

word-break: normal;
word-break: break-all;
word-break: keep-all;

/* 全域性屬性 */
word-break: inherit;
word-break: initial;
word-break: unset;複製程式碼

我們只需要關注前三個值:normalbreak-all、和 keep-all,具體介紹如下:

  • normal:CJK(即 Chinese/Japanese/Koean,中日韓) 文字插入斷行,其它文字不插入斷行,如下圖中 1 所示;
  • break-all:所有文字都會插入斷行,如下圖中 2 所示;
  • keep-all:所有文字都不會插入斷行,如下圖中 3 所示(該值在移動端低版本瀏覽器上不支援)。
word-break 示意圖
word-break 示意圖

word-wrap

word-wrap 在 MDN 上的官方解釋是 specifies whether or not the browser should insert line breaks within words to prevent text from overflowing its content box,把這個和 word-break 的解釋對比,可以發現基本一模一樣,只是多了 within words 兩個單詞進行了限制,也就是說它只能控制是否在單詞內加入斷行,它有下列值:

word-wrap: normal;
word-wrap: break-word;

/* 全域性屬性 */
word-wrap: inherit;
word-wrap: initial;
word-wrap: unset;複製程式碼

我們只需要關注前兩個值:normalbreak-word,具體介紹如下:

  • normal:不會在非 CJK 單詞中插入斷行,如下圖中 1 所示;
  • break-word: 會在單詞中插入斷行避免溢位,如下圖中 2 所示。
word-wrap 示意圖
word-wrap 示意圖

也許 W3C 也覺得 word-breakword-wrap 這兩個屬性名字實在是太相似了吧,所以在 CSS3 規範裡把 word-wrapoverflow-wrap 重新命名了,不過目前瀏覽器支援不是很好,所以還是乖乖地使用 word-wrap 吧。

word-break 和 word-wrap 的區別

終於來到本文的重點了!一開始看到 word-break: break-allword-wrap: word-break 就頭大,這也太相像了,一共就四個單詞,結果還有三個單詞都是一樣的,效果看上去也好像沒什麼區別,也難怪 W3C 要給 word-wrap 換個名字了。那說回正題,區別在哪裡呢??

對比示意圖
對比示意圖

俗話說的好,一圖勝千言。在上圖中,我們可以清楚地看到,word-break: break-all 值如其名,斷開一切,利用上每一塊可以利用的空間來塞下文字,避免鋪張浪費;而 word-wrap: word-break 則收斂許多,假如一行文字有可以換行的點,如標點、CJK 文字等,那麼就不會在英文單詞或者字元中插入斷行了,不過從顯示效果來說的話則容易一塊兒密集、一塊兒空白,很不美觀。

white-space 大佬

前面說了這麼多 word-breakword-wrap 的值的作用,顯得它們很厲害的樣子。不過實際上它們受 white-space 大佬管轄,它的預設值為 normal 時可以允許 word-breakword-wrap 發揮作用,不過當它的值設為 nowrap 時,就會不允許換行,導致所有的文字都擠在一行之中,如下圖所示。

white-space 示意圖
white-space 示意圖

參考連結

  1. 張鑫旭 – word-break:break-all和word-wrap:break-word的區別
  2. MDN- word-break
  3. MDN – overflow-wrap

部落格原文連結

相關文章