CSS Viewport单元实战:打造完美自适应视觉差滚动效果
一、Viewport单位核心概念
vw (Viewport Width)
1vw = 视口宽度的1%
vh (Viewport Height)
1vh = 视口高度的1%
vmin
取vw/vh中的较小值
vmax
取vw/vh中的较大值
二、视差滚动效果实现
1. 基础HTML结构
<div class="parallax-container">
<section class="parallax-layer bg-layer"></section>
<section class="parallax-layer content-layer">
<h2>第一屏内容</h2>
</section>
<section class="parallax-layer foreground-layer"></section>
</div>
2. 核心CSS代码
.parallax-container {
height: 300vh; /* 3屏高度 */
position: relative;
overflow-x: hidden;
}
.parallax-layer {
position: fixed;
width: 100vw;
height: 100vh;
}
.bg-layer {
background: url('bg.jpg') center/cover;
transform: translateZ(-2px) scale(3);
}
.content-layer {
display: flex;
align-items: center;
justify-content: center;
transform: translateZ(0);
}
.foreground-layer {
background: url('foreground.png') center/contain;
transform: translateZ(1px) scale(0.8);
pointer-events: none;
}
3. 视差滚动动画
@keyframes parallax {
from { transform: translateY(0); }
to { transform: translateY(calc(-100vh * var(--speed))); }
}
.bg-layer {
--speed: 0.2;
animation: parallax linear forwards;
animation-timeline: scroll(root);
}
.content-layer {
--speed: 0.5;
animation: parallax linear forwards;
animation-timeline: scroll(root);
}
.foreground-layer {
--speed: 0.8;
animation: parallax linear forwards;
animation-timeline: scroll(root);
}
三、高级应用技巧
1. 动态视口单位计算
:root {
--vh: calc(var(--vh, 1vh) * 100);
}
.header {
height: calc(var(--vh) - 10vw);
}
/* JS动态更新 */
window.addEventListener('resize', () => {
document.documentElement.style.setProperty('--vh', `${window.innerHeight}px`);
});
2. 移动端适配方案
@media (max-width: 768px) {
.parallax-layer {
--speed: calc(var(--base-speed) * 0.5);
}
.bg-layer {
background-size: calc(100vw * 1.5) auto;
}
}
四、性能优化建议
- will-change:对动画元素添加
will-change: transform - 图片优化:使用WebP格式和响应式图片
- 硬件加速:启用
transform3d - 滚动节流:使用
requestAnimationFrame

