Menu

CSS 클래스 선택자와 ID 선택자 (.class와 #id)

클래스 선택자(.name)는 그 클래스를 가진 모든 요소를, ID 선택자(#name)는 그 id를 가진 요소 하나를 꾸며요. 문법, 여러 클래스와 연결한 클래스, 클래스와 id의 차이, 이름 규칙, JavaScript로 클래스 토글하기를 알아봐요.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

클래스 선택자

클래스 선택자는 점 뒤에 클래스 이름을 붙인 거예요. 요소 종류와 상관없이 class 속성에 그 이름이 들어 있는 모든 요소를 꾸며요.

점은 CSS에만 나와요. HTML에서 속성은 점 없이 class="badge"예요. 클래스 이름은 대소문자를 구분해요. .Badge는 class="badge"와 일치하지 않아요.

한 요소에 여러 클래스

요소는 공백으로 구분해서 클래스를 몇 개든 가질 수 있어요. 각 클래스가 자기 규칙을 가져오기 때문에 작은 조각을 조합해서 변형을 만들 수 있어요.

공백 없는 .btn.danger는 두 클래스를 모두 가진 요소와 일치해요. 마지막 span은 danger는 있지만 btn이 없어서 연결한 규칙이 건너뛰어요.

클래스 선택자 변형

선택자일치하는 것
.note클래스가 note인 모든 요소
p.note클래스가 note인 <p> 요소만
.btn.primarybtn과 primary를 모두 가진 요소
.card .title.card 안 어딘가의 .title
.card > .title부모가 .card인 .title
.a, .ba 또는 b를 가진 요소

공백이 있을 때와 없을 때의 차이는 다른 결합자와 함께 CSS 선택자 페이지에서 다뤄요.

ID 선택자

ID 선택자는 해시 뒤에 id를 붙인 거예요. #site-header는 id="site-header"인 요소를 꾸며요. id는 페이지에서 유일해야 하니 ID 선택자는 정확히 요소 하나를 대상으로 해요.

id는 꾸미는 것 말고도 역할이 있어요. href="#details"는 그 요소로 스크롤하고, <label for="email">은 입력 요소의 id를 가리키고, JavaScript는 document.getElementById('details')로 찾아요. 요소에 id를 주는 흔한 이유가 이거예요. 꾸미는 데는 클래스가 더 좋은 도구예요.

클래스와 ID 비교

클래스 .nameID #name
페이지당여러 요소요소 하나
요소당여러 개, 공백으로 구분하나
명시도(0,1,0)(1,0,0)
링크 대상 (URL의 #name)안 돼요돼요
어울리는 용도스타일링앵커, label, JavaScript 연결

명시도 차이가 클래스로 꾸며야 하는 실질적인 이유예요. ID 하나가 클래스 몇 개보다도 이기기 때문에, ID로 쓴 규칙은 다른 ID, 인라인 스타일, !important로만 덮어쓸 수 있어요.

JavaScript로 클래스 추가하고 제거하기

JavaScript가 모양을 바꾸는 보통의 방법은 클래스예요. CSS가 상태를 정의하고, 스크립트는 상태만 전환해요.

classList에는 add, remove, contains, replace도 있어요. className에 직접 값을 넣는 건 피하세요. 요소가 가진 모든 클래스를 바꿔 버려요.

클래스 이름 짓기

  • 글자, 숫자, 하이픈, 밑줄은 안전해요. card, card-title, card__title, is-open.
  • 선택자를 숫자나 하이픈 뒤 숫자로 시작하지 마세요. .2col은 잘못된 CSS예요. 글자로 시작하거나(.cols-2) 숫자를 이스케이프하세요(.\32 col).
  • 모양이 아니라 목적으로 이름을 지으세요. .error는 디자인을 바꿔도 살아남지만 .red-text는 그렇지 않아요.
  • 큰 프로젝트에서는 이름 규칙이 도움이 돼요. BEM은 block__element--modifier처럼 써요. 예를 들면 .card__title--large예요.

자주 하는 실수

  • HTML에 점 넣기. class=".badge"는 .badge와 절대 일치하지 않아요.
  • class 속성 두 개. <p class="a" class="b">는 a만 남아요. class="a b"를 쓰세요.
  • 두 클래스를 뜻했는데 공백 넣기. .btn .primary는 안쪽 요소를 찾고, .btn.primary는 같은 요소예요.
  • id 재사용. 중복된 id는 CSS가 동작하는 것처럼 보여도 getElementById, 앵커 링크, label 연결을 망가뜨려요.
  • 모든 것을 id로 꾸미기. 명시도 때문에 나중에 덮어쓰기가 괴로워져요. 클래스를 쓰세요.

자주 묻는 질문

CSS에서 클래스는 어떻게 선택하나요?

점 뒤에 클래스 이름을 적어요. .card { ... }는 class="card"인 모든 요소를 꾸며요. 점은 CSS에만 쓰고, HTML 속성에는 점이 없어요.

CSS에서 클래스와 id는 무엇이 다른가요?

클래스는 몇 개의 요소에든 쓸 수 있고 한 요소가 여러 개를 가질 수 있어요. id는 페이지에서 유일해야 하고 한 요소는 최대 하나만 가져요. CSS에서 #id는 .class보다 명시도가 훨씬 높아서 ID 규칙은 덮어쓰기 어려워요.

요소에 클래스 두 개는 어떻게 주나요?

속성 하나에 이름을 공백으로 구분해서 적어요. class="btn primary" 요소에 class를 두 번 쓰면 동작하지 않아요. 브라우저는 첫 번째 속성만 남겨요.

클래스 두 개를 모두 가진 요소는 어떻게 선택하나요?

클래스 선택자를 공백 없이 이어 써요. .btn.primary는 두 클래스를 모두 가진 요소와 일치해요. 공백이 있는 .btn .primary는 .btn 요소 안에 있는 .primary 요소라는 뜻이에요.

CSS 클래스 이름을 숫자로 시작할 수 있나요?

HTML에서는 되지만, 선택자는 이스케이프하지 않은 숫자로 시작할 수 없어서 .1col은 잘못된 CSS예요. 숫자를 이스케이프하거나(.\31 col), 더 좋은 방법으로 클래스 이름을 글자로 시작하세요.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기