2025年08月11日/ 浏览 6
在数据加载场景中,波浪动画能有效缓解用户等待焦虑。相比传统的进度条,clip-path方案具备三大优势:
1. 矢量精确控制 – 通过贝塞尔曲线定义复杂路径
2. 性能优势 – 纯CSS实现,无需SVG或Canvas
3. 响应式适配 – 自动适应不同容器尺寸
clip-path通过多边形或路径裁剪元素显示区域,我们利用polygon()
或path()
函数定义波浪形状。动态修改路径坐标即可产生波动效果。
典型波浪可用正弦函数模拟:
css
/* 正弦波关键点示例 */
wave-point {
x: calc(100% * (i/n));
y: calc(50% + amplitude * sin(frequency * i));
}
html
css
.wave-loader {
width: 200px;
height: 200px;
position: relative;
overflow: hidden;
}
.liquid {
position: absolute;
height: 100%;
width: 200%;
background: linear-gradient(90deg, #3a7bd5, #00d2ff);
animation: wave 4s linear infinite;
}
@keyframes wave {
0% {
clip-path: polygon(
0% 70%,
20% 65%,
40% 70%,
60% 65%,
80% 70%,
100% 65%
);
transform: translateX(0);
}
50% {
clip-path: polygon(
0% 65%,
20% 70%,
40% 65%,
60% 70%,
80% 65%,
100% 70%
);
}
100% {
clip-path: polygon(
0% 70%,
20% 65%,
40% 70%,
60% 65%,
80% 70%,
100% 65%
);
transform: translateX(-50%);
}
}
will-change: transform;
css
:root {
--wave-height: 70%;
}
通过多个动画层错位叠加增强立体感:
css
.liquid:nth-child(2) {
animation-delay: -1s;
opacity: 0.7;
}
结合height属性和波浪动画,模拟容器填充效果:
css
@keyframes fill {
to { height: var(--target-level); }
}
使用vw单位和calc()实现自适应:
css
clip-path: polygon(
0 calc(70% + 5vw),
/* 其他点坐标 */
);
css
@supports not (clip-path: polygon(0 0)) {
.wave-loader { background: linear-gradient(...) }
}
创作手记:这个效果源自某次看到海水涨潮时的灵感,通过反复调试贝塞尔曲线控制点,最终找到了最自然的波动节奏。建议开发者多观察现实中的物理运动,往往能获得绝妙的动画创意。