1584 字
8 分鐘

CSS field-sizing: content 怎麼用?讓 input 與 textarea 隨內容調整

表單欄位常遇到兩個相反的需求:固定寬度在短文字時留下太多空白,完全依內容調整又可能把版面撐出去。以前通常要用 JavaScript 讀取文字、估算寬度,或針對 textarea 監聽 input 事件再改高度。

現在可以先試 CSS 原生的 field-sizing: content。它會把表單控制項的 preferred size 改成依內容計算,但仍然需要 min-widthmax-widthmin-heightmax-height 把可變範圍限制住。這篇只處理表單尺寸,不把它當成所有響應式版面的通用解法。

field-sizing: content 改變的是 preferred size#

field-sizing 有兩個主要值:

意義
fixed預設行為,使用表單控制項原本的 preferred size
content讓控制項依目前內容調整 preferred size

MDN 目前將 field-sizing 標示為 Baseline 2026,但舊裝置或舊瀏覽器仍應查相容性。content 可套用到文字類 inputtextareaselectfile input;每種控制項的尺寸行為不完全相同,因此不要只測一個 input 就推論整個表單。

input 先加上下限,避免只剩游標寬度#

沒有最小寬度時,空的 input 可能只剩下文字游標附近的寬度;有 placeholder 時,初始尺寸也可能以 placeholder 的內容為基準。實務上至少要設 min-inline-sizemax-inline-size

<label for="display-name">顯示名稱</label>
<input
id="display-name"
class="form-control"
type="text"
placeholder="輸入顯示名稱"
maxlength="40"
>
.form-control {
box-sizing: border-box;
max-inline-size: 100%;
}
@supports (field-sizing: content) {
.form-control {
field-sizing: content;
min-inline-size: 12rem;
max-inline-size: 32rem;
}
}

max-inline-size: 100% 讓欄位不超過父容器;maxlength 則從 HTML 層限制輸入長度,也能防止欄位無止境變大。這兩個限制解決的是不同問題,不要只依賴其中一個。

textarea 會先變寬,再在限制內增加高度#

textarea 使用 field-sizing: content 時,會先沿 inline 軸擴展;碰到寬度限制後,才會增加 block 軸的行數。若高度也有上限,內容超過後仍需要捲動查看:

<label for="comment">留言</label>
<textarea
id="comment"
class="form-control comment"
rows="3"
maxlength="500"
></textarea>
.comment {
max-inline-size: 100%;
}
@supports (field-sizing: content) {
.comment {
field-sizing: content;
min-inline-size: min(100%, 20rem);
max-inline-size: 36rem;
min-block-size: 6rem;
max-block-size: 18rem;
}
}

這裡刻意沒有把 inline-size: 100% 放在支援 field-sizing 的規則裡。固定的 widthheight 會重新施加固定尺寸,抵消 field-sizing: content 的效果。需要全寬欄位時,可以在不支援 field-sizing 的 fallback 中使用固定寬度,支援後再改用 min/max 邊界。

rowscols 與固定尺寸不是同一層設定#

使用 field-sizing: content 後,MDN 指出 textarearowscols 不再決定 preferred size;inputsize 也不再有原本的效果。這不表示它們會被 HTML 移除,而是 CSS sizing 行為已改由 field-sizing 與其他尺寸屬性主導。

可以用下面的方式理解:

  • field-sizing:決定 preferred size 要不要跟內容走。
  • min-*max-*:決定內容可以把控制項推到哪裡。
  • maxlength:決定使用者最多能輸入多少字元。
  • overflow:決定達到尺寸上限後要顯示還是捲動內容。
  • rowscols:在未使用 field-sizing: content 時,才比較接近傳統的初始尺寸控制。

不要同時設定一組固定 width、固定 height,再期待 field-sizing 自動覆蓋它們;最後通常只會得到一個看起來沒有作用的 CSS 宣告。

舊瀏覽器 fallback 要保留可用的固定版面#

@supports 適合把新屬性包起來,讓不支援的瀏覽器仍拿到固定尺寸:

.form-control {
display: block;
inline-size: min(100%, 36rem);
min-block-size: 2.75rem;
}
@supports (field-sizing: content) {
.form-control {
inline-size: auto;
field-sizing: content;
min-inline-size: 12rem;
max-inline-size: 100%;
}
}

如果欄位尺寸變化會推動下方大型內容,仍應在真實表單上檢查版面跳動;可以搭配 content-visibility 與 contain-intrinsic-size 的 CLS 檢查理解「延遲內容」和「動態尺寸」各自的版面影響。兩個屬性解決的不是同一個問題,但都需要看實際 layout,而不是只看 CSS 宣告是否存在。

什麼時候不要使用 field-sizing: content#

下面幾種情境,固定或彈性容器可能比內容尺寸更容易維護:

  • 工具列中的輸入框必須和旁邊按鈕保持固定對齊。
  • 表格欄位需要一致的欄寬,不能因某一筆資料變長而改變整欄。
  • 長文字來自使用者或外部資料,無法先設合理的最大寬高。
  • 舊瀏覽器仍是主要使用者,而 fallback 和新行為的差異會影響操作。

對話框、標籤輸入和短名稱欄位通常比較容易看出好處;大型資料表則應先測試資料分布與鍵盤操作,再決定是否採用。

驗證表單的三個狀態#

套用後不要只輸入一個短字串。至少測試:

  1. 空值加上 placeholder,確認欄位不會縮成游標寬度。
  2. 接近 maxlength 的長值,確認不會突破容器。
  3. textarea 超過 max block size 後,確認鍵盤、捲動條與錯誤訊息仍可操作。

若要確認實際支援狀態,可以在 DevTools 執行:

CSS.supports('field-sizing', 'content');

這只能回答目前瀏覽器是否理解宣告,不能取代實際的響應式與無障礙測試。每個控制項仍要確認 label、focus 狀態、錯誤訊息和鍵盤操作。

結論:用內容尺寸,但把邊界寫進 CSS#

field-sizing: content 適合拿來移除短文字欄位的固定空白,或讓 textarea 在輸入內容時自然增加高度。可靠的寫法不是只加一行 field-sizing: content,而是同時處理 min/max 尺寸、maxlength、fallback 與超過上限後的捲動行為。

常見問題#

Q: 為什麼加了 field-sizing: content,input 還是固定寬度?#

A: 檢查是否同時設定了固定 widthinline-size 或父容器限制。MDN 說明固定尺寸會重新施加 fixed sizing;可以保留 min-inline-sizemax-inline-size,但要避免用固定 inline size 把內容尺寸覆蓋掉。

Q: textarea 使用 field-sizing: content 後,rows 還有效嗎?#

A: rowscols 不再控制使用 field-sizing: content 時的 preferred size。改用 min-block-sizemax-block-size 和必要的 overflow 規則,並在未支援的 fallback 中保留 rows 作為合理的初始值。

Q: field-sizing: content 會讓所有表單欄位都自動變成響應式嗎?#

A: 不會。它改變的是表單控制項的 preferred size,仍會受父容器、min/max 尺寸、固定 width/height 和瀏覽器支援度影響。表單仍需測試窄螢幕、長輸入、focus 和錯誤訊息。

參考資料:

MDN:field-sizing CSS property

MDN:<textarea> element

CSS field-sizing: content 怎麼用?讓 input 與 textarea 隨內容調整
https://laplusda.com/posts/css-field-sizing-content/
作者
Zero
發佈於
2026-08-05
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。