CSS 박스 그림자 생성기
box-shadow 규칙을 한 번에 하나씩 만듭니다. 가로·세로 오프셋, 흐림, 확산, 색상, 선택적 inset을 설정한 뒤 결과를 복사하세요. 실제 그림자는 보통 두세 개 레이어가 필요하므로 각 레이어를 따로 생성한 다음 규칙을 쉼표로 이어 붙입니다.
박스 그림자를 디자인하는 방법
-
1
그림자 값 설정
수평 오프셋, 수직 오프셋, 흐림 반경, 확산, 그리고 불투명도가 적용된 색상을 지정합니다.
-
2
inset 전환
그림자를 inset으로 바꾸면 안쪽 그림자가 됩니다. 눌린 버튼이나 움푹한 효과를 만들 때 유용합니다.
-
3
색상 선택
불투명도가 낮은 검은색이 가장 무난한 선택입니다. 요소의 색조에 맞춘 조금 더 어두운 컬러 그림자가 한층 자연스러워 보입니다.
-
4
CSS 복사
단일 그림자 규칙을 복사해 스타일시트에 붙여 넣습니다. 레이어 그림자를 만들려면 각 레이어를 따로 생성하고 규칙을 쉼표로 결합하세요.
box-shadow 구문
box-shadow: <x-offset> <y-offset> <blur> <spread> <colour> [inset];
- x-offset: 양수는 오른쪽, 음수는 왼쪽을 의미합니다.
- y-offset: 양수는 아래쪽, 음수는 위쪽을 의미합니다.
- blur: 0이면 또렷한 가장자리, 값이 클수록 더 부드러워집니다. 눈에 보이는 크기는 요소 바깥쪽으로 흐림 값의 약 1.5배 정도까지 퍼집니다.
- spread: 요소를 넘어 추가로 확장되는 크기입니다. 양수는 그림자를 키우고, 음수는 줄입니다(은은한 후광을 만들 때 유용합니다).
- colour: 모든 CSS 색상을 지원합니다.
rgba(0, 0, 0, 0.15)가 가장 기본이 되는 값입니다. - inset: 요소 안쪽으로 그림자를 뒤집어 주는 키워드입니다.
여러 겹의 그림자는 사실적으로 보입니다
이 생성기는 한 번에 하나의 그림자 규칙만 출력합니다. 레이어 그림자를 만들려면 각 레이어를 따로 생성한 다음 규칙을 쉼표로 결합하세요.
0 0 40px 그림자 하나만 쓰면 흐릿해 보입니다. 두 개의 그림자, 즉 요소에 가까운 작고 또렷한 그림자와 더 멀리 떨어진 크고 부드러운 그림자를 겹치면 실제 빛이 산란하는 방식을 흉내 낼 수 있습니다.
box-shadow:
0 1px 2px rgba(0, 0, 0, 0.08),
0 4px 12px rgba(0, 0, 0, 0.08);
첫 번째 줄은 밀착된 접지 그림자를, 두 번째 줄은 더 부드러운 주변 그림자를 만듭니다. 이 한 가지 패턴만으로 카드형 UI의 80%를 처리할 수 있습니다.
엘리베이션(높이) 시스템
머티리얼 디자인은 6단계의 엘리베이션(높이)을 사용하며, 각 단계마다 서로 다른 그림자 조합을 둡니다. 단순화하면 다음과 같습니다.
| 엘리베이션 | 그림자 |
|---|---|
| 1 (정지 상태) | 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24) |
| 2 | 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(0,0,0,.23) |
| 3 | 0 10px 20px rgba(0,0,0,.19), 0 6px 6px rgba(0,0,0,.23) |
| 4 (떠오름) | 0 14px 28px rgba(0,0,0,.25), 0 10px 10px rgba(0,0,0,.22) |
| 5 (부유) | 0 19px 38px rgba(0,0,0,.30), 0 15px 12px rgba(0,0,0,.22) |
엘리베이션 역할마다 하나씩 골라 일관되게 사용하세요.
컬러 그림자가 더 자연스럽게 보입니다
순수한 검은색 그림자는 인공적으로 보입니다. 실제 그림자는 그 아래 표면의 색조를 띠기 때문입니다. 다음과 같이 시도해 보세요.
box-shadow: 0 12px 24px rgba(40, 80, 120, 0.18);
순수한 검은색 대신 차가운 청회색을 사용했습니다. 따뜻한 배경에서는 더 따뜻한 색조를 쓰세요.
성능
박스 그림자는 다시 그릴 때마다 매번 페인팅됩니다. 많은 요소에 크고 무거운 그림자를 적용하면 스크롤이 느려질 수 있습니다. 완화 방법은 다음과 같습니다.
- 요소에
transform: translateZ(0)을 적용해 합성 레이어를 강제로 생성하세요. - 그림자가 clip-path를 따라가야 하는 경우에만 복잡한 그림자를
filter: drop-shadow()로 대체하세요(일반적으로 더 느립니다). - 자주 다시 렌더링되는 요소에서는 그림자를 제한하세요.
눌린 상태를 위한 inset
.button:active {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.12);
}
inset 그림자는 움푹 들어간 느낌을 흉내 내, 버튼이 표면에 눌려 들어간 것처럼 보이게 합니다. 아래쪽으로 살짝 내리는 transform: translateY(1px)와 함께 쓰면 손끝에 닿는 듯한 클릭감을 줄 수 있습니다.
자주 묻는 질문
대개 흐림이 너무 약하거나 확산(spread)이 너무 크기 때문입니다. 흐림이 없는 또렷한 가장자리의 그림자는 마치 요소가 하나 더 복제된 것처럼 보입니다. 흐림을 키우고(20~30px가 흔한 출발점입니다) 확산은 0이나 아주 작은 음수 값으로 유지하세요.
box-shadow는 border-radius를 포함한 요소의 보더 박스를 따라가므로, 둥근 카드에는 자동으로 매끄럽게 둥근 그림자가 생깁니다. clip-path로 만든 도형의 경우 box-shadow는 클립을 따라가지 않으니, 대신 filter: drop-shadow()를 사용하세요.
원하는 방향으로 그림자를 크게 오프셋하고, 음수 확산으로 반대쪽을 가립니다. 또는 두 개의 그림자를 사용해, 하나는 대상 면에 보이게 하고 다른 하나는 음수 확산으로 원치 않게 새어 나온 부분을 “지우는” 방법도 있습니다.
엄격한 제한은 없지만, 그림자가 하나 늘 때마다 페인팅 과정도 하나씩 늘어납니다. 실용적인 상한은 3~4개 레이어이며, 그보다 많아진다면 배경 이미지나 SVG 사용을 고려하는 편이 좋습니다.
관련 도구
ASCII 표 참조
NUL, LF, DEL 같은 제어 문자를 포함해 모든 문자에 대한 10진수, 16진수, 8진수, 2진수, HTML 숫자 문자 참조를 담은 0부터 127까지의 전체 ASCII 표.
키보드 단축키 참고표
macOS, Windows, Linux에서 VS Code, Chrome, GNU Readline을 쓰는 Bash의 문서화된 기본 단축키를 검색합니다.
HTML 문자 참조
HTML 엔티티의 검색 가능한 목록, 각 엔티티의 이름 및 숫자 코드, 그리고 특수 문자 및 기호에 대한 1클릭 복사 기능을 제공합니다.
보색 찾기
어떤 입력에 대해서도 보색을 찾습니다. HSL 반대 색, 분할 보색 쌍, 그리고 접근성 있는 조합 제안을 반환합니다.
랜덤 영어 글자 생성기
A-Z 영어 글자를 무작위로 생성합니다. 개수와 대문자, 소문자, 혼합 대소문자를 선택해 게임, 과제, 수업 활동에 활용하세요.
랜덤 색상 팔레트 생성기
2~15개의 색상으로 랜덤 팔레트를 만들고, 비비드, 파스텔, muted, dark 스타일을 선택한 뒤 HEX 코드나 CSS 변수를 복사하세요.