给卡片添加阴影是CSS入门阶段最常见的需求之一。单独的 box-shadow 可以快速让元素从背景中分离出来,但如果希望鼠标移入时阴影平滑加深、卡片轻微上浮,就需要把 box-shadow 和 transition 放在一起设计。本文以一个基础卡片组件为例,从阴影参数解释到过渡效果实现,帮助你掌握可复用的交互阴影写法。

代码中的核心逻辑并不复杂:默认状态定义较小的阴影,hover 状态定义较大的阴影,再用 transition 对阴影变化进行补间。真正容易出错的地方在于 transition 放置位置、阴影参数顺序以及性能优化选择。下面先从 box-shadow 的语法入手。
一、box-shadow 参数拆解:偏移、模糊与扩展
box-shadow 属性用来给元素添加阴影,完整语法是:box-shadow: h-offset v-offset blur spread color inset;。其中 h-offset 和 v-offset 分别表示水平偏移和垂直偏移,正值向右、向下,负值向左、向上;blur 是模糊半径,数值越大阴影边缘越柔和;spread 是扩展半径,正数让阴影向外扩大,负数让阴影收缩;color 定义阴影颜色,inset 可选,用于生成内阴影。初级项目中常用外阴影,因此 inset 暂时可以忽略。
例如一条常见的卡片阴影:box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);。它表示阴影在垂直方向向下偏移 4px,模糊半径 12px,颜色是透明度 8% 的黑色。这个组合让卡片看起来像浮在浅色背景上。为了后续过渡效果更自然,建议颜色使用 rgba 或 hsla,因为纯颜色在阴影扩散时不会有透明度带来的轻盈感。rgba 中的最后一个值控制阴影深浅,通常从 0.06 到 0.2 之间选择即可。
.card {
width: 300px;
padding: 24px;
border-radius: 12px;
background-color: #ffffff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
}
上面这段代码定义了一个基础卡片。阴影只给了垂直偏移,水平偏移为 0,这样视觉重心在卡片正下方,符合大多数界面中的卡片位置关系。你可以把 blur 改大,比如 24px,会发现阴影范围变宽但更淡;把 spread 设为 2px,阴影会整体向外扩大一圈。理解这四个长度参数对后续过渡非常有帮助,因为 transition 本质就是对这些数值的渐变插值。
二、transition 如何让阴影变化更平滑
如果只在 .card 和 .card:hover 中分别写不同的 box-shadow,浏览器在状态切换时会瞬间跳变,体验比较生硬。这时需要 transition 来补间两个状态之间的阴影数值。transition 的完整写法可以拆成四个子属性:transition-property、transition-duration、transition-timing-function 和 transition-delay。对于卡片阴影,至少要指定 property 和 duration,常见写法是:transition: box-shadow 0.3s ease;。
有一条重要规则:transition 必须写在元素的默认状态,而不是 hover 状态。因为浏览器需要知道从默认状态到 hover 状态的变化过程,如果只在 hover 状态写 transition,鼠标移入时可能不会生效,移出时才会产生动画。这个细节容易让初学者困惑,但只要记住“过渡是默认状态提供的规则”即可。想让移入和移出都有平滑效果,就把它写在 .card 里。
.card {
width: 300px;
padding: 24px;
border-radius: 12px;
background-color: #ffffff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
transition: box-shadow 0.3s ease, transform 0.3s ease;
}
.card:hover {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
transform: translateY(-4px);
}
上面的示例同时过渡了 box-shadow 和 transform。hover 时阴影向下偏移增加到 8px,模糊半径从 12px 变为 24px,颜色透明度从 0.08 提升到 0.16,同时卡片向上移动 4px。这样阴影和位移动画叠加,悬浮感会更明显。transition 中多个属性用逗号分隔,每个属性可以设置不同的时长和缓动函数,例如 transition: box-shadow 0.3s ease-out, transform 0.2s linear;。但对于初级项目,保持统一时长更简单。
如果希望阴影过渡更加柔和,可以尝试不同的缓动函数,比如 ease-in-out 或 cubic-bezier(0.4, 0, 0.2, 1)。ease 在开始时变化较快,适合大多数悬浮交互;ease-in-out 前后都慢,中间快,适合较大的阴影变化。时长一般控制在 0.2 秒到 0.4 秒之间,太短会显得突兀,太长则显得拖沓。
三、完整卡片组件实战:结构与样式结合
实际项目中卡片不仅是一个空盒子,还会包含标题、描述文字和按钮。下面给出一个完整的 HTML 结构和对应 CSS。结构中使用 <article> 作为卡片容器,内部包含 <h3>、<p> 和 <button>。你可以在初级项目中直接复用这套结构,再按业务需求修改文本。
<article class="profile-card"> <h3>用户昵称</h3> <p>这是一段简单的个人介绍,用来展示卡片内容随着阴影一起呈现的效果。</p> <button class="card-btn">查看资料</button> </article>
对应样式如下。为了突出卡片层次,给容器设置了圆角、内边距和浅色背景。阴影默认较小,hover 时加强,并通过 transform 实现轻微上浮。按钮也有自己的阴影变化,但没有使用 transform,只通过 box-shadow 和背景色变化来反馈鼠标操作。
.profile-card {
max-width: 360px;
margin: 40px auto;
padding: 28px 24px;
border-radius: 16px;
background-color: #ffffff;
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.08);
transition: box-shadow 0.35s ease, transform 0.35s ease;
}
.profile-card:hover {
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18);
transform: translateY(-6px);
}
.profile-card h3 {
margin: 0 0 12px;
font-size: 22px;
color: #1f2937;
}
.profile-card p {
margin: 0 0 20px;
line-height: 1.6;
color: #4b5563;
}
.card-btn {
padding: 10px 18px;
border: none;
border-radius: 8px;
background-color: #2563eb;
color: #ffffff;
cursor: pointer;
box-shadow: 0 2px 6px rgba(37, 99, 235, 0.35);
transition: box-shadow 0.25s ease, background-color 0.25s ease;
}
.card-btn:hover {
background-color: #1d4ed8;
box-shadow: 0 4px 12px rgba(37, 99, 235, 0.5);
}
这段代码可以直接复制到项目中运行。卡片默认阴影较浅,鼠标悬停时阴影加深、卡片向上浮动,按钮颜色变深并扩大阴影。整个过渡过程由 .profile-card 和 .card-btn 上的 transition 驱动。需要注意不要在 hover 规则里再次声明 transition,否则可能导致只有移出时的动画生效。
四、常见误区与性能优化建议
第一个常见误区是只给 hover 状态写 transition。前面已经提到,transition 应放在默认状态。第二个误区是过渡所有属性,例如 transition: all 0.3s;。虽然 all 也能生效,但在复杂页面中可能引起不相关属性的动画,增加渲染负担。建议明确列出要过渡的属性,如 box-shadow 和 transform。
性能方面,box-shadow 的过渡会触发重绘,因为阴影属于视觉效果。不过现代浏览器对阴影动画的优化已经不错,在卡片数量较少时不会产生明显卡顿。如果页面上有大量卡片,建议尽量避免同时过渡阴影,或者使用固定阴影加 transform 位移来模拟悬浮。transform 只涉及合成层,性能更好。必要时可以给卡片添加 will-change: transform;,提示浏览器提前优化,但不要滥用,否则会消耗更多内存。
阴影的颜色和透明度也会影响视觉效果。深色背景上,黑色阴影几乎看不见,应该使用更深的颜色或半透明白色内边框来区分层次。浅色背景上,使用 rgba(0,0,0,0.1) 这一级别的透明度最自然。最后,确保 hover 状态下的阴影和 transform 与默认状态使用相同属性列表,否则过渡可能不完整。
总结来说,box-shadow 与 transition 的结合是 CSS 入门阶段非常实用的技巧。掌握参数含义、过渡位置和性能细节后,你可以在登录卡片、商品列表、个人资料等场景中快速做出专业的悬浮反馈。
CSS卡片阴影box-shadowtransition修改时间:2026-08-26 10:28:13