CSS 그림자(box-shadow) 생성기

box-shadow·text-shadow를 슬라이더로 조절하고 여러 겹을 쌓아 CSS를 만듭니다. 머티리얼 elevation·네온 프리셋 포함.

미리보기
그림자 레이어 (아래로 갈수록 뒤에 그려집니다)
선택 그림자 값 순서 삭제
선택한 레이어 편집
프리셋

그림자는 배경색에 따라 완전히 다르게 보입니다. 위 배경색을 실제 사용할 색과 맞춰 두고 조절하세요. 흰 배경에서는 투명도 8~15%의 옅은 검정이, 어두운 배경에서는 더 진한 값이 자연스럽습니다.

CSS 그림자(box-shadow) 생성기란?

box-shadow는 요소에 그림자를 넣어 화면에 깊이를 만드는 CSS 속성입니다. x·y 위치, 흐림(blur), 번짐(spread), 색상과 투명도까지 값이 다섯 개나 되고 숫자만 봐서는 결과를 짐작하기 어려워 매번 새로고침을 반복하게 됩니다. 이 도구는 슬라이더를 움직이는 즉시 미리보기 카드에 반영되고, 완성된 CSS를 그대로 복사할 수 있습니다. 무엇보다 실제 디자인에서 좋아 보이는 그림자는 한 겹이 아니라 여러 겹을 겹친 것인데, 여기서는 그림자 레이어를 원하는 만큼 추가·복제·삭제하며 쌓을 수 있습니다. 같은 화면에서 text-shadow 모드로 전환해 글자 그림자와 네온 효과도 만들 수 있습니다.

사용 방법

  1. 위쪽에서 box-shadow(요소 그림자) 또는 text-shadow(글자 그림자) 모드를 고릅니다.
  2. 레이어 표에서 편집할 그림자를 선택한 뒤 x·y·흐림·번짐·색상·투명도 슬라이더를 조절합니다.
  3. "레이어 추가"나 "복제"로 그림자를 여러 겹 쌓으면 훨씬 자연스러운 깊이가 나옵니다.
  4. 미리보기 배경색을 실제 사용할 배경과 맞춰 확인한 뒤, 아래 CSS 코드를 복사합니다.

CSS 그림자(box-shadow) 생성기 사용 가이드

실제 작업에서 이 도구를 어떻게 쓰는지, 무엇을 조심해야 하는지 정리했습니다.

한 겹짜리 그림자가 가짜처럼 보이는 이유

실제 세계에서 물체 하나에는 그림자가 한 종류만 생기지 않습니다. 물체와 바닥이 닿는 부분에는 진하고 좁은 그림자가, 멀어질수록 옅고 넓게 퍼진 그림자가 동시에 생깁니다. 광원이 점이 아니라 면적을 갖기 때문입니다.

box-shadow를 한 줄만 쓰면 이 중 하나만 표현됩니다. 그래서 blur를 아무리 조절해도 어딘가 도장 찍은 것처럼 보입니다. 해법은 성격이 다른 그림자를 여러 겹 쌓는 것입니다.

역할값의 특징
1겹 (가장 가까움)요소가 바닥에 닿아 있다는 느낌y 작게(1~2px), blur 작게, 투명도 5~8%
2겹 (중간)실제 깊이감y 중간(4~8px), blur 중간, 투명도 8~10%
3겹 (가장 멂)공간에 떠 있는 분위기y 크게(12~24px), blur 크게, spread 음수, 투명도 10~14%
"겹겹이 소프트" 프리셋이 정확히 이 구성입니다. 눌러 본 뒤 레이어를 하나씩 지워 보면 각 겹이 무슨 일을 하는지 바로 보입니다. 머티리얼 디자인의 elevation 프리셋도 모두 3겹으로 이뤄져 있습니다.

투명도는 생각보다 훨씬 낮아야 합니다

초보자가 만든 그림자가 어색한 가장 흔한 이유는 진하기입니다. 검정 30~50%를 주면 그림자가 아니라 검은 얼룩이 됩니다. 흰 배경에서 자연스러운 그림자는 대개 검정 8~15% 수준입니다. 이 도구의 기본값이 12%인 것도 그 때문입니다.

또 하나. 그림자 색을 순수한 검정(#000000)으로 두면 회색빛이 돌아 화면이 탁해집니다. 배경색 계열의 어두운 색(예: 남색빛 #0f172a)을 쓰면 훨씬 세련돼 보입니다. UI 디자인 시스템들이 그림자에 순수 검정을 잘 안 쓰는 이유입니다.

  • 카드 그림자 — 투명도 8~14%, blur 크게, spread는 0 또는 음수.
  • spread를 음수로 주면 그림자가 요소보다 작아져 아래로만 살짝 깔립니다. 훨씬 고급스럽습니다.
  • y는 항상 양수로. 빛은 위에서 옵니다. y가 음수인 그림자는 뭔가 잘못된 느낌을 줍니다.
  • x는 0이 기본입니다. 좌우로 밀린 그림자는 옆에서 조명을 비춘 특수한 경우에만 씁니다.
미리보기 배경색을 실제 쓸 배경과 반드시 맞추세요. 같은 그림자가 흰 배경(#ffffff)과 연회색 배경(#f8fafc)에서 전혀 다르게 보입니다. 흰 배경에서 맞춘 값을 회색 배경 위에 올리면 그림자가 거의 사라져 보입니다.

다크 모드에서 그림자가 사라지는 문제

검은 배경 위의 검은 그림자는 보이지 않습니다. 당연한 얘기지만, 라이트 모드에서 공들여 만든 그림자를 그대로 다크 모드에 넘기면 카드가 배경에 붙어 버려 깊이가 완전히 사라집니다. 투명도를 40%까지 올려도 별 소용이 없습니다 — 검정 위의 더 진한 검정은 그냥 검정입니다.

다크 모드에서는 그림자로 깊이를 표현하는 방식 자체를 바꿔야 합니다. 실제 다크 UI들이 쓰는 방법은 세 가지입니다.

  • 표면을 밝게 — 떠 있는 요소일수록 배경보다 밝게 만듭니다. 머티리얼 다크 테마의 공식 방식입니다. 그림자 대신 밝기로 높이를 표현합니다.
  • 테두리 링 — "테두리 링" 프리셋처럼 spread만 1~2px 주고 x·y·blur를 0으로 두면 얇은 윤곽선이 생겨 경계가 살아납니다. 밝은 색을 낮은 투명도로 쓰세요.
  • 위쪽 하이라이트 — inset으로 위쪽에 밝은 선을 넣으면 빛을 받는 모서리처럼 보입니다.
css
/* 라이트 — 그림자로 깊이 */
.card {
  background: #fff;
  box-shadow: 0 1px 2px rgba(15,23,42,.06),
              0 4px 8px -2px rgba(15,23,42,.08),
              0 12px 24px -6px rgba(15,23,42,.10);
}

/* 다크 — 밝기 + 얇은 링으로 깊이 */
@media (prefers-color-scheme: dark) {
  .card {
    background: #1e293b;              /* 배경(#0f172a)보다 밝게 */
    box-shadow: 0 0 0 1px rgba(255,255,255,.06),
                0 12px 24px -6px rgba(0,0,0,.5);
  }
}
미리보기 배경색을 어둡게 바꿔 두고 값을 만지면 다크 모드용 그림자를 바로 확인할 수 있습니다. 네온 프리셋도 어두운 배경에서만 제대로 보입니다.

성능 — 그림자는 공짜가 아닙니다

blur가 큰 box-shadow는 브라우저가 다시 그릴 때마다 계산해야 하는 비싼 효과입니다. 평소에는 티가 안 나지만 두 가지 상황에서 문제가 됩니다.

  • 목록에 그림자 카드가 수십 개 — 스크롤이 끊깁니다. 특히 저사양 기기에서 두드러집니다.
  • hover에서 box-shadow를 transition — 그림자 값이 바뀔 때마다 다시 계산됩니다. 아래처럼 미리 깔아 두고 투명도만 바꾸면 훨씬 부드럽습니다.
css
/* 느림 — 매 프레임 그림자 재계산 */
.card { transition: box-shadow .2s; }
.card:hover { box-shadow: 0 20px 40px -12px rgba(30,41,59,.22); }

/* 빠름 — 그림자를 미리 깔고 투명도만 바꾼다 */
.card { position: relative; }
.card::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  box-shadow: 0 20px 40px -12px rgba(30,41,59,.22);
  opacity: 0; transition: opacity .2s;
  pointer-events: none;
}
.card:hover::after { opacity: 1; }
레이어를 8겹까지 쌓을 수 있지만, 실무에서 3겹을 넘길 일은 거의 없습니다. 네온이나 글자 외곽선처럼 특수 효과가 아니라면 3겹이면 충분하고, 그 이상은 성능만 깎아먹습니다.

text-shadow는 규칙이 다릅니다

모드를 text-shadow로 바꾸면 spread와 inset 조절칸이 사라집니다. text-shadow에는 그 두 값이 아예 없기 때문입니다. 값은 x, y, blur, 색 네 개뿐입니다.

글자 그림자에서 가장 실용적인 쓰임은 멋 내기가 아니라 사진 위 글자 가독성입니다. 사진 위 흰 글자에 검정 그림자를 아주 옅게(투명도 30~40%, blur 4px 정도) 깔면 배경이 밝든 어둡든 글자가 읽힙니다.

  • "글자 외곽선" 프리셋은 사방 네 방향에 blur 0짜리 그림자를 두는 방식입니다. 배경이 복잡할 때 확실하지만 글자가 두꺼워 보입니다. 대안으로 -webkit-text-stroke 가 있습니다.
  • "글자 입체(3D)" 프리셋은 1px씩 밀린 그림자를 여러 겹 쌓아 두께를 만듭니다. 색을 점점 어둡게 두는 게 요령입니다.
  • 본문 텍스트에는 그림자를 쓰지 마세요. 작은 글자에 그림자를 넣으면 획이 뭉개져 오히려 읽기 어려워집니다. 큰 제목에만 쓰는 것이 원칙입니다.
그림자가 여러 겹이면 순서가 중요합니다. 레이어 표에서 위쪽에 있는 것이 화면 앞에 그려집니다. 순서 버튼(↑ ↓)으로 바꿔 가며 확인해 보세요. 입체 효과에서는 순서만 바꿔도 결과가 완전히 달라집니다.

자주 묻는 질문

흐림(blur)과 번짐(spread)은 어떻게 다른가요?

blur는 그림자 가장자리를 흐리게 퍼뜨리는 값이고, spread는 그림자 자체의 크기를 키우거나(양수) 줄이는(음수) 값입니다. 자연스러운 그림자는 보통 blur를 크게, spread는 0이나 약간의 음수로 두어 요소 바로 아래에 뭉치지 않게 만듭니다.

그림자를 여러 겹 쌓으면 뭐가 좋은가요?

실제 빛은 가까운 곳에 진하고 좁은 그림자, 먼 곳에 옅고 넓은 그림자를 동시에 만듭니다. 짧고 진한 그림자 한 겹 + 길고 옅은 그림자 한 겹을 겹치면 한 겹짜리보다 훨씬 사실적인 입체감이 납니다. 머티리얼 디자인의 elevation 프리셋도 세 겹으로 이뤄져 있습니다.

inset은 무엇인가요?

그림자를 요소 바깥이 아니라 안쪽에 그리는 옵션입니다. 눌린 버튼, 움푹 들어간 입력창, 카드 안쪽의 미묘한 테두리 효과를 만들 때 씁니다. text-shadow에는 inset이 없어 해당 모드에서는 비활성화됩니다.

네온 효과는 어떻게 만드나요?

네온 프리셋을 누르면 됩니다. 원리는 x·y를 0으로 두고 blur만 다르게 준 같은 색 그림자를 여러 겹 쌓는 것으로, 어두운 배경에서 특히 잘 보입니다. 미리보기 배경색을 어둡게 바꿔 확인하세요.