CSS 선택자

페이지에 가득한 요소들과 적용하려는 스타일 세트가 있지만, 색상이나 폰트는 어떤 요소에 속하는지 말할 수 있을 때까지 쓸모가 없습니다. 선택자는 올바른 요소들을 가리키는 방법입니다: 이 단락, 모든 버튼, nav 안의 링크들만. 선택자에 익숙해지면 이미 요소에 도달하는 방법을 알고 있기 때문에 CSS의 나머지는 무엇을 변경할지 선택하는 문제가 됩니다.
유형, 클래스, id 선택자
CSS 규칙에는 두 부분이 있습니다: 어떤 요소를 스타일링할지 선택하는 **선택자**와 어떻게 할지 말하는 선언 블록. 가장 간단한 선택자는 요소의 이름이며, 유형 선택자라고 불립니다. p를 쓰면 페이지의 모든 단락이 스타일링됩니다.
이는 종종 너무 광범위합니다. 일반적으로 모든 단락이 같은 모양이길 원하지 않습니다. 그래서 HTML class 속성을 사용하여 요소에 클래스라는 레이블을 지정하고, CSS에서 앞에 점을 붙여서 그 레이블을 대상으로 합니다. 클래스를 이름표처럼 생각하세요: 그룹처럼 취급하려는 모든 요소에 같은 태그를 붙인 다음 한 번에 스타일링합니다.
<button class="btn-primary">가입하기</button>
<button class="btn-primary">지금 구매</button>/* 유형 선택자: 페이지의 모든 버튼 */
button {
font-family: inherit;
}
/* 클래스 선택자: btn-primary로 태그된 요소만 */
.btn-primary {
background: rebeccapurple;
color: white;
}두 버튼 모두 하나의 규칙에서 .btn-primary 스타일링을 픽업합니다. 클래스를 공유하기 때문입니다. 이 재사용이 클래스가 당신이 도달하는 도구인 전체 이유입니다. 이는 CSS가 작동하는 방식에서 직접 구축되며, 여기서 각 규칙은 선택자를 선언 세트와 쌍을 이룹니다.
p와 같은 유형 선택자는 그 종류의 모든 요소에 영향을 주며, 이는 보통 당신이 원하는 것보다 많습니다. 클래스는 당신이 신경 쓰는 요소에 붙이는 이름표이고 .btn-primary처럼 점으로 스타일링합니다. 거의 모든 것에 클래스를 사용하면 크게 잘못되지 않습니다. 결합자: 관계로 선택하기
때로는 다른 요소 안에 앉아 있을 때만 요소를 스타일링하고 싶습니다. 네비게이션의 링크는 단락의 링크와 다르게 보여야 하지만, 둘 다 <a> 요소입니다. 당신은 **결합자**로 그 관계를 설명합니다: 두 선택자를 공백으로 나란히 놓으면 CSS는 "두 번째 것이지만, 첫 번째 것 안에만"으로 읽습니다.
따라서 .nav a는 "클래스 nav를 가진 요소 안의 모든 링크"를 의미합니다. 공백이 실제 작업을 하고 있습니다. 장식이 아니라, 안을 들여다보라는 지시입니다.
/* 하강: nav 안의 모든 링크 */
.nav a {
text-decoration: none;
}
/* 자식: .menu의 직접 자식인 목록 항목만 */
.menu > li {
display: inline-block;
}첫 번째 규칙은 nav 안에 중첩된 모든 링크에 도달하고, 두 번째는 메뉴의 최상위 항목만 도달하고 중첩된 목록은 그대로 둡니다. 그들 사이에서 선택하는 것은 규칙이 얼마나 깊이 이동하길 원하는지 선택하는 것입니다.
.nav a는 nav 안에 앉아 있는 링크를 스타일링합니다. 그 공백은 모양을 위한 간격이 아닌 지시이므로 실수로 떨어뜨리지 마세요. 이 패턴 하나가 매일의 스타일링의 많은 부분을 다룹니다. 의사 클래스: 상태로 스타일링하기
요소는 다른 상태에 있을 수 있습니다. 링크는 정적이거나 마우스가 위에 떠있을 수 있습니다. **의사 클래스**는 요소의 상태에 따라 스타일링하도록 하며, 선택자 뒤에 단일 콜론으로 작성됩니다.
먼저 사용할 것은 :hover입니다. .btn-primary:hover를 쓰면 포인터가 버튼 위에 있을 때만 스타일이 적용되며, 이것이 버튼과 링크가 당신이 그들을 가리킬 때 작은 시각적 반응을 주는 방법입니다.
.btn-primary:hover {
background: purple;
}
/* 키보드 사용자는 눈에 띄는 초점 표시기가 필요합니다 */
.btn-primary:focus-visible {
outline: 2px solid rebeccapurple;
outline-offset: 2px;
}첫 번째 규칙은 포인터가 버튼 위에 있을 때 발동합니다; 두 번째는 버튼이 키보드로 선택되었을 때 명확한 고리를 그리며, 이것이 마우스 없이 페이지를 사용 가능하게 유지하는 것입니다. 색상 및 윤곽 선택은 여기서 CSS가 작동하는 방식과 모든 속성에 설정하는 값과 연결됩니다.
:hover는 포인터가 위에 있을 때입니다. 이것이 버튼의 호버 효과가 나오는 곳입니다. 선택자에 바로 붙이며, 사이에 공백이 없습니다. 의사 요소: 요소의 일부 스타일링
의사 클래스는 특정 상태에서 전체 요소를 스타일링합니다. **의사 요소**는 다릅니다: 이는 요소의 일부를 스타일링하거나, 당신의 HTML에 전혀 없는 작은 콘텐츠 조각을 추가하도록 합니다.
먼저 만날 두 개는 ::before와 ::after입니다. 이들은 요소의 시작이나 끝에 콘텐츠를 삽입하고, content 속성으로 삽입할 내용을 말합니다. 두 개의 콜론을 주목하세요: 이 이중 콜론은 CSS가 의사 요소를 의사 클래스와 구별하는 방법입니다.
/* 모든 nav 링크 뒤에 장식 화살표 추가 */
.nav a::after {
content: " →";
color: rebeccapurple;
}
/* 검색 상자 안의 힌트 텍스트 스타일링 */
.search-input::placeholder {
color: grey;
font-style: italic;
}::after 규칙은 HTML이 아닌 스타일링에만 존재하는 화살표를 삽입하고, ::placeholder는 입력 안을 도달하여 브라우저가 당신을 위해 그리는 텍스트를 스타일링합니다. 둘 다 일반 선택자로 달리 도달할 수 없는 것을 스타일링합니다. 힌트 텍스트와 레이블을 스타일링하려면, 타이포그래피 장이 텍스트 측면에서 더 깊이 있습니다.
::before와 ::after처럼 두 개의 콜론을 사용합니다. 이 둘은 표시되려면 content 속성이 필요합니다. 이중 콜론은 의사 요소를 의사 클래스와 구별하는 빠른 방법입니다. 명시도: 어떤 규칙이 이기는가
곧 두 규칙이 같은 요소를 다른 방식으로 스타일링하려고 시도할 것입니다. 하나는 텍스트가 파란색이라고 말하고, 다른 하나는 빨간색입니다. 브라우저가 하나를 선택해야 하고, 결정하는 방식을 **명시도**라고 합니다: 더 구체적인 선택자가 이깁니다.
단축 버전은 강도의 순서입니다. id 선택자는 클래스 선택자를 이기고, 클래스 선택자는 유형 선택자를 이깁니다. 따라서 #header와 .title 모두 같은 요소에 색상을 설정하면, id가 이깁니다. 두 규칙이 동일하게 명시일 때, 파일에서 나중에 쓰인 규칙이 이깁니다.
/* 유형 선택자, 명시도 (0, 0, 1) */
p {
color: grey;
}
/* 클래스 선택자, 명시도 (0, 1, 0): 이 규칙이 이깁니다 */
.intro {
color: black;
}<p class="intro">이 단락은 검은색입니다. 클래스 규칙이 유형 규칙을 능가하기 때문입니다.</p>둘 다 단락을 대상으로 하고 color를 설정하지만, 클래스 선택자가 유형 선택자보다 더 구체적이므로 단락은 검은색입니다. 한 선택자를 명시도 사다리 위나 아래로 밀어내는 것은 종종 무거운 도구에 의존하지 않고 충돌을 정산하기 위해 필요한 모든 것입니다. 박스 모델 장은 간격 규칙이 충돌할 때 같은 캐스케이드에 들어갑니다.

