搜尋

文字換行

進行網頁排版時,常會遇到「需要文字換行」或「不想要文字換行」的狀況,這篇教學會介紹 CSS 裡控制換行的樣式屬性 word-break、line-break、overflow-wrap ( word-wrap ),以及換行時使用 hyphens 產生「連字號」的做法,運用這些換行有關的樣式屬性,精準的控制文字換行。

CSS 教學 - 文字的換行

換行樣式

網頁的換行分成「硬換行」和「軟換行」兩種方式:

  • 硬換行:遇到換行字元或 <br/> 元素而強制換行。
  • 軟換行:當文字長度超過單行長度而自動換行,可以透過 CSS 樣式屬性控制換行行為。

下方列出使用 CSS 控制換行行為的樣式屬性 ( 所有瀏覽器都支援,並都具有繼承特性 ),大多數的換行樣式,只需要使用 word-breakoverflow-wrap ( word-wrap ) 搭配即可,而 text-wrap 屬於較新的樣式屬性,少部分瀏覽器可能不支援 ( 特別是行動裝置瀏覽器 )。

如要讓「過長的文字」在換行時加入連字號,或在指定的位置換行,請前往:hyphens 連字號

樣式屬性 說明
word-break 文字的換行方式。
line-break 具有標點符號 CJK ( 中日韓 ) 文字的換行方式。
overflow-wrap ( 舊版稱為 word-wrap ) 單字中的換行方式。
text-wrap 美化排版的換行方式。

word-break 文字換行方式

word-break 樣式屬性可以設定「文字的換行方式」,具有繼承特性,下方列出相關屬性值:

注意,這個樣式需要在 white-space: normal; 的狀態下才會正常運作,參考:定義文字空白與 Tab 大小

屬性數值 說明
normal 預設的換行規則。
break-all 非「CJK 中日韓」文字在單字之間換行 ( 空白分隔的字串就是單字,標點符號為非中日韓文字 )。
keep-all 非「CJK 中日韓」文字按照 normal 規則,「中日韓」文字不換行 ( 標點符號為非中日韓文字 )。

下方的範例使用不同的 word-break 屬性數值讓文字換行,需要注意「CJK 中日韓」語系和英文語系有差異,混用時英文會套用英文,中日韓文會套用中日文。

線上展示:https://codepen.io/oxxo/pen/JjqrxzY

<!-- HTML 程式碼 --> 
<div class="a">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/> abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>
<div class="b">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/> abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>
<div class="c">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/> abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>

<!-- CSS 程式碼 -->
<style>
div {
  border: 2px solid #000;
  width: 400px;
  margin: 10px;
  padding: 10px;
}
.a {word-break: normal;}
.b {word-break: break-all;}
.c {word-break: keep-all;}
</style>

CSS 教學 - 文字換行 - word-break 文字換行方式

line-break CJK ( 中日韓 ) 文字的換行方式

line-break 樣式屬性可以設定「具有標點符號 CJK ( 中日韓 ) 文字的換行方式」,具有繼承特性,通常在處理 CJK 語系或特殊標點符號的換行行為 ( 參考:UNICODE LINE BREAKING ALGORITHM )下方列出相關屬性值:

注意,這個樣式需要在 white-space: normal; 的狀態下才會正常運作,參考:定義文字空白與 Tab 大小

屬性數值 說明
auto 預設換行規則,通常等於 normal。
loose 鬆散換行規則,通常等於 normal。
normal 普通換行規則。
strict 嚴格換行規則,通常等於。
anywhere 任何位置都可以換行。

下方的範例使用不同的 line-break 屬性數值讓文字換行,範例中設定 word-break:keep-all;,若修改為 word-break:break-all; 可以看到最後一個 div 仍然呈現全部換行的樣式。

線上展示:https://codepen.io/oxxo/pen/rNgGReN

<!-- HTML 程式碼 --> 
<div class="a">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>
<div class="b">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>
<div class="c">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>
<div class="d">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>
<div class="e">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧</div>

<!-- CSS 程式碼 -->
<style>
div {
  border: 2px solid #000;
  width: 360px;
  margin: 10px;
  padding: 10px;
  word-break: keep-all;
}
.a {line-break: auto;}
.b { line-break: strict;}
.c {line-break: normal;}
.d {line-break: loose;}
.e {line-break: anywhere;}
</style>

CSS 教學 - 文字換行 - line-break 文字換行方式

overflow-wrap ( word-wrap ) 單字中的換行方式

overflow-wrapword-wrap 是同一種樣式屬性,可以設定「單字中的換行方式」,具有繼承特性,兩者差別只在於 overflow-wrap 是新版的樣式屬性名稱,為了向下相容所以目前兩個名稱都可以使用,下方列出相關屬性值:

注意,這個樣式需要在 white-space: normal; 的狀態下才會正常運作,參考:定義文字空白與 Tab 大小

屬性數值 說明
normal 預設換行規則。
break-word 拆開單字換行 ( 如果有隱藏換行位置,會從該位置換行 )。

下方的範例使用不同的 overflow-wrap ( word-wrap ) 屬性數值讓文字換行。

線上展示:https://codepen.io/oxxo/pen/YzbrgLe

<!-- HTML 程式碼 --> 
<div class="a">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧 </div>
<div class="b">The STEAM Education Website enables everyone to easily enter the learning realm of STEAM.<br/>abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz<br/>大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧 </div>

<!-- CSS 程式碼 -->
<style>
  div {
    border: 2px solid #000;
    width: 360px;
    margin: 10px;
    padding: 10px;  
    white-space: normal;        
  }
  .a {overflow-wrap: normal;}
  .b {overflow-wrap: break-word;}
</style>

CSS 教學 - 文字換行 - overflow-wrap ( word-wrap ) 單字中的換行方式

hyphens 連字號

hyphens 可以設定「單字中的連字號」,具有繼承特性,只要在過長的單字中加上「&shy」符號 ( 這個符號是隱藏的,並不會顯示 ),換行時就會在 &shy 的位置換行並補上連字號「-,下方列出相關屬性值:

注意,這個樣式在 word-break: break-all;line-break: anywhere; 強制換行的樣式中沒有作用。

屬性數值 說明
manual 預設在人工換行符號時換行,並添加連字號。
auto 根據作業系統和瀏覽器規則,自動添加連字號。
none 不添加連字號。

下方的範例會兩個過長單字的第二個加入 &shy,透過不同的 hyphens 屬性數值讓文字換行時產生連字號,藍色箭頭的連字號是系統自動產生 ( 不同電腦或瀏覽器觀看可能會有不同結果 ),紅色箭頭的連字號則是手動添加。

線上展示:https://codepen.io/oxxo/pen/KKLXEJw

<!-- HTML 程式碼 --> 
<div class="a">
  abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  <br/>
  abcdefghijklmnopqrstuvwxyz&shyabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  <br/>
</div>
<div class="b">
  abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  <br/>
  abcdefghijklmnopqrstuvwxyz&shyabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
</div>
<div class="c">
  abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  <br/>
  abcdefghijklmnopqrstuvwxyz&shyabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
</div>
<div class="d">
  abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  <br/>
  abcdefghijklmnopqrstuvwxyz&shyabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
</div>

<!-- CSS 程式碼 -->
<style>
  div {
    border: 2px solid #000;
    width: 360px;
    margin: 10px;
    padding: 10px;  
  }
  .a {hyphens: manual;}
  .b {hyphens: auto;}
  .c {hyphens: none;}
  .d {
    hyphens: none;
    word-break: break-all;  /* 加上強制換行,不會有連字號 */
  }
</style>

CSS 教學 - 文字換行 - hyphens 連字號

text-wrap 美化排版的換行方式

text-wrap 可以設定「美化排版的換行方式」,具有繼承特性,由於這是 2024 推出樣式屬性,目前仍有少部分的瀏覽器不支援,使用這個樣式後根據瀏覽器的演算法計算換行的位置,進而美化排版,有下列屬性值:

注意,由於各家瀏覽器演算法不同,加上無法實際掌握換行位置,許多換行情況不如前幾種換行方式。

屬性數值 說明
wrap 在適當的字元處換行 ( 預設值 )。
nowrap 不會跨行換行。會溢出元素之外。
balance 換行處會平衡每行的字元數,進而美化排版 ( 適合置中對齊 )。
pretty 類似 wrap,但會運用演算法產生更好的換行效果。

下方範例會展示這幾種屬性值的換行效果。

線上展示:https://codepen.io/oxxo/pen/WbeeWvP

<!-- HTML 程式碼 --> 
<div>The STEAM Education Website enables everyone to easily enter the learning realm of STEAM. <br> 大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧 </div>
<div>The STEAM Education Website enables everyone to easily enter the learning realm of STEAM. <br> 大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧 </div>
<div>The STEAM Education Website enables everyone to easily enter the learning realm of STEAM. <br> 大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧 </div>
<div>The STEAM Education Website enables everyone to easily enter the learning realm of STEAM. <br> 大家好我是 OXXO,現在來測試「 line-break:auto;」當長度太長時遇到標點符號不知道會不會換行?接下來的這段文字裡面沒有標點符號不知道會不會換行就來測試看看吧 </div>

<!-- CSS 程式碼 -->
<style>
  div {
    border: 2px solid #000;
    width: 360px;
    margin: 10px;
    padding: 10px;  
    white-space: normal; 
    text-align: center;
  }
  div:nth-of-type(1) {text-wrap: wrap;}
  div:nth-of-type(2) {text-wrap: balance;}
  div:nth-of-type(3) {text-wrap: pretty;}
  div:nth-of-type(4) {text-wrap: nowrap;}
</style>

CSS 教學 - 文字換行 - text-wrap 美化排版的換行方式

小結

由於響應式網頁技術的興起,加上中英文的交錯撰寫,間接讓「文字換行」變成網頁排版上的重要課題,透過這篇教學的介紹,相信對於使用 CSS 控制文字換行,能夠更得心應手

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 顏色單位 位置名稱與時間單位

變數與內容函式

變數 數學計算 文字與清單計數 生成內容與引號

顏色與濾鏡

色彩模型 漸層色 影像濾鏡

文字樣式

使用通用字型 使用外部字型 @font-face 定義字型 文字尺寸 常用文字樣式 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 特殊文字樣式

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 影像邊框 輪廓 ( outline ) 可見性與透明度 內容溢出與裁切

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask ) 物件填滿方式與定位 轉換函式 ( transform ) 3D 轉換與透視