🎨 CSS white-space 屬性教學

讓程式碼區塊正確換行的秘密

🤔 遇到的問題

❌ 問題現象

當我們在 HTML 裡寫了這樣的程式碼:

<div class="code-box"> <h1>這是大標題</h1> <p>這是一段文字</p> <img src="cat.jpg" /> </div>

期望顯示:每個標籤各佔一行,整齊排列

實際顯示:全部擠成一行 😱

<h1>這是大標題</h1> <p>這是一段文字</p> <img src="cat.jpg" />

🔍 為什麼會這樣?

HTML 的預設行為:

  • 把所有的「換行」當成「一個空格」
  • 把多個「連續空格」當成「一個空格」
  • 自動忽略多餘的空白

這在一般網頁內容很好用,但對於「程式碼區塊」就會出問題!

✅ 解決方法:white-space 屬性

💡 什麼是 white-space?

white-space 是一個 CSS 屬性,用來控制「空白字元(空格、換行、Tab)」要怎麼處理。

.code-box { white-space: pre-wrap; /* 加上這行就解決了! */ }

📊 white-space 的五個選項

屬性值 保留換行 保留空格 自動換行 適合用途
normal 一般文字(預設值)
nowrap 強制不換行
pre 純文字檔案
pre-wrap 程式碼區塊 ⭐
pre-line 詩詞、地址
💡 推薦使用 pre-wrap
  • ✅ 保留所有換行和空格(程式碼格式不會跑掉)
  • ✅ 遇到容器邊界會自動換行(不會跑出螢幕)
  • ✅ 最適合顯示程式碼!

🎮 互動示範:看看差異

下面是同樣的 HTML 程式碼,用不同的 white-space 設定:

❌ normal(預設值)- 會擠成一行
<h1>這是大標題</h1> <p>這是一段文字</p> <img src="cat.jpg" />
⚠️ pre - 會保留格式,但太長會跑出去
<h1>這是大標題</h1> <p>這是一段文字</p> <img src="cat.jpg" />
✅ pre-wrap - 完美!既保留格式,又會自動換行
<h1>這是大標題</h1> <p>這是一段文字</p> <img src="cat.jpg" />
⚡ pre-line - 保留換行,但不保留空格
<h1>這是大標題</h1> <p>這是一段文字</p> <img src="cat.jpg" />

📝 實際應用範例

範例 1:程式碼區塊(推薦用 pre-wrap)

/* CSS */ .code-box { background: #2d3748; color: #68d391; padding: 20px; border-radius: 10px; font-family: monospace; white-space: pre-wrap; /* 關鍵! */ }
/* HTML */ <div class="code-box"> <h1>標題</h1> <p>段落</p> </div>

範例 2:詩詞排版(可用 pre-line)

床前明月光 疑是地上霜 舉頭望明月 低頭思故鄉

範例 3:地址排版(可用 pre-line)

收件人:王小明 地址:台北市信義區信義路五段7號 電話:02-1234-5678

🎯 快速決策表

我應該用哪個 white-space?

  • 🖥️ 要顯示程式碼?
    → 用 white-space: pre-wrap;
  • 📜 要顯示詩詞、地址?
    → 用 white-space: pre-line;
  • 📄 一般網頁文字?
    → 用預設的 white-space: normal;(不用特別寫)
  • 🚫 強制文字不換行?
    → 用 white-space: nowrap;

💡 常見問題

Q1:為什麼不直接用 <pre> 標籤?

A:<pre> 標籤的預設樣式是 white-space: pre;,不會自動換行,在手機上可能會跑出螢幕。用 CSS 設定 white-space: pre-wrap; 更靈活!

Q2:pre-wrap 和 pre 差在哪?

A:

  • pre:不會自動換行,內容太長會跑出容器
  • pre-wrap:會自動換行,內容不會跑出容器 ✅

Q3:為什麼我的程式碼縮排不見了?

A:檢查是不是用了 pre-line(不保留空格)或 normal(不保留空格和換行)。要保留縮排,請用 pre-wrap

🏆 總結

記住這三點:

  1. HTML 預設會把換行當成空格,所以程式碼會擠成一行
  2. 用 CSS 的 white-space 屬性可以改變這個行為
  3. 顯示程式碼時,用 white-space: pre-wrap; 最適合

完整的程式碼區塊 CSS 範例

.code-box { background: #2d3748; /* 深色背景 */ color: #68d391; /* 綠色文字 */ padding: 20px; /* 內距 */ border-radius: 10px; /* 圓角 */ font-family: monospace; /* 等寬字體 */ font-size: 0.95em; /* 字體大小 */ line-height: 1.6; /* 行高 */ overflow-x: auto; /* 橫向捲軸 */ white-space: pre-wrap; /* 保留格式 + 自動換行 ⭐ */ }