:doodle{ @grid: 8x8 / 100vw 100vh; /* 30×30 的网格 */ overflow: hidden; background: transparent; } @shape: bud 5; /* 每个格子先做成一个「气球」:椭圆 + 小尾巴 */ @place-cell: @r(0%,100%) @r(110%,130%); /* 初始位置:水平完全随机,垂直在视口下方 */ @size: @r(15px, 70px); /* 随机大小(宽、高) */ background: @p(#f44336, #e91e63, #9c27b0, #673ab7, #3f51b5, #60569e, #e6437d, #ebbf4d, #00bcd4, #03a9f4,#2196f3, #009688, #5ee463, #f8e645, #ffc107, #ff5722, #43f8bf); /* 随机挑颜色 */ filter: blur(@r(40px, 60px)); transform: rotate(@r(0, 360deg)); /* 随机动画:上升 + 左右摆动 */ animation: float @r(10s,15s) @r(-10s,0s) infinite cubic-bezier(.05,.68,.67,.45), sway @r(10s,15s) @r(-10s,0s) infinite ease-in-out, twinkle @r(2s,4s) @r(-4s,0s) infinite ease-in-out; /* 关键帧:垂直上升 */ @keyframes float{ 100%{ transform: translateY(-120vh); } /* 一直飘到屏幕外上方 */ } /* 关键帧:水平摆动 */ @keyframes sway{ 0%,100%{ transform: translateX(@r(-30px,30px)); } 50%{ transform: translateX(@r(-30px,30px)); } } @keyframes twinkle{ 0%, 100%{ opacity: .4; filter: blur(@r(40px, 60px)) brightness(.8); } 50%{ opacity: 1; filter: blur(0) brightness(1.4); } }

css-doodle 气球背景示例