box‐sizing - daniel-qa/Vue GitHub Wiki
*, *::before, *::after {
box-sizing: border-box;
}
這叫 萬用選擇器(universal selector),意思是:
選取「所有 HTML 元素」
包含:
div
input
button
table
span
……全部都算
所以這一段其實是在說:
所有元素都用 border-box
原本超框
<input v-model="title" style="width: 100%; padding: 8px; margin-top: 6px;" />
修正後:
<input v-model="title" style="width: 100%; padding: 8px; margin-top: 6px; box-sizing: border-box;" />
為什麼你加了 box-sizing: border-box; 就正常?
原本:
width: 100%;
padding: 8px;
在 預設 content-box 下實際寬度會變成:
實際寬度 = 100% + padding(16px)
所以 input 會 撐出父層(這就是你看到的對不齊)。
改成 border-box 後:
100% 已經包含 padding
寬度才會乖乖貼齊。
- 但逐個 inline 修不是好做法
你現在這樣:
<input v-model="title"
style="width: 100%; padding: 8px; margin-top: 6px; box-sizing: border-box;" />
問題:
每個 input 都要寫一次(會漏)
inline style 無法被覆蓋
未來改 spacing 會變災難
Vue template 會越來越髒
- 正確解法:一次全域解決
在你的 main.css / global.scss / App.vue 加這段就好:
*, *::before, *::after {
box-sizing: border-box;
}
這是 現代專案標配,不是 hack,是應該本來就要有。
然後把 inline style 拆掉(這才是 Vue 寫法)
改成:
<input v-model="title" class="formInput" />
.formInput {
width: 100%;
padding: 8px;
margin-top: 6px;
}
- 為什麼不要把 box-sizing 寫在 component?
因為這不是「元件樣式」,而是:
整個 layout 計算模型的規則
它應該是 Design System Level 的設定。
就像你不會只在某頁才用 flexbox 一樣。
📦 幾乎所有框架都預設這樣做
Bootstrap reboot 有
Tailwind preflight 有
MUI 有
Ant Design 有
Normalize.css 延伸版本也有
你現在只是手動補回來而已。
🧠 一句話記住
box-sizing 是世界觀,不是樣式。
先看預設世界(content-box)到底多反人類
瀏覽器預設是:
box-sizing: content-box;
計算方式是:
實際寬度 = width + padding + border
例如你寫:
width: 100%;
padding: 8px;
border: 1px solid;
實際變成:
100% + 16px + 2px → 爆出容器
所以才會出現:
input 明明 100% 卻溢出去
grid / flex 對不起來
要一直手算 padding
RWD 很難控制
border-box 的世界(現代 layout 應該用的)
box-sizing: border-box;
計算方式變成:
你設定的 width = 已經包含 padding + border
也就是:
內容會自動縮小來配合,而不是把盒子撐大
這才是人類直覺的「我要這格就是 300px」。
那為什麼要寫成這樣?
*, *::before, *::after {
box-sizing: border-box;
}
這不是裝酷,是在補齊 CSS 的繼承漏洞。