云朵飘移背景特效(纯 CSS 云朵动画,昼夜模式可切换)

CSSJS 许可:自研原创

云朵飘移背景特效:CSS 云朵在天空缓缓横移,支持昼夜一键切换(星空闪烁/日月交替),飘移速度与云朵数量实时可调,纯 CSS+JS 零依赖复制即用。

效果演示(真实可交互)

一片渐变蓝的天空上,几朵白云从左侧缓缓飘向右方,每朵云的尺寸、高度、速度和入场时间都各不相同,错落有致。点「切换夜晚」按钮,天空会在 1.2 秒内过渡为深蓝夜色:太阳淡出、月亮亮起、星星开始闪烁,云朵也随之变为暗色剪影。拖动「飘移速度」可以让云朵加速或几乎静止,「云朵数量」控制同时飘移的云数(1-8 朵)。云的造型完全由 CSS 实现——一个圆角矩形主体加两个 ::before/::after 圆形凸起拼成,不依赖任何图片素材。

云朵飘移 · 昼夜可切换

完整代码

<div class="sky">
  <div class="stars"></div>
  <div class="sun"></div>
  <div class="moon"></div>
  <div class="clouds">
    <div class="cloud" style="--top:18%;--scale:1.1;--dur:32s;--delay:-8s"></div>
    <div class="cloud" style="--top:42%;--scale:.7;--dur:22s;--delay:-14s"></div>
    <div class="cloud" style="--top:62%;--scale:1.3;--dur:40s;--delay:-26s"></div>
  </div>
</div>
.sky {
  position: relative; width: 100%; height: 340px; overflow: hidden;
  background: linear-gradient(180deg, #7ec8f7, #cfe9fb 55%, #f5f9fd);
  transition: background 1.2s ease;
}
.sky.night { background: linear-gradient(180deg, #0b1030, #1a2350 55%, #2a3560); }

.stars { position: absolute; inset: 0; opacity: 0; transition: opacity 1.2s;
  background-image: radial-gradient(1.5px 1.5px at 12% 22%, #fff, transparent),
    radial-gradient(1.5px 1.5px at 45% 18%, #fff, transparent),
    radial-gradient(1.5px 1.5px at 76% 24%, #fff, transparent),
    radial-gradient(1.5px 1.5px at 55% 38%, #fff, transparent);
  animation: twinkle 3.2s ease-in-out infinite; }
.sky.night .stars { opacity: 1; }
@keyframes twinkle { 0%,100% { opacity: 0; } 50% { opacity: 1; } }

.sun { position: absolute; right: 12%; top: 14%; width: 52px; height: 52px; border-radius: 50%;
  background: radial-gradient(circle at 35% 35%, #fff3c4, #ffd76a 60%, #ffb84d);
  box-shadow: 0 0 40px 10px rgba(255,215,106,.45);
  transition: opacity 1.2s; }
.sky.night .sun { opacity: 0; }
.moon { position: absolute; right: 12%; top: 14%; width: 46px; height: 46px; border-radius: 50%;
  background: #e8ecf5; box-shadow: 0 0 30px 8px rgba(220,230,255,.35);
  opacity: 0; transition: opacity 1.2s; }
.sky.night .moon { opacity: 1; }

.cloud { position: absolute; left: -220px; top: var(--top, 20%);
  width: 120px; height: 34px; border-radius: 40px;
  background: rgba(255,255,255,.92); opacity: .92;
  transform: scale(var(--scale, 1));
  animation: cloudDrift var(--dur, 30s) linear infinite;
  animation-delay: var(--delay, 0s); }
.cloud::before, .cloud::after { content: ''; position: absolute; background: inherit; border-radius: 50%; }
.cloud::before { width: 44px; height: 44px; top: -22px; left: 18px; }
.cloud::after  { width: 30px; height: 30px; top: -14px; left: 56px; }
.sky.night .cloud { background: rgba(196, 208, 230, .5); }

@keyframes cloudDrift {
  from { transform: translateX(0) scale(var(--scale, 1)); }
  to   { transform: translateX(calc(100vw + 440px)) scale(var(--scale, 1)); }
}
// 动态生成云朵(演示面板逻辑):数量 + 速度
const layer = document.querySelector('.clouds');
const cfg = { speed: 8, count: 5 };
function makeCloud() {
  const el = document.createElement('div');
  el.className = 'cloud';
  el.style.setProperty('--top', `${5 + Math.random() * 60}%`);
  el.style.setProperty('--scale', (0.6 + Math.random() * 0.7).toFixed(2));
  const base = 14 + Math.random() * 22;      // 每朵基准时长
  el.dataset.base = base;
  el.style.setProperty('--dur', `${base / cfg.speed * 8}s`);
  el.style.setProperty('--delay', `${-(Math.random() * base / cfg.speed * 8)}s`);
  layer.appendChild(el);
}
function applyCount() {
  while (layer.children.length < cfg.count) makeCloud();
  while (layer.children.length > cfg.count) layer.lastChild.remove();
}
function applySpeed() {
  layer.querySelectorAll('.cloud').forEach(el =>
    el.style.setProperty('--dur', `${el.dataset.base / cfg.speed * 8}s`));
}
applyCount();

参数说明

参数位置说明
云朵数量cfg.count1-8 朵,演示面板实时增删
飘移速度cfg.speed1-20,基准时长 14-36s 按比例换算
云朵高度--top5%-65%,决定云在天空的位置
云朵大小--scale0.6-1.3,缩放整个云团
入场延迟--delay负值让云”已在路上”,画面更均匀
昼夜切换.sky.night控制天空/星星/日月/云色的过渡

兼容性与性能

常见问题

Q: 云朵飘出画面后去哪了? 动画 to 的位移量为 100vw + 440px,保证云完全移出可视区域;由于动画是无限循环且设置了负延迟,新的一朵会立即从左侧重新入场,视觉上连绵不断。

Q: 为什么我的云看起来是”方块”而不是圆滚滚的? 云由主体圆角矩形 + 两个圆形伪元素组成,三者背景同色(background: inherit)才拼得自然。若伪元素没生效,检查是否误删了 ::before/::after 的 content: ''。

Q: 想让云朵有层次感(近大远小)? 利用 --scale 即可:近处云 scale 大、--top 偏低且速度更快(base 更小),远处云反之,立刻产生纵深感。

Q: 昼夜切换时文字看不清? 把文字放在 .sky-tip 同级容器并跟随 .sky.night 切换颜色;深色文字在夜色下会看不清,建议像示例那样同时提供明暗两套配色。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布:2026-09-01 · 最近更新:2026-09-01
  • 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
  • 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理

常见问题

这个组件可以商用吗?

可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。

浏览器兼容性如何?

支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。

怎么修改动画参数?

直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核