欢迎来到我的博客文章!所有文章都是满满的前端干货,文章简明扼要。
是浏览器渲染每个元素时遵循的一套‘占地规则’——把所有 HTML 元素抽象成一个矩形盒子,由内容(content)、内边距(padding)、边框(border)、外边距(margin)四层组成。
默认的 box-sizing: content-box 会导致 width 只代表内容区,加上 padding 和 border 后实际宽度变大,容易引发布局溢出。我在开发中就遇到过:给一个width:100%的输入框加了 10px padding,结果水平滚动条出现了。后来我统一采用 border-box 模式——通过全局设置
*, *::before, *::after { box-sizing: border-box }这样
width 就包含 padding
和border,尺寸更可控,尤其在响应式和组件复用时特别稳。这也是
Bootstrap、Tailwind 等主流框架的默认做法
中级岗:
“我还了解它和 BFC 的关系——比如用 overflow: hidden 创建 BFC 可阻止 margin 折叠” “在做自适应卡片布局时,border-box 配合 flex-basis 能精准控制列宽” 高级/架构岗:延伸: “盒子模型是 Layout 阶段的核心输入,后续的 Paint/Composite 依赖它” “在微前端或 SSR 场景下,需确保各子应用 box-sizing 一致,避免样式污染”
标准模式宽度就是内容本身,而怪异模式是内容加上padding加上border,但是不加margin
可以看到很多网站都使用 * { box-sizing: border-box; } 这个样式,因为浏览器默认是标准模式,也就是 content-box , 而大家其实更习惯使用怪异模式
一句话总览(记忆锚点)
Flex 项目宽度 = 基础尺寸(flex-basis)
± 剩余空间分配(flex-grow / flex-shrink)(受 min-width/max-width 约束)
像“分红机制”:先定底薪(flex-basis),再看公司赚钱了(剩余空间 > 0)就按股份(flex-grow)分奖金;亏钱了(空间不足)就按股权比例(flex-shrink)扣工资。
*:focus { outline: none; } /* ⚠️ 高危操作!严重损害可访问性(Accessibility) 的行为 */ ✅ outline 是专为键盘用户设计的视觉焦点指示器,它不参与布局(不撑开盒子、不影响其他元素位置),因此可以安全地用于 :focus 状态,而不会导致页面“跳动”或错位。 对比:为什么不用 border / box-shadow 直接替代?
| 方案 | 问题 | 是否影响布局? |
|---|---|---|
outline: 2px solid #0066cc; | ✅ 完美:位置固定、不占空间、浏览器默认行为 | ❌ 不影响 |
border: 2px solid #0066cc; | ❌ 加 border 会让元素变大 → 邻居元素被挤动("布局抖动") | ✅ 会撑大盒子 |
box-shadow: 0 0 0 2px #0066cc; | ⚠️ 大部分情况OK,但某些旧浏览器/打印样式可能不显示 | ❌ 不影响布局(推荐替代方案) |
✅ 所以说:outline 是“可放心用”的,因为它专为无障碍设计,且无副作用。
/* 全局重置:保留焦点指示,但更美观 */
*:focus {
outline: none;
/* 先去掉默认样式 */
box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.5);
/* 蓝色发光边框,不占空间 */
/* 或用品牌色 */
/* box-shadow: 0 0 0 2px #1890ff; */
}
/* 特殊元素可单独优化 */
button:focus,
input:focus {
transition: box-shadow 0.2s;
}
CSS 新增伪类 :focus-visible 可自动判断:
/* 默认隐藏 outline */
*:focus {
outline: none;
}
/* 仅当浏览器检测到“可能是键盘操作”时显示 */
*:focus-visible {
outline: 2px solid #1890ff;
outline-offset: 2px;
}
✅ 效果: 鼠标点按钮 → 无 outline(视觉干净) 键盘 Tab 到按钮 → 有清晰
outline(无障碍保障)