CSS伪元素before和after可以在选中的元素前后生成虚拟的DOM节点,这些节点不会出现在HTML文档结构中,却可以像普通元素一样设置样式和动画。将CSS动画和伪元素结合,能够在减少DOM冗余的同时,实现丰富的动态装饰效果,是前端开发中非常实用的技巧。

伪元素before和after基础用法
伪元素需要通过::before和::after选择器定义,并且必须设置content属性才会生效,哪怕content的值为空字符串。伪元素默认是行内元素,可以通过display属性修改其显示类型。
下面是一个基础的伪元素使用示例,给按钮添加一个前置装饰图标:
/* 按钮基础样式 */
.btn {
position: relative;
padding: 10px 20px;
background: #409eff;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
/* 用before伪元素添加装饰 */
.btn::before {
content: "★";
margin-right: 6px;
font-size: 14px;
}
给伪元素添加CSS动画
伪元素支持所有CSS动画属性,只需要给伪元素定义@keyframes动画,再通过animation属性绑定即可。需要注意的是,伪元素的动画触发时机和普通元素一致,比如可以绑定在:hover状态上,也可以默认就执行动画。
基础动画伪元素示例
下面的代码实现一个按钮hover时,伪元素从左侧滑入的效果:
/* 定义滑入动画 */
@keyframes slideIn {
from {
transform: translateX(-20px);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.slide-btn {
position: relative;
padding: 10px 20px;
background: #67c23a;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
overflow: hidden;
}
/* 伪元素初始状态 */
.slide-btn::before {
content: "";
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%) translateX(-20px);
width: 8px;
height: 8px;
background: #fff;
border-radius: 50%;
opacity: 0;
transition: all 0.3s ease;
}
/* hover时触发动画 */
.slide-btn:hover::before {
transform: translateY(-50%) translateX(0);
opacity: 1;
}
常见装饰效果实现案例
案例1:按钮流光边框效果
利用before伪元素生成渐变背景,通过动画让渐变背景旋转,实现按钮的流光边框装饰:
/* 定义流光旋转动画 */
@keyframes rotateLight {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.light-btn {
position: relative;
width: 160px;
height: 48px;
background: #fff;
border: none;
border-radius: 24px;
font-size: 16px;
color: #333;
cursor: pointer;
overflow: hidden;
}
/* 伪元素作为流光背景 */
.light-btn::before {
content: "";
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(45deg, #ff6b6b, #ffd93d, #6bcf7f, #4d96ff, #ff6b6b);
background-size: 400% 400%;
animation: rotateLight 3s linear infinite;
z-index: -1;
}
/* 内部白色背景覆盖中间部分,只留边框流光 */
.light-btn::after {
content: "";
position: absolute;
top: 2px;
left: 2px;
right: 2px;
bottom: 2px;
background: #fff;
border-radius: 22px;
z-index: -1;
}
案例2:文字下划线动态展开效果
用after伪元素作为下划线,默认宽度为0,hover时通过动画展开,实现文字下划线的动态装饰:
/* 定义下划线展开动画 */
@keyframes lineExpand {
from {
width: 0;
}
to {
width: 100%;
}
}
.dynamic-text {
position: relative;
display: inline-block;
font-size: 20px;
color: #333;
cursor: pointer;
}
/* 下划线伪元素 */
.dynamic-text::after {
content: "";
position: absolute;
bottom: -4px;
left: 0;
width: 0;
height: 2px;
background: #409eff;
transition: width 0.3s ease;
}
/* hover时展开下划线 */
.dynamic-text:hover::after {
width: 100%;
}
案例3:卡片悬停阴影扩散效果
通过before伪元素生成阴影层,hover时放大伪元素,实现卡片悬停时的阴影扩散装饰:
/* 定义阴影扩散动画 */
@keyframes shadowSpread {
from {
transform: scale(0.9);
opacity: 0.5;
}
to {
transform: scale(1.05);
opacity: 1;
}
}
.hover-card {
position: relative;
width: 240px;
height: 160px;
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
padding: 20px;
transition: transform 0.3s ease;
z-index: 1;
}
/* 伪元素作为扩散阴影 */
.hover-card::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border-radius: 8px;
background: rgba(0,0,0,0.08);
transform: scale(0.9);
opacity: 0.5;
z-index: -1;
transition: all 0.3s ease;
}
/* hover时触发阴影扩散 */
.hover-card:hover {
transform: translateY(-4px);
}
.hover-card:hover::before {
transform: scale(1.05);
opacity: 1;
}
注意事项
- 伪元素必须设置
content属性才会显示,即使不需要内容也要写content: "" - 伪元素的定位需要依赖父元素的
position属性,通常给父元素设置position: relative - 伪元素默认层级低于父元素内容,如果需要覆盖父元素内容,需要调整
z-index - 部分旧版本浏览器对双冒号伪元素语法支持不佳,如果需要兼容旧浏览器,可以使用单冒号
:before和:after
通过CSS动画和伪元素的结合,我们可以用更少的DOM节点实现更丰富的动态装饰效果,既减少了页面冗余,也提升了样式开发的灵活性。开发者可以根据实际需求,调整伪元素的样式和动画参数,实现更多个性化的装饰效果。
CSS动画伪元素before_after动画装饰效果修改时间:2026-06-29 13:12:35