Toolypet
Back to Blog
CSS

움직이는 CSS Gradient 애니메이션 만들기

CSS 그라데이션에 애니메이션을 적용하여 동적인 배경 효과를 만드는 방법을 배웁니다.

Toolypet Team4 min read
움직이는 CSS Gradient 애니메이션 만들기

정적인 그라데이션에 생명을 불어넣다

웹사이트를 방문했을 때 배경이 은은하게 흐르거나, 버튼 위에 마우스를 올렸을 때 빛이 번지는 효과를 본 적이 있으신가요? 이런 효과들은 대부분 CSS 그라데이션 애니메이션으로 만들어집니다. 문제는 CSS 그라데이션 자체가 애니메이션을 직접 지원하지 않는다는 점입니다. 하지만 창의적인 웹 개발자들은 언제나 그렇듯 우회 방법을 찾아냈고, 오늘 그 비밀을 함께 파헤쳐보겠습니다.

그라데이션 애니메이션의 핵심 원리는 의외로 단순합니다. 그라데이션 자체를 움직이는 것이 아니라, 그라데이션이 적용된 배경의 위치나 크기를 움직이는 것입니다. 마치 긴 그림 두루마리를 창문 뒤에서 천천히 이동시키면 창문을 통해 보이는 장면이 바뀌는 것과 같은 원리죠.

Background Position 애니메이션: 가장 실용적인 접근법

가장 널리 사용되고 성능도 우수한 방법은 배경 위치를 애니메이션하는 것입니다. 먼저 그라데이션의 크기를 실제 요소보다 크게 설정한 다음, 배경 위치를 이동시켜 마치 그라데이션이 흐르는 것처럼 보이게 합니다.

.animated-gradient {
  background: linear-gradient(
    -45deg,
    #ee7752,
    #e73c7e,
    #23a6d5,
    #23d5ab
  );
  background-size: 400% 400%;
  animation: gradient-shift 15s ease infinite;
}

@keyframes gradient-shift {
  0% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}

이 코드에서 background-size: 400% 400%가 마법의 열쇠입니다. 배경을 원래 크기의 4배로 만들어 놓으면, 배경 위치를 0%에서 100%로 이동할 때 실제로는 그라데이션의 작은 부분만 보이게 됩니다. 15초에 걸쳐 천천히 위치가 변하면서 색상이 부드럽게 전환되는 효과가 나타납니다. 이 기법은 특히 랜딩 페이지의 히어로 섹션이나 로그인 화면 배경에 적용하면 사이트에 고급스러운 느낌을 더할 수 있습니다.

회전하는 Conic Gradient로 로딩 인디케이터 만들기

원뿔형 그라데이션(Conic Gradient)은 회전 애니메이션과 찰떡궁합입니다. 중심점을 기준으로 색상이 회전하며 펼쳐지기 때문에, 전체 요소를 회전시키면 자연스러운 애니메이션이 됩니다. 이 기법은 로딩 스피너나 진행률 표시기를 만들 때 특히 유용합니다.

.rotating-gradient {
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background: conic-gradient(
    from 0deg,
    #667eea,
    #764ba2,
    #f97316,
    #667eea
  );
  animation: rotate 3s linear infinite;
}

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

시작 색상과 끝 색상을 동일하게 설정하면 회전할 때 색상이 끊김 없이 연결되어 매끄러운 루프가 만들어집니다. linear 타이밍 함수를 사용한 것도 중요한데, 일정한 속도로 회전해야 자연스러워 보이기 때문입니다.

CSS Houdini: 미래의 그라데이션 애니메이션

CSS Properties API(일명 CSS Houdini)를 사용하면 진정한 의미의 그라데이션 애니메이션이 가능해집니다. 커스텀 CSS 속성을 정의하고 그 속성에 애니메이션을 적용할 수 있기 때문입니다. 아직 모든 브라우저에서 지원되지는 않지만, 점점 더 많은 브라우저가 지원하고 있어 가까운 미래에 표준이 될 기술입니다.

@property --gradient-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

.houdini-gradient {
  background: linear-gradient(
    var(--gradient-angle),
    #667eea,
    #764ba2
  );
  animation: angle-rotate 3s linear infinite;
}

@keyframes angle-rotate {
  to {
    --gradient-angle: 360deg;
  }
}

@property 규칙으로 --gradient-angle이라는 사용자 정의 속성을 선언하고, 이 속성이 각도 값을 담는다고 브라우저에게 알려줍니다. 이렇게 하면 브라우저가 이 값을 보간할 수 있게 되어 부드러운 애니메이션이 가능해집니다. 마치 그라데이션의 방향이 실시간으로 회전하는 것처럼 보이죠.

실전 프로젝트: 네온 글로우 버튼

지금까지 배운 기법들을 종합해서 실제로 사용할 수 있는 인터랙티브 버튼을 만들어봅시다. 버튼 주위로 네온 불빛이 흐르는 효과입니다. 이런 버튼은 게임 사이트나 테크 스타트업 랜딩 페이지에서 자주 볼 수 있습니다.

.neon-button {
  position: relative;
  padding: 15px 30px;
  color: white;
  background: #1a1a2e;
  border: none;
  border-radius: 10px;
  font-weight: bold;
  cursor: pointer;
  overflow: hidden;
  z-index: 1;
}

.neon-button::before {
  content: '';
  position: absolute;
  inset: -3px;
  background: linear-gradient(
    45deg,
    #ff0080,
    #7928ca,
    #ff0080
  );
  background-size: 200% 200%;
  animation: glow 2s linear infinite;
  border-radius: 12px;
  z-index: -1;
}

@keyframes glow {
  0%, 100% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
}

핵심은 ::before 가상 요소를 사용해 버튼보다 약간 큰 그라데이션 레이어를 만드는 것입니다. inset: -3px로 버튼보다 3픽셀씩 크게 만들고, z-index: -1로 버튼 뒤에 배치합니다. 그러면 버튼 가장자리로 그라데이션이 살짝 보이면서 글로우 효과가 만들어집니다.

성능과 접근성을 고려한 최적화

애니메이션은 시각적으로 매력적이지만, 모든 사용자에게 좋은 경험이 되는 것은 아닙니다. 일부 사용자는 움직이는 요소에 민감하게 반응하며, 저사양 기기에서는 과도한 애니메이션이 성능 저하를 일으킬 수 있습니다.

성능 측면에서는 transformopacity 속성이 GPU 가속을 받아 가장 효율적입니다. background-position 애니메이션도 대부분의 상황에서 잘 동작하지만, will-change: background-position을 추가하면 브라우저가 미리 최적화를 준비할 수 있습니다.

접근성을 위해서는 prefers-reduced-motion 미디어 쿼리를 반드시 고려해야 합니다. 사용자가 시스템 설정에서 모션 감소를 선택한 경우, 애니메이션을 비활성화하는 것이 좋습니다.

@media (prefers-reduced-motion: reduce) {
  .animated-gradient,
  .rotating-gradient,
  .neon-button::before {
    animation: none;
  }
}

이렇게 하면 모션에 민감한 사용자도 불편함 없이 웹사이트를 이용할 수 있으면서, 그렇지 않은 사용자에게는 풍부한 시각적 경험을 제공할 수 있습니다.

마무리하며

CSS 그라데이션 애니메이션은 비교적 간단한 코드로 웹사이트에 역동적인 생명력을 불어넣을 수 있는 강력한 기법입니다. Toolypet의 Gradient Generator에서 마음에 드는 색상 조합을 만든 후, 오늘 배운 애니메이션 기법을 적용해보세요. 정적이었던 그라데이션이 살아 움직이는 순간, 여러분의 웹사이트도 한층 더 특별해질 것입니다.

CSSGradientAnimationKeyframes