들어가며: 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: 아직 미지원이지만, 오면 판이 바뀔 문법
이제 하나씩 들어가 볼게요. 😊

실전에서 가장 쓸모 있는 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-start와 interest-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 트릭을 써야 했는데 이제 그럴 필요가 없어졌어요.
함께 보면 좋은 글
- "CSS 하이라이트 의사 요소 완벽 가이드: search-text부터 접근성까지" — Custom Highlight API 기반 하이라이터(MicroLighter)와 직접 연결되는 심화 내용이에요.
- "Kimi Code CLI에 Vercel 플러그인 등장! 에이전틱 개발 시대의 새로운 표준" — CSS 신기능을 AI 에이전트로 자동 마이그레이션하는 흐름과 맞닿아 있어요.

그 외 주목할 만한 신기능들
기능 비교 한눈에 보기
| 기능 | 지원 현황 | 실무 적용도 | 비고 |
|---|---|---|---|
interest invokers | Chrome only | ★★★★☆ | progressive enhancement로 즉시 도입 가능 |
flex-wrap: balance | Chrome 152+ | ★★★★★ | JS 트릭 대체, 바로 쓸 수 있음 |
@supports named-feature() | Chrome only | ★★★☆☆ | 특수 케이스 쿼리용 |
class prefix selector | 미지원 (제안 단계) | ★★★★☆ | 지원되면 판도 바뀔 문법 |
sibling-count() / sibling-index() | Baseline 진입 | ★★★★☆ | 형제 요소 인덱싱이 CSS만으로 |
text-box-trim / text-box-edge | Baseline 진입 | ★★★☆☆ | 수직 정렬 미세 조정 |
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로 구현 가능해요.
⚠️ 이 기능들의 한계와 주의사항
- 브라우저 지원 편차가 여전히 큽니다.
interest invokers,named-feature(),alpha()등은 Chrome only예요. Safari/Firefox 사용자 비중이 높은 서비스라면 반드시 폴백을 준비하세요. - Baseline 진입 ≠ 모든 브라우저 지원. Baseline은 "주요 브라우저에서 안정적으로 동작한다"는 뜻이지만, 구버전 사용자는 여전히 존재해요.
@supports로 감싸는 습관을 들이세요. flex-wrap: balance는 성능 비용이 있어요. 아이템이 수십 개 이상인 리스트에서는 레이아웃 계산이 무거워질 수 있으니, 실제 성능 프로파일링 후 적용하세요.- 국내 SI/엔터프라이즈 환경 주의: IE 대응이 필요한 레거시 프로젝트에서는 이 기능들 대부분 사용 불가예요. 신규 프로젝트나 사내 어드민 같은 최신 브라우저 한정 환경에서 먼저 도입하는 걸 추천합니다.
다음 단계 학습 방향
- Custom Highlight API: MicroLighter 같은 라이브러리 코드를 직접 읽어보세요.
::highlight()의사 요소와Highlight객체 사용법이 핵심이에요. - Anchor Positioning:
@supports named-feature()가 쿼리하는 대상이 바로 이 스펙이에요. 툴팁/팝오버 구현의 미래입니다. - Popover API + interest invokers: 두 스펙을 조합하면 JS 한 줄 없이 완전한 툴팁 시스템을 만들 수 있어요.
- Baseline 대시보드 구독: web.dev의 Baseline 상태를 정기적으로 체크하면 "언제 도입해도 안전한가"를 판단하는 기준이 생겨요.

마무리: "오늘부터 쓸 수 있는 것"부터 시작하세요
CSS 신기능을 볼 때마다 "브라우저 지원 안 되면 어쩌지" 하고 미루는 분들이 많은데, progressive enhancement 관점에서 접근하면 이야기가 완전히 달라져요. 지원되는 브라우저에서는 더 나은 UX를, 지원되지 않는 브라우저에서는 기존과 동일한 UX를 제공하면 됩니다.
실무 적용 우선순위를 정리하면:
- 오늘 바로 적용 가능:
flex-wrap: balance,sibling-count(),text-box-trim - 폴백과 함께 도입:
interest invokers,alpha() - 지원되면 도입:
class prefix selector,named-feature()
특히 flex-wrap: balance는 JS 트릭을 제거할 수 있어서 코드 복잡도가 확 줄어들어요. 태그 클라우드나 카드 그리드가 있는 프로젝트라면 이번 주에 바로 실험해보시길 권합니다.
CSS는 이제 "스타일 언어"가 아니라 **"레이아웃과 인터랙션을 선언적으로 표현하는 언어"**로 진화하고 있어요. 이 흐름을 놓치지 마세요. 🚀