실무에 바로 적용할 수 있는 웹 제작 꿀팁 및 유용한 자료실 공간입니다.
나눔웹이 제공하는 핵심 노하우와 마케팅 인사이트를 자유롭게 활용해 보십시오.

나눔웹 퍼블리싱 꿀팁

CSS :has() 선택자 활용법, 자식 상태에 따라 부모 박스 스타일 바꾸기

CSS :has() 선택자는 "안에 이런 요소가 있는 부모"를 고를 수 있게 해 주는 선택자입니다. 체크박스가 체크되면 감싼 박스 색을 바꾸거나, 사진이 있는 카드만 레이아웃을 다르게 잡는 일을 자바스크립트 없이 CSS만으로 처리할 수 있습니다.
예전에는 클래스 하나 붙이자고 스크립트를 따로 짰던 부분들이라, 알아 두면 유지보수가 꽤 편해집니다.

💡 그동안은 왜 부모를 못 골랐나요?

CSS 선택자는 원래 위에서 아래로, 부모에서 자식 방향으로만 고를 수 있었습니다. 그래서 자식 상태에 따라 부모를 바꾸려면 스크립트로 부모에 클래스를 붙였다 뗐다 해야 했습니다. :has()는 이 방향을 거꾸로 볼 수 있게 해 줍니다.

1. 사진이 있는 카드와 없는 카드를 다르게

게시판 목록이나 공지 카드를 만들다 보면 관리자가 사진을 넣기도 하고 안 넣기도 합니다. 예전에는 has-thumb 같은 클래스를 서버에서 따로 붙여야 했는데, 이제는 아래 한 블록이면 됩니다.

/* 이미지가 들어 있는 카드만 2열로 */
.card:has(img) {
  display: grid;
  grid-template-columns: 40% 1fr;
  gap: 16px;
}

/* 이미지가 없는 카드는 기본 1열 그대로 */

2. 동의 체크박스, 체크되면 박스 전체가 반응하게

문의 폼 하단의 개인정보 동의 영역은 체크 여부가 눈에 잘 안 띄어서 "전송이 안 돼요" 문의가 자주 들어옵니다. :has(input:checked)로 감싼 박스 전체 색을 바꿔 주면 체크 상태가 한눈에 보입니다.

<label class="agree">
  <input type="checkbox" name="privacy">
  개인정보 수집·이용에 동의합니다
</label>

/* 체크되면 박스 전체 테두리 색 변경 */
.agree:has(input:checked) {
  border-color: #cc2b2b;
  background: #fff5f5;
}

3. 입력 오류가 난 칸만 테두리 강조

:user-invalid는 사용자가 값을 입력하고 넘어간 뒤에만 오류로 판단하기 때문에, 페이지에 들어오자마자 빨간 칸이 뜨는 문제가 없습니다. 이 둘을 같이 쓰면 칸 테두리와 안내 문구를 한 번에 제어할 수 있습니다.

/* 입력값이 형식에 안 맞을 때 감싼 칸 강조 */
.field:has(input:user-invalid) {
  border-color: #d93025;
}
.field:has(input:user-invalid) .hint {
  display: block;   /* 안내 문구 보이기 */
}
브라우저지원 버전
크롬·엣지105 이상
사파리(아이폰 포함)15.4 이상
파이어폭스121 이상

4. 주의할 점

요즘 쓰는 브라우저는 대부분 지원하지만, 오래된 아이폰을 업데이트하지 않은 방문자도 있습니다. 그래서 :has()는 꾸밈을 더하는 용도로 쓰고, 이게 안 먹혀도 폼 전송이나 메뉴 열기 같은 기능은 그대로 되도록 짜는 게 안전합니다. 꼭 구분이 필요하면 @supports로 감싸 두세요.

/* 지원하지 않는 브라우저는 그냥 기본 모양 */
@supports selector(:has(*)) {
  .agree:has(input:checked) {
    border-color: #cc2b2b;
  }
}

또 body:has(...)처럼 아주 넓은 범위에 걸면 페이지가 바뀔 때마다 브라우저가 다시 계산할 일이 많아집니다. 가능하면 카드나 폼 칸처럼 가까운 부모에 거는 편이 좋습니다.

"스크립트를 하나 덜 쓰면, 나중에 고칠 곳도 하나 줄어듭니다."

나눔웹은 퍼블리싱 단계에서 CSS로 해결할 수 있는 부분은 CSS로 정리해, 오픈 뒤 수정과 관리가 가벼운 홈페이지를 만듭니다.


List of Articles
번호 분류 제목 글쓴이
74 마케팅 구글 서치 콘솔 등록 방법, 새 홈페이지 소유권 확인부터 색인 요청까지 new 나눔웹
» 퍼블리싱 CSS :has() 선택자 활용법, 자식 상태에 따라 부모 박스 스타일 바꾸기 new 나눔웹
72 웹 성능 반응형 이미지 srcset 쓰는 법, 모바일에 PC용 큰 사진을 보내지 않으려면 나눔웹
71 퍼블리싱 제목 줄바꿈이 어색할 때, text-wrap: balance로 한 단어만 남는 문제 정리 나눔웹
70 마케팅 robots.txt 작성법, 검색에 안 보여야 할 페이지와 사이트맵 위치 알려주는 순서 나눔웹
69 UI/UX 스켈레톤 로딩 화면 만들기, 빈 화면 대신 회색 자리 표시로 기다림 줄이는 법 나눔웹
68 퍼블리싱 모바일에서 표(table)가 깨질 때, 가로 스크롤로 감싸거나 카드형으로 바꾸는 법 나눔웹
67 웹 성능 gzip 압축 설정법, 홈페이지 HTML·CSS 파일을 작게 보내 로딩 줄이는 순서 나눔웹
66 모바일 아이폰에서 숫자가 파란 전화 링크로 바뀔 때, format-detection으로 막는 법 나눔웹
65 마케팅 사이트맵(sitemap.xml) 만들기, 새 페이지가 검색에 늦게 잡힐 때 작성과 제출법 나눔웹
64 UI/UX FAQ 아코디언 만들기, details와 summary 태그로 스크립트 없이 접고 펴는 법 나눔웹
63 웹 성능 PageSpeed Insights 점수 보는 법, 실사용자 데이터와 실험실 점수가 다를 때 나눔웹
62 UI/UX 404 에러 페이지 만들기, 방문자를 놓치지 않는 구성과 상태 코드 확인법 나눔웹
61 퍼블리싱 카드 목록 반응형 정렬, 미디어쿼리 대신 grid auto-fill과 minmax로 나눔웹
60 마케팅 구글 검색 사이트 이름이 엉뚱하게 나올 때, WebSite 구조화 데이터로 지정하는 법 나눔웹
59 모바일 모바일 가로 스크롤이 생길 때, 화면 밖으로 튀어나온 요소 찾아 고치는 순서 나눔웹
58 웹 성능 외부 폰트가 늦게 뜰 때, preconnect와 dns-prefetch로 연결 시간 줄이는 법 나눔웹
57 퍼블리싱 모달 팝업 만들기, dialog 태그로 ESC 닫기와 배경 클릭 닫기까지 처리하는 법 나눔웹
56 마케팅 301 리디렉션 설정법, 페이지 주소를 바꿀 때 검색 노출 지키는 순서 나눔웹
55 UI/UX 화면 애니메이션 줄이기 설정, prefers-reduced-motion으로 대응하는 법 나눔웹
Board Pagination Prev 1 2 3 4 Next
/ 4
rhwlsghkcocndgus XE2.1.39 STAGE1.5.4