CSS filter() 함수

CSS filter() functions

blur·brightness·contrast·grayscale·hue-rotate·invert·sepia·saturate — 같은 그림 위에 하나씩 돌려가며 눈으로 비교하는 filter 함수 사전.

다른 이름: filter propertyblur/brightness/contrast
···
html
<div class="wrap"><div class="stage"><div class="photo" id="p"></div></div><div class="label" id="l">filter: none</div></div>
css
.wrap{position:relative;display:grid;place-items:center}
.stage{width:min(72vmin,320px);aspect-ratio:4/3;border-radius:16px;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,.18)}
.photo{position:absolute;inset:0;transition:filter .5s ease;background:
  radial-gradient(circle at 28% 30%,#ffd166 0 16%,transparent 17%),
  radial-gradient(circle at 70% 65%,#f25c8a 0 12%,transparent 13%),
  linear-gradient(180deg,#5b5bf7 0%,#18c29c 60%,#0d0d12 100%)}
.label{position:absolute;left:10px;bottom:10px;padding:4px 10px;border-radius:999px;background:rgba(0,0,0,.6);color:#fff;font:600 12px/1.4 monospace}
js
const FILTERS = ['blur(6px)','brightness(1.7)','contrast(2)','grayscale(1)','hue-rotate(140deg)','invert(1)','sepia(1)','saturate(3.5)'];
const p = document.getElementById('p');
const l = document.getElementById('l');
let i = 0;
function apply(){ const css = FILTERS[i]; p.style.filter = css; l.textContent = 'filter: ' + css; i = (i + 1) % FILTERS.length; }
apply();
setInterval(apply, 1400);

filter 는 요소 자체의 픽셀을 후처리하는 CSS 속성입니다. 함수를 콤마 없이 공백으로 이어 여러 개를 동시에 걸 수 있고(`filter: blur(2px) brightness(1.2)`), 순서대로 적용됩니다.

blur() 는 가우시안 흐림, brightness/contrast/saturate 는 픽셀값 스케일, grayscale/sepia/invert 는 색 변환, hue-rotate 는 색상환 회전입니다. 전부 SVG filter primitive 를 감싼 단축 함수라서, 더 정교한 조합이 필요하면 filter: url(#id) 로 직접 만든 SVG 필터를 쓸 수도 있습니다.

가장 흔한 함정은 성능입니다. blur 반경이 클수록, 요소가 클수록 GPU 비용이 커지고 — 매 프레임 값이 바뀌는 애니메이션에 큰 이미지를 물리면 눈에 띄게 버벅입니다. 또 filter 를 건 요소는 opacity·transform 처럼 새 스태킹 컨텍스트를 만들어서, 자식의 z-index 가 그 안에 갇힙니다.

로딩 스켈레톤(blur), 비활성 상태(grayscale), 다크모드 일러스트 톤 보정(hue-rotate) 처럼 실무에서 값 하나만 바꿔 쓰는 경우가 대부분입니다.

언제 쓰나

값 하나만 바꿔서 상태를 표현할 때(비활성=grayscale, 로딩=blur) 가장 안전합니다. 전체 배경 이미지에 큰 blur 를 매 프레임 바꾸는 애니메이션은 피하세요.