用 box-shadow 配合 :hover 和 transition 实现自然悬停效果,关键在于偏移、模糊、扩散半径与透明度协同调整,并配合 translatey(-2px) 抬升,避免单纯增大阴影值导致生硬。

直接说结论:用 box-shadow 配合 :hover 伪类 + transition 实现,但阴影“变大变深”不等于无脑加大数值——关键在偏移、模糊和颜色透明度的协同调整。
为什么 hover 后阴影“飘起来”比“变黑”更自然
人眼对物体抬升有空间直觉,所以卡片悬停时轻微上移(transform: translateY(-2px))+ 阴影扩散(增大 blur-radius 和 spread-radius)+ 模糊边缘变软(提升 blur-radius),比单纯加粗阴影或改颜色更可信。纯靠 box-shadow: 0 0 10px #000 → 0 0 25px #000 容易显得生硬甚至“跳出页面”。
-
box-shadow四个核心值顺序固定:offset-x offset-y blur-radius spread-radius color - 推荐起始阴影:
box-shadow: 0 2px 6px 0 rgba(0,0,0,0.1)(轻、低、透) - 悬停目标阴影:
box-shadow: 0 4px 12px -2px rgba(0,0,0,0.15)(略抬高、略扩散、边缘微收) - 必须加
transition: box-shadow 0.2s ease, transform 0.2s ease,否则变化突兀
常见阴影失效原因:z-index 和父容器溢出
阴影是“绘制在元素盒模型之外”的效果,一旦父容器设了 overflow: hidden 或子元素 z-index 错乱,阴影就会被裁掉或盖住。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 检查卡片直接父容器是否含
overflow: hidden或overflow: auto—— 有则删或改visible - 若卡片用了
position: relative且设了z-index,确保其值大于同级其他元素,否则悬停时阴影可能被隔壁卡片遮挡 - 阴影本身不触发重排(reflow),但
transform抬升会触发合成层,性能更好;别用top: -2px替代transform
移动端 hover 不生效?用 focus-within 或 JS fallback
触摸设备没有“悬停”概念,:hover 在 iOS/Android 上仅对可聚焦元素(如 a、button)在点击后短暂触发,无法持续响应手指停留。
- 最简方案:给卡片外层包裹
@#@#@#@#@#@#@#@#@#@0或加tabindex="0",再用&:focus-within模拟(需 CSS 支持) - 稳妥方案:监听
touchstart添加临时 class,例如card--hovered,CSS 中写.card:hover, .card--hovered { ... } - 别依赖
@media (hover: hover)做全量判断——它只表示设备“支持 hover”,不代表当前是 hover 状态
真正难的是阴影与背景色、文字对比度的平衡:深色背景上浅阴影容易看不见,浅色背景上深阴影又可能喧宾夺主。调的时候盯着真实设备看,而不是只看开发工具里的预览框。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










