본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Frontend

CSS 시각 효과: 필터, 블렌드 모드, 클리핑, 마스킹

작성 2026. 10. 21.추가
목차10개 항목
출처와 참고

web.dev의 「Learn CSS」 강좌의 Filters·Blend Modes·Paths, shapes, clipping, and masking 모듈을 바탕으로, 도형 함수 지원 범위는 MDN으로 확인해 재구성한 노트다. 반사와 이미지 효과 방법 비교는 「The State of CSS Reflections」와 「Web Image Effects Performance Showdown」을 바탕으로 보강했다.

한눈에 보기

기법바꾸는 것대표 용도
filter요소 전체(자식 포함)의 픽셀흑백·흐림·밝기, 따낸 이미지의 그림자
backdrop-filter요소 뒤에 비치는 배경만반투명 유리(frosted glass) 패널
mix-blend-mode요소와 그 아래 층의 색 섞기듀오톤, 흰 배경 이미지를 배경에 녹이기
background-blend-mode한 요소의 배경 겹끼리 섞기사진 + 단색·그라디언트 합성
clip-path도형 바깥을 잘라 숨김(완전히 보이거나 안 보이거나)원형 아바타, 사선 섹션, 도형 전환 애니메이션
mask-image이미지·그라디언트 픽셀로 투명도 결정(반투명 가능)가장자리 페이드, 복잡한 실루엣
shape-outsidefloat 주변 글이 흐르는 경계원형 사진을 둘러싸는 본문
-webkit-box-reflect (비표준)요소 아래·옆에 비친 상로고·앨범 커버 반사. Firefox 미지원이라 mask-image로 대체

잘라 내거나 가려도 박스 자체는 그대로다. 레이아웃·클릭 영역은 원래 사각형을 기준으로 한다.

filter

여러 함수를 공백으로 이어 쓰며, 하나라도 잘못 쓰면 선언 전체가 무효가 된다.

함수인자결과
blur()길이(% 불가)가우시안 흐림
brightness()수·%, 1(100%)이 원본0이면 검정, 1보다 크면 밝게
contrast()수·%대비
grayscale()0~1흑백. 인자 없으면 완전 흑백
invert()0~1색 반전
opacity()0~1opacity 속성과 같은 효과
saturate()수·%채도
sepia()0~1갈색 톤
hue-rotate()각도모든 색의 색상을 돌린다
drop-shadow()x y 흐림 색투명하지 않은 픽셀의 윤곽을 따르는 그림자(CSS 테두리와 그림자)
url()SVG <filter> 참조SVG 필터 적용
.thumb:not(:hover) { filter: grayscale(1) brightness(.9); }
.glass {
  background: rgb(255 255 255 / 40%);
  backdrop-filter: blur(12px) saturate(1.4);
}
  • backdrop-filter는 filter와 같은 함수를 받는다. 요소의 배경이 반투명해야 효과가 보인다.
  • 효과가 지원되지 않아도 글자가 읽히도록 배경색 대비를 먼저 확보한다.
  • filter와 backdrop-filter는 새 쌓임 맥락을 만들고, 조상에 filter가 있으면 position: fixed 자식의 기준이 바뀐다(CSS position과 z-index).

블렌드 모드

디자인 도구의 레이어 혼합 모드와 같다. mix-blend-mode는 요소(가상 요소 포함)를 아래 층과 섞고, background-blend-mode는 한 요소의 여러 배경 겹끼리 섞는다.

묶음모드효과
기본normal섞지 않는다
어둡게multiply투명 필름을 겹친 것처럼. 흰색은 사라지고 검정은 남는다 → 흰 배경 이미지를 배경에 녹일 때
darken, color-burn채널마다 더 어두운 값 / 대비를 높이며 어둡게
밝게screenmultiply의 반대. 검정이 사라진다
lighten, color-dodge채널마다 더 밝은 값 / 밝게 태운다
대비overlay어두운 곳은 더 어둡게, 밝은 곳은 더 밝게. 50% 회색은 그대로
hard-light, soft-light위 층 기준의 overlay / 부드러운 overlay
차이difference같은 색은 검정, 다르면 반전. 사진 음화처럼
exclusiondifference보다 부드럽다. 같은 색은 50% 회색
성분(비분리형)hue, saturation, color, luminosity위 층의 색상·채도·색·밝기 중 하나를 아래 층의 나머지 성분과 합친다

앞의 열두 가지는 R·G·B 채널을 따로 계산하는 분리형(separable), 마지막 네 가지는 색 성분을 함께 다루는 비분리형(non-separable)이다.

/* 듀오톤: 흑백 사진 위에 가상 요소 두 장을 섞는다 */
.duotone { position: relative; isolation: isolate; }
.duotone img { filter: grayscale(1) contrast(1.2); }
.duotone::before { content: ""; position: absolute; inset: 0; background: #1d3557; mix-blend-mode: lighten; }
.duotone::after  { content: ""; position: absolute; inset: 0; background: #e63946; mix-blend-mode: multiply; }

isolation: isolate는 새 쌓임 맥락을 만들어 그 안의 요소가 바깥 배경과 섞이지 않게 한다. 안쪽 요소끼리는 계속 섞인다. 배경 겹은 이미 격리돼 있어 background-blend-mode에는 영향이 없다.

이미지 효과를 거는 방법과 비용

흑백 같은 이미지 효과는 여러 방법으로 걸 수 있다. 필터는 레이아웃과 첫 페인트 뒤에 렌즈처럼 덧씌워진다.

방법예성격
CSS filterfilter: grayscale(1)가장 간단하고 빠른 편. 상호작용(호버 시 해제)과 전환을 쉽게 붙인다
CSS 블렌드 모드이미지 + 회색 배경에 background-blend-mode: luminosity필터와 비슷한 속도. 여러 층을 섞는 복합 효과에
SVG 필터filter: url(#gray) + <feColorMatrix>채널 단위 조작이 가능해 표현력이 크다. 속도는 CSS보다 조금 느리다
<canvas>getImageData로 픽셀마다 계산가장 느리다. 픽셀마다 JS가 돌고, 다른 출처 이미지는 CORS 설정이 필요하다
미리 편집이미지 자체를 흑백으로 저장런타임 비용이 없다. 효과를 바꿀 수 없다

바뀌지 않는 효과는 이미지 자체에 굽고, 상호작용이 필요한 효과만 CSS로 건다. 많은 이미지에 무거운 blur()를 걸고 애니메이션하면 프레임마다 다시 그려 느려진다.

도형과 clip-path

clip-path는 도형 안쪽만 보이게 한다. 경계에서 완전히 보이거나 완전히 안 보인다.

도형 함수정의 방법크기 반응
circle(반지름 at 위치)반지름 하나. 50%면 요소에 꽉 차는 원반응형
ellipse(가로 세로 at 위치)반지름 둘반응형
inset(위 오 아래 왼 round 반경)각 변에서 안쪽으로 들어온 거리. 요소와 함께 늘고 준다반응형
rect(위 오 아래 왼 round 반경)위·아래는 위쪽 가장자리, 왼·오는 왼쪽 가장자리에서 잰 위치고정 크기 사각형에 맞다
polygon(채움규칙?, x y, …)점 목록. 마지막 점은 첫 점과 자동으로 이어진다. 겹친 부분은 nonzero(기본, 채움) 또는 evenodd(번갈아 비움)반응형(% 사용 시)
path("SVG 경로")SVG 경로 문법. 값은 모두 px반응형이 아니다
shape(from …, line to …, curve to …)CSS 명령 문법. %·cqi 같은 단위를 쓸 수 있다반응형. 2026년 Firefox 148 지원으로 모든 주요 브라우저(Baseline 2026)
.avatar { clip-path: circle(50%); }
.section-slant { clip-path: polygon(0 0, 100% 0, 100% 85%, 0 100%); }
.cut { clip-path: inset(10px 20px round 12px); }
.logo { clip-path: url(#logo-clip); }       /* SVG <clipPath> 참조. 외부 파일이면 url(shapes.svg#logo-clip) */
  • 도형을 재는 기준 상자는 기본 border-box다. clip-path: inset(10px) padding-box처럼 padding-box, content-box, margin-box로 바꿀 수 있다.
  • clip-path는 도형 하나만 받는다. 떨어진 여러 도형은 path()·shape()의 복합 경로, SVG <clipPath>, 또는 마스크로 만든다.
  • 잘라도 안의 글은 도형을 따라 다시 흐르지 않는다.

도형 애니메이션

  • clip-path는 애니메이션할 수 있다. 같은 도형 함수를 써야 하고, polygon()·shape()는 점 개수가 같아야 부드럽게 바뀐다.
  • offset-path에 같은 도형이나 ray(각도)를 주고 offset-distance를 0%→100%로 움직이면 요소가 경로를 따라 이동한다.

마스킹

마스크는 이미지·그라디언트·SVG <mask>의 픽셀로 보이는 정도를 정한다. 반투명이 가능하다는 점이 clip-path와 다르다.

.fade-bottom { mask-image: linear-gradient(black 70%, transparent); }   /* 아래로 갈수록 사라짐 */
.multi {
  mask: url(star.svg) center / 40% no-repeat luminance,
        linear-gradient(90deg, black, transparent) alpha;
}
속성초깃값뜻
mask-imagenone마스크 이미지들. 쉼표로 여러 장, 기본으로 더해진다
mask-modematch-sourcealpha(투명도만 봄) / luminance(밝을수록 보이고 어두울수록 숨김). 이미지·그라디언트는 alpha, SVG <mask>는 luminance가 기본
mask-compositeadd여러 마스크를 합치는 방식(subtract, intersect, exclude)
mask-position, mask-size, mask-repeatbackground-*와 같은 문법
mask-origin, mask-clipborder-box기준 상자·적용 범위

값 목록이 마스크 개수보다 짧으면 반복해 채우고, 길면 남는 값은 버린다. 축약형 mask는 순서대로 image, mode, position / size, repeat, origin, clip, composite를 받고, 빠진 값은 초깃값으로 돌아간다.

마스크로 만드는 반사

요소 아래에 거울에 비친 듯한 상을 붙이는 표준 속성은 없다. -webkit-box-reflect는 Chromium·Safari만 지원하는 비표준 속성이고 Firefox는 지원하지 않는다.

.logo { -webkit-box-reflect: below 4px linear-gradient(transparent 60%, rgb(0 0 0 / .3)); }

모든 브라우저에서 같게 보여야 하면 위의 마스크를 쓴다. 가상 요소에 같은 이미지를 배경으로 넣고 scale: 1 -1로 뒤집은 뒤 mask-image 그라디언트로 아래쪽을 흐리게 한다. 내용이 바뀌는 요소라면 반사를 포기하는 편이 낫다.

shape-outside: 글이 도형을 따라 흐르게

clip-path로 원형을 만들어도 float 주변 글은 원래 사각형을 피해 흐른다. shape-outside로 흐름 경계를 따로 준다.

.portrait {
  float: inline-start;
  width: 12rem; aspect-ratio: 1;
  clip-path: circle(50%);
  shape-outside: circle(50%);
  shape-margin: 1rem;
}
  • 기본 도형 함수와 이미지·그라디언트를 받는다. 이미지일 때는 shape-image-threshold로 어느 투명도부터 도형 안으로 볼지 정한다.
  • path(), shape(), SVG <clipPath>는 받지 않는다.
  • float된 요소에만 효과가 있다.

정리

  • 요소 전체는 filter, 뒤 배경만은 backdrop-filter.
  • 색을 섞으면 블렌드 모드, 섞임을 가두려면 isolation: isolate.
  • 딱 떨어지는 모양이면 clip-path, 반투명 경계면 mask.
  • 반응형 복잡 도형은 path() 대신 shape().
  • 잘라도 박스와 흐름은 그대로다. 글이 도형을 따르게 하려면 shape-outside.
  • 바뀌지 않는 이미지 효과는 이미지에 굽고, 상호작용이 필요한 것만 CSS로 건다. 캔버스 픽셀 처리가 가장 느리다.

관련 노트: CSS 테두리와 그림자, CSS 배경과 그라디언트, CSS 함수: calc()·clamp()와 수학 함수, CSS position과 z-index

원본 기록8

댓글

GitHub 계정으로 댓글을 남길 수 있어요.