유성

Meteors

대각선으로 빠르게 지나가는 꼬리 달린 빛줄기 여러 개가 무작위 위치·간격으로 반복해서 떨어지는 배경 효과.

다른 이름: Shooting starsMeteor shower background
···
html
<div class="sky" id="sky"></div>
css
.sky{position:absolute;inset:0;overflow:hidden;
  background:radial-gradient(120% 100% at 50% 0%,#141428,#07070d 70%)}
.m{position:absolute;width:2px;height:2px;border-radius:50%;background:#fff;
  box-shadow:0 0 0 1px rgba(255,255,255,.1);transform:rotate(35deg)}
.m::before{content:"";position:absolute;top:1px;right:1px;width:70px;height:1px;
  background:linear-gradient(90deg,#fff,transparent);transform-origin:right center}
js
const sky = document.getElementById('sky');
const N = 8;
const meteors = [];
for (let i = 0; i < N; i++) {
  const el = document.createElement('div');
  el.className = 'm';
  sky.appendChild(el);
  meteors.push(el);
}
function launch(el) {
  const startX = Math.random() * 120 - 10;
  const dur = 1.6 + Math.random() * 1.6;
  const delay = Math.random() * 3.5;
  el.style.left = startX + '%';
  el.style.top = '-5%';
  el.style.opacity = '0';
  el.animate(
    [
      { transform: 'rotate(35deg) translate(0,0)', opacity: 0, offset: 0 },
      { opacity: 1, offset: 0.06 },
      { transform: 'rotate(35deg) translate(220px,300px)', opacity: 0, offset: 1 },
    ],
    { duration: dur * 1000, delay: delay * 1000, iterations: 1 },
  ).onfinish = () => launch(el);
}
meteors.forEach((el, i) => setTimeout(() => launch(el), i * 220));

점 하나에 linear-gradient로 꼬리를 붙이고 45도 정도 기울인 뒤, 화면 위쪽 바깥에서 아래쪽 바깥까지 이동시키면 유성 한 줄기가 됩니다. 진짜처럼 보이려면 여러 개를 동시에 쓰되 시작 위치·지연 시간·속도를 각각 무작위로 줘야 합니다 — 전부 같은 타이밍이면 기계적인 패턴이 바로 눈에 띕니다.

DOM에 계속 새 요소를 追加하면 누적되어 느려지므로, 정해진 개수(예: 8개)의 요소를 재사용합니다. 각 유성이 화면을 벗어나면 JS로 새 시작 위치와 지연을 다시 뽑아 애니메이션을 재시작합니다.

sparkles가 제자리에서 반짝이는 작은 점이라면, 유성은 궤적을 그리며 이동한다는 점이 다릅니다. 함께 쓰면 밤하늘 같은 배경을 만들 수 있습니다.

언제 쓰나

히어로 배경, 404 페이지, 다크 테마 랜딩의 장식 요소로 씁니다. 너무 자주 지나가면 산만하니 화면당 동시에 보이는 유성은 2~3개로 제한하세요.