CSS内阴影与外阴影_box-shadow:inset的创意用法

1次阅读

box-shadow: inset 要生效需满足三要素:明确宽高、显式 background-color(如 transparent)、父容器无 overflow: hidden;其层级在 background-color 上、background-image 下,且跨浏览器渲染存在差异。

CSS内阴影与外阴影_box-shadow:inset的创意用法

box-shadow: inset 怎么写才真正生效

不加 borderbackground 的纯空 div,box-shadow: inset 是看不见的——它只作用于元素的“内容区+内边距区”,但若元素没尺寸、没背景、没边框,阴影就无处附着。

  • 必须确保元素有明确宽高(width/height 或由内容撑开)
  • 至少要有 background-color: transparent(显式声明,别依赖默认)
  • 避免父容器 overflow: hidden 裁掉内阴影边缘(尤其用大 blur 时)
  • 注意:inset 阴影不会触发硬件加速,但大量使用仍可能影响滚动性能

模拟内凹按钮和输入框聚焦态

比起改 border 或贴图,box-shadow: inset 是更轻量、更易配色的内凹方案,尤其适合 dark mode 切换场景。

  • 按钮按下态:box-shadow: inset 0 2px 4px rgba(0,0,0,0.2)(配合 transform: translateY(1px) 更真实)
  • 输入框聚焦内光晕:box-shadow: inset 0 0 0 2px #007aff(比 outline 更可控,不破坏布局)
  • 禁用状态慎用:inset 阴影在低对比度下易丢失,建议叠加 opacity 或灰阶 Filter

和 background-image 混用时的层级陷阱

box-shadow: inset 渲染层级在 background-color 之上、background-image 之下——这意味着它会被图片盖住,但能压住纯色背景。

  • 想让内阴影“透出”图片纹理?得用 background-blend-mode 或把阴影转成 background-image: radial-gradient()
  • 多层背景时,inset 阴影只对最底层背景生效,上层图片不受影响
  • 调试技巧:临时加 background-color: hsl(0,0%,95%) 看阴影是否绘制成功,再换回原背景

firefoxsafari 对 inset 阴影的渲染差异

Firefox 会严格按规范裁剪 inset 阴影到 border box 内;Safari(尤其旧版)有时会把模糊边缘“溢出”到 padding 外,导致视觉变厚。

立即学习前端免费学习笔记(深入)”;

  • 跨浏览器一致的关键:控制 blur 值别超过 padding 的 1.5 倍
  • Safari 15.4+ 修复了 insettransform 元素上的偏移 bug,但 ios 15.3 及更早仍存在
  • 不要依赖 inset 做精确像素级 ui 对齐,它本身不是 layout 工具

真正难的是让 inset 阴影在不同缩放、不同 contrast 设置、不同暗色模式适配下依然可辨——它看着简单,实则每调一个参数都在和渲染引擎博弈。

text=ZqhQzanResources