들어가며: CSS가 다시 재미있어졌어요

예전엔 "CSS는 어렵고 브라우저 호환성 지옥"이라는 말이 공식처럼 돌았는데, 요즘은 분위기가 완전히 달라졌어요. :has(), @container, text-wrap: balance 같은 기능들이 Baseline에 진입하면서, 자바스크립트로 짜던 트릭들을 CSS 한 줄로 대체하는 사례가 급격히 늘고 있죠.

이번 글에서는 최근 CSS 커뮤니티에서 화제가 된 신기능들을 실무에서 언제, 어떻게 쓰면 좋은지 중심으로 정리해봤어요. 원문은 CSS-Tricks의 정기 뉴스레터 What's !important #18이며, 여기서는 한국 개발자 관점에서 다시 풀어봤습니다.

💡 핵심만 먼저 보자면:

  • 툴팁 UX: "지연 후 즉시(delayed-then-instant)" 패턴이 사실상 표준
  • interest invokers: Chrome만 지원하지만 progressive enhancement로 오늘부터 사용 가능
  • flex-wrap: balance: text-wrap: balance의 flex 버전, 이제 Chrome에서 사용 가능
  • class prefix selector: 아직 미지원이지만, 오면 판이 바뀔 문법

이제 하나씩 들어가 볼게요. 😊

Web developer reviewing CSS syntax highlighting and new browser features on a laptop screen Technical Structure Concept

실전에서 가장 쓸모 있는 3가지

1. 지연 후 즉시 툴팁 (Delayed-then-instant tooltips)

툴팁 UX에서 가장 흔한 실수는 **"호버하면 바로 뜨고, 벗어나면 바로 사라진다"**는 패턴이에요. 이러면 마우스가 스칠 때마다 툴팁이 깜빡여서 오히려 방해가 되죠.

정석은 이래요:

  • 등장은 약간 지연 (실수로 트리거하지 않도록)
  • 퇴장은 즉시 (더 이상 원하지 않을 때 바로 사라지도록)
/* 기본: 지연 등장 + 즉시 퇴장 */
.tooltip-trigger {
  position: relative;
}

.tooltip-trigger::after {
  content: attr(data-tooltip);
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  padding: 6px 10px;
  background: #1f2937;
  color: #fff;
  border-radius: 6px;
  font-size: 13px;
  white-space: nowrap;
  opacity: 0;
  pointer-events: none;
  /* 등장은 400ms 지연, 퇴장은 즉시 */
  transition: opacity 0s;
  transition-delay: 0s;
}

.tooltip-trigger:hover::after {
  opacity: 1;
  transition: opacity 0.15s ease;
  transition-delay: 0.4s; /* 등장 지연 */
}

⚠️ 주의: 호버 영역이 너무 작으면 오히려 지연이 독이 돼요. 마우스가 살짝 벗어났다 돌아오는 사이에 툴팁이 사라졌다 다시 뜨는 깜빡임이 생기거든요. 그런 경우엔 지연값을 줄이거나, 트리거 영역에 padding을 줘서 넓혀주세요.

2. interest invokers — 툴팁·팝오버의 미래

위 패턴을 CSS만으로 더 깔끔하게 처리하는 방법이 interest invokers예요. interest-delay-startinterest-delay-end 두 속성으로 등장/퇴장 지연을 제어합니다.

<button interestfor="my-popover">호버해보세요</button>
<div id="my-popover" popover>안녕하세요! 👋</div>
button {
  interest-delay-start: 0.4s;  /* 호버 후 400ms 뒤 등장 */
  interest-delay-end: 0s;      /* 벗어나면 즉시 사라짐 */
}

현재 Chrome만 지원하지만, 지원하지 않는 브라우저에서는 그냥 기존 동작(즉시 표시)으로 폴백되기 때문에 progressive enhancement 관점에서 오늘부터 도입해도 안전해요.

3. flex-wrap: balance — 이제 flex도 균형 잡기

text-wrap: balance가 텍스트 줄바꿈을 예쁘게 만들어줬다면, flex-wrap: balance는 flex 아이템을 행/열에 균등하게 분배해줘요. 카드 리스트, 태그 클라우드, 네비게이션 메뉴에서 특히 유용하죠.

.tag-cloud {
  display: flex;
  flex-wrap: balance; /* 마지막 줄에 몰리는 현상 방지 */
  gap: 8px;
}

기존에는 JS로 아이템 개수를 세서 줄바꿈을 조정하거나, :nth-child 트릭을 써야 했는데 이제 그럴 필요가 없어졌어요.


함께 보면 좋은 글

Chrome DevTools panel showing CSS custom properties and grid information for layout debugging Algorithm Concept Visual

그 외 주목할 만한 신기능들

기능 비교 한눈에 보기

기능지원 현황실무 적용도비고
interest invokersChrome only★★★★☆progressive enhancement로 즉시 도입 가능
flex-wrap: balanceChrome 152+★★★★★JS 트릭 대체, 바로 쓸 수 있음
@supports named-feature()Chrome only★★★☆☆특수 케이스 쿼리용
class prefix selector미지원 (제안 단계)★★★★☆지원되면 판도 바뀔 문법
sibling-count() / sibling-index()Baseline 진입★★★★☆형제 요소 인덱싱이 CSS만으로
text-box-trim / text-box-edgeBaseline 진입★★★☆☆수직 정렬 미세 조정
alpha()Chrome 152+★★☆☆☆Safari/Firefox 지원 대기

class prefix selector가 뭐길래

아직 어디서도 지원 안 되지만, 문법이 너무 단순하고 유용해서 빠르게 표준화될 가능성이 높아요.

/* 신문법 (제안) */
.something-* {
  /* ... */
}

/* 기존 방식: 속성 선택자 3종 세트 */
[class^="something-"] { /* class="something-xxx" */ }
[class*=" something-"] { /* class="xxx something-xxx" */ }
[class*="something-"]  { /* class="my-something-xxx" (오탐 위험) */ }

기존 속성 선택자는 오탐이 나거나 성능이 떨어지는데, prefix selector는 이 문제를 한 방에 해결해요. Tailwind 유틸리티 클래스처럼 prefix 기반 네이밍을 쓰는 프로젝트라면 특히 반가운 소식이죠.

@supports named-feature()

@supports로는 쿼리할 수 없었던 아주 세부적인 기능 지원 여부를 확인할 수 있게 해줘요. 예를 들어 "앵커 포지셔닝에서 transform을 존중하는가?" 같은 질문에 답할 수 있죠.

@supports named-feature(anchor-positioning-respects-transform) {
  /* 최신 브라우저용 정밀 포지셔닝 */
}

CSS grid 정보를 CSS 변수로

Temani Afif가 소개한 트릭으로, 그리드의 행/열 개수와 각 셀의 (x, y) 좌표를 CSS 커스텀 프로퍼티로 뽑아낼 수 있어요. 조건은 모든 컬럼 너비가 동일해야 한다는 점. 이걸 활용하면 hover 근접도(proximity) 같은 인터랙션도 순수 CSS로 구현 가능해요.


⚠️ 이 기능들의 한계와 주의사항

  1. 브라우저 지원 편차가 여전히 큽니다. interest invokers, named-feature(), alpha() 등은 Chrome only예요. Safari/Firefox 사용자 비중이 높은 서비스라면 반드시 폴백을 준비하세요.
  2. Baseline 진입 ≠ 모든 브라우저 지원. Baseline은 "주요 브라우저에서 안정적으로 동작한다"는 뜻이지만, 구버전 사용자는 여전히 존재해요. @supports로 감싸는 습관을 들이세요.
  3. flex-wrap: balance는 성능 비용이 있어요. 아이템이 수십 개 이상인 리스트에서는 레이아웃 계산이 무거워질 수 있으니, 실제 성능 프로파일링 후 적용하세요.
  4. 국내 SI/엔터프라이즈 환경 주의: IE 대응이 필요한 레거시 프로젝트에서는 이 기능들 대부분 사용 불가예요. 신규 프로젝트나 사내 어드민 같은 최신 브라우저 한정 환경에서 먼저 도입하는 걸 추천합니다.

다음 단계 학습 방향

  • Custom Highlight API: MicroLighter 같은 라이브러리 코드를 직접 읽어보세요. ::highlight() 의사 요소와 Highlight 객체 사용법이 핵심이에요.
  • Anchor Positioning: @supports named-feature()가 쿼리하는 대상이 바로 이 스펙이에요. 툴팁/팝오버 구현의 미래입니다.
  • Popover API + interest invokers: 두 스펙을 조합하면 JS 한 줄 없이 완전한 툴팁 시스템을 만들 수 있어요.
  • Baseline 대시보드 구독: web.dev의 Baseline 상태를 정기적으로 체크하면 "언제 도입해도 안전한가"를 판단하는 기준이 생겨요.

Modern developer desk setup with dual monitors displaying CSS documentation and browser experiments Dev Environment Setup

마무리: "오늘부터 쓸 수 있는 것"부터 시작하세요

CSS 신기능을 볼 때마다 "브라우저 지원 안 되면 어쩌지" 하고 미루는 분들이 많은데, progressive enhancement 관점에서 접근하면 이야기가 완전히 달라져요. 지원되는 브라우저에서는 더 나은 UX를, 지원되지 않는 브라우저에서는 기존과 동일한 UX를 제공하면 됩니다.

실무 적용 우선순위를 정리하면:

  1. 오늘 바로 적용 가능: flex-wrap: balance, sibling-count(), text-box-trim
  2. 폴백과 함께 도입: interest invokers, alpha()
  3. 지원되면 도입: class prefix selector, named-feature()

특히 flex-wrap: balance는 JS 트릭을 제거할 수 있어서 코드 복잡도가 확 줄어들어요. 태그 클라우드나 카드 그리드가 있는 프로젝트라면 이번 주에 바로 실험해보시길 권합니다.

CSS는 이제 "스타일 언어"가 아니라 **"레이아웃과 인터랙션을 선언적으로 표현하는 언어"**로 진화하고 있어요. 이 흐름을 놓치지 마세요. 🚀

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.