用@keyframes实现太阳从左到右匀速升起动画,核心是transform: translate(x,y)配合opacity、scale变化模拟升腾感,禁用top/left、fixed定位及background-attachment,强制GPU加速,绑定IntersectionObserver滚动触发并确保forwards保持终态。

用 @keyframes 实现太阳从左到右匀速升起动画
太阳“升起”在网页里本质是位置移动 + 渐变透明 + 可选的光晕效果,不是真实天文运动,所以不用计算角度或时间。核心是让一个圆形元素从页面底部左侧移出,沿弧线(或近似弧线)向上向右移动,同时逐渐变亮、变大、不透明度提升。
常见错误是只用 top/left 线性位移,导致路径僵硬像“斜拉桥”,缺乏升腾感;或者忽略 transform: translate() 的硬件加速优势,动画卡顿。
- 用
transform: translate(x, y)替代top+left,保证流畅性 - 起始位置设在视口外左下(如
translate(-20%, 120%)),终点设在右上天空区域(如translate(120%, -20%)) - 配合
opacity从 0 → 1,scale从 0.6 → 1.1,模拟初升时朦胧、渐显、略放大的视觉节奏 - 动画时长建议 8–12 秒,
ease-out或cubic-bezier(0.34, 1.56, 0.64, 1)更接近自然加速度衰减
避免 background-image 或 SVG 路径导致的兼容/维护问题
有人用 SVG <path></path> 做精确弧线,或用 CSS background-image 拼接渐变光效——看似精细,实则增加体积、难调试、移动端缩放易错位。
更稳妥的做法是纯 CSS 圆形 + 径向渐变 + 多层伪元素模拟光晕,所有样式可内联或单文件维护。
立即学习“前端免费学习笔记(深入)”;
- 主太阳用
border-radius: 50%的div,背景用radial-gradient(circle at 30% 30%, #fff, #ffeb3b) - 外层光晕用
::after伪元素,box-shadow: 0 0 60px 20px rgba(255, 235, 59, 0.4),并随动画同步缩放 - 禁用
background-attachment: fixed,否则滚动时太阳会“粘”在视口不动,违背“升起”语义 - 若需响应式,用
vmin单位控制大小(如width: 8vmin),而非固定像素
解决 Safari 和旧版 Chrome 中 transform 动画闪烁或跳帧
部分 WebKit 内核浏览器对 transform + opacity 同时动画时,若未触发 GPU 加速,会出现首帧闪烁或中间帧丢失。
- 强制开启硬件加速:给太阳元素加
transform: translateZ(0)或will-change: transform, opacity - 避免在动画中修改
width/height,改用scale();避免同时 animatingleft和transform - Safari 15.4+ 对
cubic-bezier()支持有 bug,若使用非标准贝塞尔值,降级为ease-out更稳 - 测试时务必在真机 Safari 上验证,模拟器可能掩盖渲染问题
让太阳“升起”真正绑定页面滚动而非自动播放
自动播放动画容易干扰用户阅读,且不符合“日出”需触发条件的直觉。更实用的是监听滚动,当某区域进入视口时启动动画。
- 用
IntersectionObserver监听太阳容器是否进入视口,触发element.classList.add('sun-rise') - CSS 中定义
.sun-rise { animation: sunRise 10s forwards; },避免重复触发用once: true - 若需“回到原点重播”,不要用
animation-play-state切换,而是移除 class 后重加,或用animation: none重置 - 慎用
position: fixed,否则滚动时太阳会悬浮不动——它该是页面内容的一部分,不是 UI 浮层
forwards 必须写在 animation 声明里,否则太阳会瞬间“掉回”起点;还有 transform-origin 默认是中心,如果加了 scale 却没设 transform-origin: center,缩放可能偏移。这些细节不报错,但效果完全不对。



















