GODRICH
#css애니메이션#버튼#로딩#전환효과#스크롤#대시보드#실전ui#디자인트렌드

CSS 글자 그라데이션 반짝이는 텍스트 9종 — 한 줄 복붙으로

css 글자 그라데이션은 글씨 위에 여러 색을 흘려 넣어 단색 글자보다 시선을 오래 붙잡는 효과입니다. 아홉 개 중 하나(03)는 같은 글자를 뒤에 한 겹 더 깔아 후광만 blur 로 만드는데, 부모에 isolation: isolate 를 빼먹으면 그 후광이 무대 배경 뒤로 완전히

아래 격자에서 아홉 개가 자동으로 도는 모습을 먼저 보고, 화면에 맞는 걸 찾으십시오.

자동 재생 · 눌러서 해당 항목으로 · 전부 한 zip

아홉 개는 화려한 순서가 아니라 그러데이션이 글자 위에서 하는 일의 순서로 놓았습니다. 색이 흘러가는 것(01~02), 빛으로 강조하는 것(03~04), 화면이 어긋나거나 css 텍스트 반짝임이 표면에 도는 것(05~06), 글자 하나하나가 깜빡이거나 비워지는 것(07~08), 마지막으로 색상환 전체가 도는 것(09)입니다. 데모 글자는 예시 문구일 뿐이니, 실서비스에 쓸 때는 <h1> 안의 텍스트만 바꾸면 코드는 그대로 동작합니다. 이 글자를 얹을 바탕이 카드라면 CSS 카드 애니메이션 호버 효과를 먼저 고르고, 같은 그러데이션을 켜고 끄는 작은 컨트롤에 옮기고 싶다면 CSS 토글 스위치 쪽을 보십시오.

01흐르는 그라디언트 텍스트

css 글자 그라데이션 애니메이션이 어떻게 흐르나

파랑·크림 그러데이션을 background-clip: text로 글자에 채우고 background-size: 300% 100% 위에서 background-position을 0%에서 100%로 반복 이동시켜 색이 계속 흘러가는 것처럼 보이게 합니다.

흐르는 그라디언트 텍스트
새 창에서 열기

01 · 흐르는 그라디언트 텍스트 — 측정 누적면적 3.461% · 움직인 프레임 23/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

background-clip:textbackground-position2s
.flow {
  background: linear-gradient(90deg, $color, $subject-cream, $color, $subject-cream, $color);
  background-size: 300% 100%;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  -webkit-text-fill-color: transparent;
  animation: flow $duration $easing infinite;
}
@keyframes flow {
  0%   { background-position: 0% 50%; }
  100% { background-position: 100% 50%; }
}

02그라디언트 각도 이동

어떻게 움직이나

@property로 <angle> 타입 커스텀 프로퍼티를 등록해 linear-gradient()의 각도 자리에 넣고, 그 값만 0deg에서 360deg로 keyframes 로 돌려 그러데이션 자체가 글자 안에서 회전합니다.

그라디언트 각도 이동
새 창에서 열기

02 · 그라디언트 각도 이동 — 측정 누적면적 3.865% · 움직인 프레임 23/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

@property<angle>linear-gradient
@property --angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}
.spin {
  --angle: 0deg;
  background: linear-gradient(var(--angle), $color, $stage-orange, $color);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  animation: rotate-angle $duration $easing infinite;
}
@keyframes rotate-angle { from { --angle: 0deg; } to { --angle: 360deg; } }

03네온 글로우 텍스트

어떻게 움직이나

같은 글자를 ::before로 한 겹 더 두고 background: inherit로 같은 그러데이션을 물려받게 한 뒤 filter: blur()만 걸어 후광을 만듭니다.

어디에 쓰나

반경과 투명도를 몇 차례 짧게 오가게 해 통째로 꺼졌다 켜지지 않고 숨 쉬듯 빛나게 했습니다.

네온 글로우 텍스트
새 창에서 열기

03 · 네온 글로우 텍스트 — 측정 누적면적 10.16% · 움직인 프레임 12/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

filter:blur다색 그러데이션숨쉬는 글로우
.neon { position: relative; isolation: isolate; }
.neon::before {
  content: attr(data-text);
  position: absolute; inset: 0; z-index: -1;
  background: inherit;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  filter: blur(4px);
  animation: breathe $duration $easing infinite;
}
@keyframes breathe {
  0%, 10%  { filter: blur(4px); opacity: .28; }
  15%, 25% { filter: blur(20px); opacity: 1; }
}

04광택 스윕 텍스트

어떻게 움직이나

같은 문구를 두 겹 겹쳐 아래 겹은 단색으로, 위 겹만 좁고 밝은 대각선 띠를 background-clip: text로 채워 background-position으로 한 방향으로 한 번 훑고 지나가게 합니다.

광택 스윕 텍스트
새 창에서 열기

04 · 광택 스윕 텍스트 — 측정 누적면적 2.915% · 움직인 프레임 6/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

background-position 스윕대각선 하이라이트2s
.light {
  background: linear-gradient(100deg, transparent 42%, rgba($stage-paper, .95) 50%, transparent 58%);
  background-size: 260% 100%;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  animation: sweep $duration $easing infinite;
}
@keyframes sweep {
  0%  { background-position: 140% 50%; }
  60% { background-position: -40% 50%; }
}

05글리치 텍스트

어떻게 움직이나

색이 다른 두 겹을 포개고 가로줄 mask-image의 위치를 steps() 타이밍으로 뚝뚝 끊어 옮겨 스캔라인이 깨지는 느낌을 만듭니다.

어디에 쓰나

clip-path로 조각을 썰어 미는 방식은 쓰지 않고, 마스크와 filter: hue-rotate 의 순간적인 튐만으로 어긋남을 표현했습니다.

글리치 텍스트
새 창에서 열기

05 · 글리치 텍스트 — 측정 누적면적 2.345% · 움직인 프레임 6/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

mask-image steps()hue-rotate스캔라인
.r, .b {
  position: absolute; inset: 0;
  mix-blend-mode: screen;
  -webkit-mask-image: repeating-linear-gradient(to bottom, #000 0 3px, transparent 3px 7px);
  mask-image: repeating-linear-gradient(to bottom, #000 0 3px, transparent 3px 7px);
  animation: mask-jump-r $duration $easing infinite;
}
@keyframes mask-jump-r {
  0%, 40%, 100% { -webkit-mask-position: 0 0; mask-position: 0 0; opacity: 0; }
  45%, 55%      { -webkit-mask-position: 0 3px; mask-position: 0 3px; opacity: .9; }
}

06크롬 메탈 텍스트

어떻게 움직이나

어두운 색과 흰색·크림색을 촘촘한 스톱으로 번갈아 넣은 그러데이션을 background-clip: text로 채우고 background-position을 느긋하게 이동시켜, 크롬 표면에 반사광이 지나가는 질감을 만듭니다.

크롬 메탈 텍스트
새 창에서 열기

06 · 크롬 메탈 텍스트 — 측정 누적면적 3.683% · 움직인 프레임 23/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

다중 스톱 그러데이션background-position2s · ease-out
.chrome {
  background: linear-gradient(
    100deg,
    $color 0%, $stage-paper 12%, $color 24%,
    $subject-cream 40%, $stage-paper 52%, $color 64%,
    $stage-paper 80%, $color 100%
  );
  background-size: 220% 100%;
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  animation: reflect $duration $easing infinite;
}

07깜빡임 텍스트

어떻게 움직이나

글자를 span으로 하나씩 나눠 --i 변수로 글자마다 다른 지연을 주고 opacity를 짧게 왕복시킵니다.

어디에 쓰나

네온 하나가 통째로 꺼졌다 켜지는 게 아니라, 낡은 전구 마퀴 간판처럼 글자마다 따로 깜빡입니다.

깜빡임 텍스트
새 창에서 열기

07 · 깜빡임 텍스트 — 측정 누적면적 2.881% · 움직인 프레임 10/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

--i 지연opacity 왕복글자별 독립
.marquee span {
  display: inline-block;
  color: $color;
  animation: bulb $duration $easing infinite;
  animation-delay: calc(var(--i, 0) * 120ms);
}
@keyframes bulb {
  0%, 40%, 100% { opacity: 1; }
  47%           { opacity: .22; }
  54%           { opacity: 1; }
}

08아웃라인 글로우

어떻게 움직이나

글자 속을 color: transparent로 비우고 -webkit-text-stroke로 윤곽선만 남긴 뒤, filter: drop-shadow()의 반경을 키웠다 줄였다 반복해 윤곽선 둘레에 빛이 번지게 합니다.

아웃라인 글로우
새 창에서 열기

08 · 아웃라인 글로우 — 측정 누적면적 15.976% · 움직인 프레임 7/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

-webkit-text-strokedrop-shadow빈 윤곽선
.outline {
  color: transparent;
  -webkit-text-stroke: 2px $color;
  animation: glow $duration $easing infinite;
}
@keyframes glow {
  0%, 100% { filter: drop-shadow(0 0 3px rgba($color, .5)); }
  50% {
    filter: drop-shadow(0 0 14px rgba($color, .9))
            drop-shadow(0 0 26px rgba($color, .5));
  }
}

09무지개 텍스트

어떻게 움직이나

고정된 무지개 다색 그러데이션을 background-clip: text로 채운 뒤, 위치나 각도가 아니라 filter: hue-rotate를 0deg에서 360deg로 계속 돌려 색상환 전체가 순환하게 합니다.

무지개 텍스트
새 창에서 열기

09 · 무지개 텍스트 — 측정 누적면적 4.147% · 움직인 프레임 23/23GODRICH 원작 · zip 에 SCSS·React 포함 · 비밀번호 보기

filter:hue-rotate고정 그러데이션360° 순환
.rainbow {
  background: linear-gradient(90deg, $color, $stage-yellow, $stage-orange, $error, $subject-cream, $color);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  animation: hue-cycle $duration $easing infinite;
}
@keyframes hue-cycle {
  from { filter: hue-rotate(0deg); }
  to   { filter: hue-rotate(360deg); }
}

어디서 깨지는가 — 접두사와 @property 지원

접두사가 필요한 이유

01·02·03·04·05·06·09 일곱 개가 쓰는 background-clip: text는 오래도록 접두사가 필요했던 속성입니다. caniuse 의 background-clip-text 지원표를 확인해 보니 Chrome·Edge 는 120부터, Safari 는 15.5부터 접두사 없이 동작하고 그 이전 버전은 -webkit-background-clip: text 가 있어야 글자가 그러데이션으로 채워집니다. 그래서 이 일곱 개 코드 전부 -webkit-background-clip: text 와 -webkit-text-fill-color: transparent 를 접두사 없는 선언과 나란히 넣어 뒀습니다. 05 가 쓰는 mask-image 도 사정이 비슷해서, caniuse 의 CSS Masks 지원표를 보면 Chrome·Edge 는 120부터, Safari 는 15.4부터, Firefox 는 53부터 접두사 없이 동작하고 그 전 버전은 -webkit-mask-image 가 있어야 스캔라인이 보입니다.

후광이 사라지는 이유

03 의 isolation: isolate 는 접두사와는 다른 종류의 함정인데, 후광을 만드는 ::before(z-index: -1)가 부모의 쌓임 맥락 밖으로 빠지면 무대 배경 뒤에 완전히 가려집니다.

@property 가 없으면

02 의 @property는 지원 폭이 더 좁습니다. MDN 의 @property 문서가 정리한 대로 Chrome·Edge 는 85 부터, Safari 는 16.4 부터 지원하지만 Firefox 는 128 이후에야 정식으로 들어왔습니다. @property 가 없는 낡은 브라우저에서는 각도 값이 보간되지 않아 그러데이션이 회전 없이 정지된 채로 보이는데, 레이아웃이 깨지는 건 아니라서 실서비스에 쓸 때는 정지 상태를 기본값으로 여기고 회전은 덤으로 취급하는 편이 안전합니다. 06 크롬 메탈 텍스트를 화면 전체로 키운 Y2K 크롬·홀로그램 부품에서도 같은 이유로 회전 각도는 덤, 정지된 금속 질감이 기본값입니다.

압축 파일 열기

아홉 개 코드 전부를 담아 렌더 측정까지 마친 압축 파일을 열려면 비밀번호 5hzhmkcb 를 입력하십시오. 파일은 바로 아래 카드에서 받아 가시면 됩니다.

접근성

동작 줄이기에서

아홉 개 전부 prefers-reduced-motion: reduce를 처리해서, 운영체제에서 "동작 줄이기"를 켠 사람에게는 애니메이션이 꺼지고 그 순간의 색·투명도만 고정된 채 남습니다. 01·02·04·06처럼 위치나 각도가 움직이는 그러데이션은 중간 지점에서 멈추고, 09 는 색상환 회전만 꺼져 원래의 고정 무지개색 그대로 남습니다. 03·08처럼 빛이 숨 쉬는 효과는 은은한 밝기 하나로 고정되며, 05 의 어긋난 두 겹은 사라져 아래에 깔린 그러데이션 글자만 남고, 07 의 깜빡임은 아예 멈춰 모든 글자가 같은 밝기로 보입니다.

대비가 약해질 때

background-clip: text로 글자 속을 비운 효과들은 색약이나 저채도 모니터에서 대비가 약해질 수 있어, 실제 서비스 헤드라인에는 이 효과 하나만으로 정보를 전달하지 말고 옆에 일반 텍스트나 아이콘을 같이 두는 걸 권합니다. prefers-reduced-motion 자체는 MDN 문서에 정리돼 있습니다.

글자 말고 배경·이미지·버튼에 거는 CSS 효과까지 둘러보고 싶다면 CSS 카테고리 페이지에 더 많은 모음이 있습니다. 이 사이트가 어떤 기준으로 데모를 골라 올리는지는 소개 페이지에 적어 뒀습니다.

FAQ

css 텍스트 그라데이션에 -webkit- 접두사가 아직도 필요합니까?

방문자 대부분은 이미 Chrome 120·Safari 15.5 이후를 쓰고 있어 접두사 없는 background-clip: text 만으로도 충분합니다. 다만 접두사를 같이 넣는 비용이 거의 없고, 오래된 브라우저에서는 접두사가 없으면 그러데이션 대신 아무 글자도 안 보이는 것보다 나으니 background-clip: text를 쓰는 일곱 개 코드 모두 접두사를 남겨 뒀습니다.

09 번 무지개 텍스트는 색맹 사용자에게 이상하게 보이지 않습니까?

색상환을 도는 효과라 특정 두 색만 구별이 어려운 사람에게도 "색이 계속 바뀐다"는 사실 자체는 전달됩니다. 다만 색 차이로 의미(성공·실패 등)를 구분하는 용도로는 쓰지 말고, 장식적인 타이틀에만 쓰는 걸 권합니다.

아홉 개를 실제 헤드라인 하나에 겹쳐 써도 됩니까?

기술적으로는 가능하지만 권하지 않습니다. background-clip: text와 filter: blur()·mask-image를 동시에 여러 겹 겹치면 브라우저가 매 프레임 다시 그려야 할 레이어가 늘어나, 저사양 모바일에서 버벅임이 먼저 눈에 띕니다. 헤드라인 하나엔 아홉 개 중 하나만 고르는 걸 권합니다. 같은 색을 글자 대신 상자 둘레에 돌리고 싶으면 CSS 테두리 애니메이션으로 옮기는 편이 레이어가 덜 겹칩니다.

압축 비밀번호를 입력하세요

비밀번호는 이 글 본문 안에 있습니다. 읽다 보면 나옵니다.