[CSS] - CSS 고급 선택자
* 연결 선택자
- 선택자와 선택자를 연결해 적용 대상을 제한하는 선택자
- 컴비네이션 선택자(combination selector) 또는 조합 선택자라고 한다.
- 하위 요소에 스타일을 적용하는 하위 선택자 / 자식 선택자
하위 선택자(descendant selector)
- 부모 요소에 포함된 모든 하위 요소에 스타일이 적용
- 자식 요소뿐만 아니라 손자 요소, 손자의 손자 요소 등 모든 하위 요소까지 적용
- 하위 선택자를 정의할 때 상위 요소와 하위 요소를 나란히 씀
- 기본형
상위요소 하위요소
<예시>
...
section p {color: blue; } /* section 요소의 모든 하위 p 요소를 파란색 글자로 지정 */
</style>
...
<section>
<h1>예약 방법 & 사용 요금</h1>
<div>
<p>가족실(2~4인) : 60,000원/일</p>
<p>도미토리(4인 공용) : 25,000원/일</p>
</div>
</section>
...
자식 선택자(child selector)
- 자식 요소에 스타일을 적용하는 선택자
- 두 요소 사이에 >(부등호) 표시해 부모 요소와 자식 요소 구분
- 기본형
부모요소 > 자식요소
<예시>
...
secton > p { color: blue; } /* section 요소의 자식인 p 요소를 파란색 글자로 지정 */
</style>
...
<section>
<h1>예약 방법 & 사용 요금</h1>
<p>아직 온라인 예약 신청이...</p> /* p요소에만 스타일 적용 */
<div>
<p>가족실(2~4인): 60,000원/일</p>
<p>도미토리(4인 공용): 25,000원/일</p>
</div>
</section>
...
- 형제 요소에 스타일을 적용하는 인접 형제 선택자 / 형제 선택자
인접 형제 선택자(adjacent selector)
- 같은 부모를 가진 형제 요소 중 첫 번째 동생 요소에만 스타일 적용
- 요소 1과 요소 2 사이에 '+' 기호 사용
- 요소1과 요소2는 같은 레벨이면서 요소1 이후 첫번쨰 요소2에 적용
- 기본형
요소1 + 요소2
<예시>
...
h1 + p {
background-color: #222; /* 배경색은 검은색 */
color: #fff;
}
</style>
...
<section>
<h1>예약 방법 & 이용 요금</h1>
<p>아직 온라인 예약...</p> /* 첫 번쨰 동생요소에 스타일 적용 */
<p>가족실(2~4인) : 60,000원/일</p>
<p>도미토리(4인 공용) : 25,000원/일</p>
...
=> 부모 : section
형제 선택자(sibling selector)
- 형제 요소들에 스타일 적용
- 인접 형제 선택자와 다른 점은 모든 형제 요소에 다 적용됨
- 요소1과 요소2 사이에 기호 '~' 사용(선택 범위 아님)
- 기본형
요소1 ~ 요소2
<예시>
h1 ~ p {
background-color: #222; /* 배경 검정 */
color: #fff; /* 글자 흰색 */
}
</style>
...
<h1>예약 방법 & 이용 요금</h>
/* p요소에 모두 적용 */
<p>아직 온라인 예약...</p>
<p>가족실(2~4)인 : 60,000원/일</p>
<p>도미토리(4인 공용) : 25,000원/일</p>
* 속성 선택자
- 특정 속성이 있는 요소를 선택하는 [속성] 선택자
- 지정한 속성을 가진 요소를 찾아 스타일 적용
- 기본형
a[href] {...}
<예시>
...
a[href] { /* href 속성이 있는 a 요소를 찾는 선택자 */
background: yellow; /* 배경 노랑 */
border: 1px solid #ccc; /* 테두리 */
font-weigt: normal; /* 글꼴 굵기 */
}
</style>
...
<ul>
<li><a>메인 메뉴 : </a></li>
<li><a href="#">메뉴 1</a></li>
<li><a href="#">메뉴 2</a></li>
<li><a href="#">메뉴 3</a></li>
<li><a href="#">메뉴 4</a></li>
</ul>
...
- 특정 속성값이 있는 요소를 선택하는 [속성 = 속성값] 선택자
- 주어진 속성과 속성 값이 일치하는 요소를 찾아 스타일 적용
- 기본형
a[target = _blank] {...}
=> <a target="_blank">인 요소
<예제>
...
a[href="_blank"] { /* target 속성값이 _blank인 a요소를 선택하는 선택자 */
padding-right: 30px; /* 오른쪽에 패딩 지정 */
background: url(images/newindow.png) no-repeat center right; /* 배경 이미지 지정 */
}
</style>
...
<ul>
<li><a href="https://html.spec.whatwg.org" target="_blank">HTML</a></li>
<li><a href="https://www.w3.org/TR/selectors">CSS Selector Level 3</a></li>
<li><a href="https://www.w3.org/TR/css3-mediaqueries">미디어쿼리</a></li>
</ul>
...
- 여러 값 중에서 특정 속성값이 포함된 속성 요소를 선택하는 [속성 ~= 값] 선택자
- 여러 속성 값 중에 해당 값이 포함되어 있는 요소를 찾아 스타일 적용
<예시>
[class ~= button] {...}
=> class값 중에 button에 있는 요소
...
[class ~= "button"] {
box-shadow: rgba(0, 0, 0, 0.4) 4px 4px; /* 그림자 지정 */
border-radius: 5px; /* 모서리 둥글게 지정 */
}
</style>
...
<ul>
<li><a href="#" class="flat">메뉴 1</a></li>
<li><a href="#" class="flat">메뉴 2</a></li>
<li><a href="#" class="button">메뉴 3</a></li>
<li><a href="#" class="flat button" >메뉴 4</a></li>
</ul>
...
- 특정 속성값이 포함된 속성 요소를 선택하는 [속성 | = 값] 선택자
- 특정 값이 포함된 속성을 가진 요소를 찾아 스타일 적용
- 하이픈으로 연결해 한 단어 값을 이루는 요소에도 적용
<예시>
a[title |= us] {...}
...
a[title |= "us"] { /* 속성값이 "us"이거나 "us-"로 시작하는 요소를 찾는 선택자 */
background: url(images/us.png) no-repeat left center;
}
a[title |= "jap"] { /* 속성값이 "jap"이거나 "jap-"로 시작하는 요소를 찾는 선택자 */
background: url(images/jp.png) no-repeat left center;
}
a[title |= "chn"] { /* 속성값이 "chn"이거나 "chn-"로 시작하는 요소를 찾는 선택자 */
background: url(images/ch.png) no-repeat left center;
}
</style>
</head>
<body>
<ul>
<li>외국어 서비스 : </li>
<li><a href="#" title="us-english">영어</a></li>
<li><a href="#" title="ja">일본어</a></li>
<li><a href="#" title="chn">중국어</a></li>
</ul>
...
=> 일본어는 "ja"이기 때문에 속성값 "jap"랑 불일치해서 사진 첨부 안됨
- 특정 속성값으로 시작하는 속성 요소를 선택하는 [속성 ^= 값] 선택자
- 특정 값으로 시작하는 속성을 가진 요소를 찾아 스타일 적용
<예시>
a[title ^= eng] {...}
...
a[title ^="eng"] { /* 속성값이 "eng"로 시작하는 요소를 찾는 선택자 */
background: url(images/us.png) no-repeat left center;
padding: 5px 25px;
}
a[title ^="jap"] { /* 속성값이 "jap"로 시작하는 요소를 찾는 선택자 */
background: url(images/jp.png) no-repeat left center;
padding: 5px 25px;
}
a[title ^="chin"] { /* 속성값이 "chn"로 시작하는 요소를 찾는 선택자 */
background: url(images/ch.png) no-repeat left center;
padding: 5px 25px;
}
</style>
</head>
<body>
<ul>
<li>외국어 서비스 : </li>
<li><a href="#" title="english">영어</a></li>
<li><a href="#" title="japanese">일본어</a></li>
<li><a href="#" title="chinese">중국어</a></li>
</ul>
...
- 특정한 값으로 끝나는 속성의 요소를 선택하는 [속성 $= 값] 선택자
- 특정 값으로 끝나는 속성을 가진 요소를 찾아 스타일 적용
<예시>
[href $= xls] {...}
...
a[href$=hwp] { /* 연결한 파일의 확장자가 hwp인 링크 */
background: url(images/hwp_icon.gif) center right no-repeat; /* 배경으로 hwp 아이콘 표시 */
padding-right: 25px; /* 아이콘을 표시할 수 있도록 오른쪽에 25px 여백 */
}
a[href$=xls] { /* 연결한 파일의 확장자가 hwp인 링크 */
background: url(images/excel_icon.gif) center right no-repeat; /* 배경으로 hwp 아이콘 표시 */
padding-right: 25px; /* 아이콘을 표시할 수 있도록 오른쪽에 25px 여백 */
}
</style>
</head>
<body>
<h3>회사 소개 파일 다운 받기</h3>
<ul>
<li><a href="intro.hwp">hwp 파일</a></li>
<li><a href="intro.xls">엑셀 파일</a></li>
</ul>
...
- 일부 속성값이 일치하는 요소를 선택하는 [속성 *= 값] 선택자
- 값의 일부가 일치하는 속성을 가진 요소를 찾아 스타일 적용
<예시>
[href *= w3] {...}
...
a[href *= "w3"] { /* href 속성값 중에 w3가 있는 a 요소를 찾는 선택자 */
background:blue;
color:white;
}
</style>
</head>
<body>
<h1>HTML5 참고 사이트 </h1>
<p>(아래 링크 중 파란색 배경의 링크는 W3C 사이트로 연결됩니다.)</p>
<ul>
<li><a href="https://html.spec.whatwg.org/">HTML 표준안 사이트</a></li>
<li><a href="https://caniuse.com/">HTML 지원 여부 체크</a></li>
<li><a href="https://www.w3.org/TR/css3-mediaqueries">미디어쿼리</a></li>
</ul>
...
- 속성 선택자 정리
*가상 클래스와 가상 요소
- 사용자 동작에 반응하는 가상 클래스
- :link - 방문하지 않은 링크에 스타일 적용
- :visited - 방문한 링크에 스타일 적용
- :active - 웹 요소를 활성화했을 때의 스타일 적용
- :hover - 웹 요소에 마우스 커서를 올려놓을 때의 스타일 적용
- :focus - 웹 요소에 초점이 맞추어졌을 때의 스타일 적용
- 순서 : :link -> :visited -> :hover -> :active
<예시>
.navi ul li {
float:left;
width:150px;
padding:10px;
}
.navi a:link, .navi a:visited{ /* 방문한 링크와 방문하지 않은 링크 설정 */
display:block;
font-size:14px;
color:#000;
padding: 10px;
text-decoration: none; /* 밑줄 없앰 */
text-align: center;
}
.navi a:hover, .navi a:focus { /* 마우스 포인터를 올렸을 때와 초점을 맞췄을 때 설정 */
background-color:#222; /* 배경 색 짙은 회색*/
color:#fff; /* 글자 색 */
}
.navi a:active { /* 마우스 포인터로 클릭했을 때 지정 */
background-color:#f00; /* 배경색을 빨간색으로 변경 */
}
</style>
</head>
<body>
<div class="container">
<nav class="navi">
<ul>
<li><a href="#">이용 안내</a></li>
<li><a href="#">객실 소개</a></li>
<li><a href="#">예약 방법 및 요금</a></li>
<li><a href="#">예약하기</a></li>
</ul>
</nav>
=> 커서 올리기만 하면 검정색 / 클릭하면 잠깐 빨간색으로 반짝함
- 요소 상태에 따른 가상 클래스
- :target - 앵커로 연결된 부분에 스타일 적용
<예시>
...
#intro:target {
background-color:#0069e0; /* 배경색 - 파란색 */
color:#fff; /* 글자색 - 흰색 */
}
</style>
...
<body>
<div class="container">
<nav class="navi">
<ul>
<li><a href="#intro">이용 안내</a></li>
<li><a href="#room">객실 소개</a></li>
<li><a href="#reservation">예약 방법 및 요금</a></li>
<li><a href="ps-2.html">예약하기</a></li>
</ul>
</nav>
<div id="intro" class="contents">
<h2>이용 안내</h2>
...
</div>
<div id="room" class="contents">
<h2>객실 소개</h2>
...
</div>
<div id="reservation" class="contents">
<h2>예약 방법 및 요금</h2>
...
</div>
</body>
...
=> 상단 이용안내를 누르면 앵커 대상 스타일이 변경된다(배경이 파랑으로 바뀜)
- :enabled, :disabled - 요소의 사용 여부에 따라 스타일 적용
- :cheched - 라디오 버튼이나 체크 박스에 체크했을 때 스타일 적용
<예시>
...
#signup input:checked + label { /* input 요소에 checked 속성이 추가되었을 때 label 요소의 스타일 */
color:red; /* 글자색 */
font-weight:bold; /* 글자 굵게 */
}
</style>
...
<ul>
<li>
<input type="radio" name="room" id="basic">
<label for="basic">기본형(최대 2인)</label>
<li>
<li>
<input type="radio" name="room" id="family">
<label for="family">가족형(최대 8인)</label>
</li>
</ul>
...
- :not - 특정 요소를 제외하고 스타일 적용
=> 스타일을 적용하려는 필드보다 적용하지 않는 필드가 더 적을 때
<예시>
- 일반적으로 텍스트 필드 선택
...
#signup input[type=text], input[type=tel] {
border: 1px solid #ccc;
border-radius: 3px;
padding: 5px;
width: 200px;
}
...
- not 선택자로 라디오 필드를 제외한 텍스트 필드 선택
...
#signup input:not([type=radio]) {
border: 1px solid #ccc;
border-radius: 3px;
padding: 5px;
width: 200px;
}
...
- 구조 가상 클래스
- 웹 문서의 구조를 기준으로 특정 위치에 있는 요소를 찾아 스타일 적용
- 위치가 계속 바뀐다면 an+b 처럼 수식 사용 가능 (이 때 n 값은 0부터)
- 구조 가상 클래스의 선택자
종류 | 설명 |
:only-child | 부모 안에 자식 요소가 하나뿐일 때 자식 요소 선택 |
A:only-type-of | 부모 안에 A요소가 하나뿐일 때 선택 |
:first-child | 부모 안에 있는 모든 요소 중에서 첫 번째 자식 요소를 선택 |
:last-child | 부모 안에 있는 모든 요소 중 마지막 자식 요소를 선택 |
A:first-of-type | 부모 안에 있는 A요소 중에서 첫 번쨰 요소 선택 |
A:last-of-type | 부모 안에 있는 A요소 중에서 마지막 요소 선택 |
:nth-child(n) | 부모 안에 있는 모든 요소 중 n번째 자식 요소 선택 |
:nth-last-child(n) | 부모 안에 있는 모든 요소 중 끝에서 n번째 자식 요소 선택 |
A:nth-of-type(n) | 부모 안에 있는 A 요소 중에서 n번째 요소 선택 |
A:nth-last-of-type(n) | 부모 안에 있는 A요소 중 끝에서 n번째 요소 선택 |
<예시>
.contents :nth-child(3) {
background-color:#ffff00;
}
.contents p:nth-of-type(3) {
background-color:#00b900;
}
</style>
...
<div class="contents">
<h2>이용 안내</h2>
<p>Excepteur do ...</p>
<p>Qui magna culpa ...</p>
<h2>객실 소개</h2>
<p>Irure incididunt ...</p>
<h2>예약 방법 및 요금</h2>
<p>Fugiat aliquip... </p>
</div>
...
=> <div class="contents"> 태그 안에 <h2>, <p>, <p>, <h2>, <p>, <h2>, <p> 태그 순서대로 포함
=> 부모 요소는 contents
=> :nth-child(3)은 contents의 자식 중 3번째인 p 요소 선택
=> p:nth-of-type(3)은 contents의 p자식 요소 중 세번쨰 즉, <p>Irure incididunt ...</p> 요소에 스타일 적용됨
- 수식을 사용해 위치 지정
=> 반복되는 규칙이 있다면 an+b처럼 수식 이용이 가능(n값은 0부터)
- div 요소에서 세 번째 자식인 p 요소에 스타일 적용
div p:nth-child(3)
- div 요소에서 홀수 번째로 나타나는 자식인 p 요소에 스타일 적용
div p:nth-child(odd), div p:nth-child(2n+1)
- div 요소에서 짝수 번쨰로 나타나는 자식인 p 요소에 스타일 적용
div p:nth-child(even), div p:nth-child(2n)
<예시>
...
table tr:nth-of-type(2n+1) {
background: lightgray;
color: black;
}
</style>
...
- 가상 요소
- 화면 꾸미기용 요소를 웹 문서에 포함시키지 않기 위해 가상 요소 사용
- :first-line : 특정 요소의 첫번째 줄에 스타일 적용
- :first-letter : 특정 요소의 첫번째 글자에 스타일 적용
- :before : 특정 요소의 앞에 지정한 콘텐츠 추가
- :after : 특정 요소의 뒤에 지정한 콘텐츠 추가
<예시>
...
li.new::after {
content:"NEW!!";
font-size:x-small;
padding:2px 4px;
margin: 0 10px;
border-radius:2px;
background:#f00;
color:#fff;
}
</style>
</head>
<body>
<div class="container">
<h1>제품 목록</h1>
<ul>
<li class="new">제품 A</li>
<li>제품 B</li>
<li>제품 C</li>
<li class="new">제품 D</li>
</ul>
</div>
...
* 총정리