box-shadow 不占用布局空间,纯属视觉修饰,不影响元素尺寸、文档流位置及相邻元素;其被 overflow: hidden 裁剪是因绘制区域超出而非占位;需手动用 margin 等预留空间。
直接回答:box-shadow 完全不参与盒模型计算,不会改变元素的 width、height,也不会推挤相邻元素或触发滚动条。这是它的默认行为,也是设计初衷——纯视觉修饰。
box-shadow: 0 0 100px rgba(0,0,0,0.5),元素实际尺寸和文档流位置毫无变化padding 或 margin 就能“容纳”阴影(因为阴影压根没进布局)overflow: hidden,长阴影会被裁掉——这不是“占空间”,而是被剪裁了用户常误以为阴影“撑开”了布局,其实背后是其他 CSS 行为在干扰:
border 或 padding 被漏加,而阴影让元素显得“变大”,其实是对比造成的视觉误差box-sizing: content-box(默认值),导致 width + border + padding 超出预期,误归因于 box-shadow
transform 或 position: absolute 使用时,阴影随元素
如果你确实需要阴影所占的视觉区域也参与布局(比如防止文字被阴影遮挡、或留白给打印样式),CSS 不提供自动方案,得自己算着来:
margin 模拟:比如阴影下偏 8px、模糊 12px,可加 margin-bottom: 20px 预留余量inset 阴影做“内占位”:更可控,且不影响主元素尺寸padding 硬撑——会同时影响内容区域,破坏设计意图/* 示例:用 margin 预留外阴影空间 */
.card {
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
margin-bottom: 16px; /* 手动预留,约 = v-offset + blur * 0.6 */
}虽然不挤布局,但 box-shadow 是 GPU 密集型操作,尤其在以下情况会拖慢渲染:
blur)超过 12px,尤其在中低端移动设备上box-shadow 值,却没加 will-change: box-shadow
rgba(0,0,0,1) 纯黑+高模糊,比 rgba(0,0,0,0.15) 多消耗约 40% 渲染时间真正容易被忽略的点:阴影是否可见,和它是否“存在”是两回事。浏览器仍会为不可见区域(如被 overflow: hidden 裁掉的部分)做绘制计算——所以裁剪不是优化,只是掩盖问题。