노트

content-visibility

CSS content-visibility Property

프런트엔드#css#performance · 연결된 개념 4개

쉽게 말하면

content-visibility는 긴 페이지에서 아직 안 보이는 부분은 그리지 말고 미뤄 두라고 브라우저에 알려 주는 거예요. 두꺼운 책을 지금 펼친 쪽만 읽듯 하니 첫 화면과 스크롤이 빨라져요.

비유가 깨지는 곳 그리지 않은 부분은 높이가 0처럼 계산돼 스크롤바가 엉망이 되고 위치가 튀어요. 그래서 contain-intrinsic-size로 예상 크기를 잡아 둬요. 내용은 DOM에 남아 있어서 페이지 내 찾기는 그대로 돼요.

화면 밖에 있는 요소의 렌더링을 건너뛰어도 된다고 브라우저에 알려 주는 CSS 속성. auto를 주면 뷰포트에서 멀리 있는 요소의 레이아웃·페인트를 생략하므로, 긴 페이지의 첫 렌더링과 스크롤이 빨라진다.

값동작
visible(기본)평소처럼 렌더링
auto화면 근처에 올 때만 내용을 렌더링
hidden내용을 렌더링하지 않음. 렌더링 상태는 캐시해 둬서 다시 보일 때 빠르다
.card {
  content-visibility: auto;
  contain-intrinsic-size: auto 300px; /* 렌더링 전 예상 높이 */
}

contain-intrinsic-size가 필요한 이유

내용을 건너뛴 요소는 높이가 0인 것처럼 계산된다. 그러면 스크롤바 크기가 엉망이 되고, 스크롤하다 요소가 렌더링되면서 위치가 튄다. contain-intrinsic-size는 렌더링 전에 쓸 자리 크기를 정해 준다. 앞에 auto를 붙이면 한 번 렌더링된 뒤에는 실제 크기를 기억한다. 값은 대략이면 충분하다. DevTools에서 몇 개 재 보고 평균을 넣고, 빠르게 스크롤했을 때 크게 튀지 않으면 된다.

동작 원리와 주의점

  • content-visibility: auto는 contain: layout style paint를 함께 건다. 요소 안의 변화가 밖에 영향을 주지 않는다고 보장하는 CSS Containment이고, 그래서 리플로우가 바깥으로 번지지 않는다. contain만 따로 써도 레이아웃 스래싱의 범위를 줄일 수 있다
  • hidden은 display: none과 달리 렌더링 상태를 버리지 않아 탭 UI처럼 자주 바뀌는 곳에 좋다
  • 건너뛴 내용도 DOM(Document Object Model)과 접근성 트리(Accessibility Tree)에 남아 있어 페이지 내 찾기·앵커 이동·폼 제출이 동작한다
  • body 같은 최상위가 아니라 반복되는 섹션·카드 단위에 건다
  • 화면에 들어오고 나갈 때 contentvisibilityautostatechange 이벤트가 온다. 화면 밖 애니메이션이나 rAF 루프를 멈추는 데 쓴다

가상화와 비교

DOM 노드는 그대로 두고 계산만 건너뛰므로 CSS 한 줄로 끝나지만, 수만 개 항목처럼 DOM 자체가 너무 크면 한계가 있다. 그때는 보이는 항목만 DOM에 두는 리스트 가상화(List Virtualization)가 낫다. 수백~수천 개 정도면 content-visibility로 충분한 경우가 많다.

지원: Chrome·Edge 85+, Firefox 125+, Safari 18+(2026 기준). 지원하지 않는 브라우저는 무시하므로 점진적으로 적용해도 안전하다.

출처: web.dev — content-visibility · MDN — content-visibility

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • Activity와 숨겨진 라우트 보존

    Activity는 React 19.2의 컴포넌트로, UI를 언마운트하지 않고 display: none으로 숨기면서 state와 DOM(Document Object Model)을 보존한다. 숨기는 동안 Effect는 정리(cleanup)된다. 예전 이름은 Offscreen이다.

  • 크로스 브라우징

    크로스 브라우징은 브라우저 종류·버전·기기가 달라도 웹 페이지가 같은 기능을 제공하도록 만드는 일이다. 모든 브라우저에서 픽셀까지 똑같이 보이게 하는 것이 목표가 아니라, 지원하기로 한 환경에서 핵심 기능이 동작하고 오래된 환경에서도 쓸 수는 있게(점진적 향상, Progressive Enhancement) 하는 것이 목표다.

  • CSS 명시도

    캐스케이드에서 레이어까지 비겼을 때, 선택자가 요소를 얼마나 구체적으로 가리키는지로 승부를 내는 점수. (A, B, C) 세 자리로 매기고 앞자리부터 비교한다.

  • Tailwind CSS

    flex, px-4, text-sm처럼 속성 하나를 담은 유틸리티 클래스(Utility Class)를 마크업에 조합해 스타일을 입히는 CSS 프레임워크. 빌드할 때 소스를 훑어 실제로 쓰인 클래스의 CSS만 만들어 내는 빌드 도구이고, 런타임에 돌아가는 JS(JavaScript)는 없다.

  • 반응형 웹 디자인

    하나의 페이지가 화면 크기와 기기에 맞춰 레이아웃·이미지·글자 크기를 바꾸도록 만드는 접근. 미디어 쿼리(Media Query), 유연한 레이아웃(Flexible Layout), 반응형 미디어(Responsive Media)가 세 축이다.

보기 옵션