You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS实现元素可见时触发动画(无需页面刷新)

纯CSS实现元素进入视口时触发动画

核心思路

利用CSS原生的滚动驱动动画特性,让动画在元素进入屏幕视口时自动触发,全程无需JavaScript。

步骤1:定义动画效果

先用@keyframes编写你需要的动画,比如常见的淡入上移效果:

@keyframes fadeUp {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

步骤2:绑定视口触发规则

给需要触发动画的元素添加样式,通过animation-timeline绑定视口滚动事件,并用animation-range控制动画触发的时机:

.animate-on-scroll {
  /* 初始状态:保持动画未触发的样式 */
  opacity: 0;
  transform: translateY(20px);
  /* 绑定动画并设置结束后保持状态 */
  animation: fadeUp 0.6s ease-out forwards;
  /* 关联视口滚动作为动画触发源 */
  animation-timeline: view();
  /* 设定触发范围:元素顶部进入视口10%时启动动画,完全进入时结束 */
  animation-range: entry 10% cover 50%;
}

步骤3:旧浏览器降级方案(可选)

如果需要兼容不支持滚动驱动动画的旧版本浏览器,可以用过渡效果做简单降级(仅页面首次加载后触发一次):

/* 降级样式:仅作备选 */
.animate-on-scroll {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}

/* 页面获得焦点时触发过渡(效果有限) */
body:focus-within .animate-on-scroll {
  opacity: 1;
  transform: translateY(0);
}

注意事项

  • 现代浏览器(Chrome 115+、Firefox 117+、Safari 16.4+)已支持animation-timeline和view()函数,学习阶段优先使用该方案即可。
  • animation-fill-mode: forwards会让元素保持动画结束后的状态,不会随滚动重置。
  • 可调整animation-range参数自定义触发时机,比如entry 0% cover 100%表示元素刚进入视口就启动动画。

内容的提问来源于stack exchange,提问作者dododdo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:59:51