가상클래스 선택자(pseudo-Classes Selectors)

  말 그대로 가짜, 가상의 클래스 선택자를 의미한다.

  가상 클래스 선택자는 앞에 콜론( : )이 붙는다. 콜론이 붙는다고 해서 모두 가상 클래스 선택자라고 볼수는 없지만

  대체로 그렇다고 볼 수 있다.

  콜론이 두개가 붙는 경우( :: )도 있는데 이 경우 가상요소 선택자라고 부른다.

 

HOVER

  hover는 E에 마우스(포인터)가 올라가있는 동안에만 E를 선택한다. 흔히 마우스오버라고 부르는 것과 같다.

  사용은 e:hover { } 형태로 사용한다.

 

<div class="box">

</div>



<!-- CSS -->
.box{
  width: 100px;
  height: 100px;
  background-color: red;
  transition: 0.4s;
}

.box:hover{
  width: 200px;
  background-color: yellowgreen;
}

 이렇게 작성하고 생성된 네모난 박스 모양 위에 마우스 포인터를 올리면 박스가 가로로 늘어나며 색이 변하는것을

  확인할 수 있다.

  transition 속성을 사용하는 경우도 있는데 transition: 0.4s  이런 형태로 사용하면 좀 더 부드럽게 변하는것을 

  확인할 수 있다. 시간을 의미하며 변하는 시간을 0.4초로 설정하는 것이다.

  transition을 지우고 확인해보면 그냥 바로 바뀌는 것을 확인할 수 있다.

 

ACTIVE

  active는 E를 마우스로 클릭하는 동안에만 E를 선택한다.

  e:active { } 형태로 사용한다.

  active의 경우도 transition을 사용해 좀 더 움직임을 줄 수 있으며 클릭한 상태에서만 변화가 생긴다.

  마우스 버튼을 누르고 있을때만 변화가 생기고 손을 떼면 다시 돌아온다.

<div class="box">

</div>


<!-- CSS -->
.box {
  width: 100px;
  height: 100px;
  background-color: red;
  transition: 0.4s;
}

.box:active {
  width: 200px;
  background-color: yellowgreen;
}

  생성된 박스를 클릭하면 박스가 늘어나며 색이 변하는것을 확인할 수 있고 마우스 버튼에서 손을 떼면 다시

  돌아오는것을 확인할 수 있다.

 

FOCUS

  focus는 e가 포커스 된 동안에만 e를 선택한다.

  포커스는 아무데나 사용가능한것이 아닌 대화형 콘텐츠에서 사용이 가능하다.

  로그인이나 회원가입시에 입력하는 창을 클릭하여 커서를 이동시켜준 상태가 포커스 된 상태라고 볼 수 있다.

  input, img, tabindex에서 사용이 가능하다.

  input 태그를 만들어주고 focus로 설정을 잡아준다면 input에 포커스가 잡힐때마다 변경된다.

 

<input type="text">



<!-- CSS -->
input {
  width: 100px;
  outline: none;
  border: 1px solid;
  padding: 5px 10px;
  transition: 0.4s;
}

.input:focus{
  width:200px;
  border-color: red;
}

  마우스로 input위치에 포커스를 잡게 되면 사이즈가 늘어나면서 테두리 색이 빨간색으로 변하는 것을 확인할수 있다.

 

  hover, active, focus 처럼 사용자가 동작을 했을 때 변화되는 가상 클래스는 이 세가지가 전부라고 볼 수 있다.

  이러한 이벤트 기능은 JavaScript가 더 효과적으로 사용할 수 있다.

 

  선택자는 기본적으로 이벤트라는 개념과는 차이가 있는데 hover, active, focus는 그 중에서 이벤트와 비슷하다고

  볼 수 있는 선택자들이다.

 

FIRST CHILD

  first-child는 e가 형제 요소 중 첫번재 요소라면 선택한다.

  E:first-child { } 형태로 사용한다.

<ul class="ul1">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>

<ul class="ul2">
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
</ul>


<!-- CSS -->
.ul1 li:first-child {
  color: red;
}

  이렇게 작성하게 되면 제일 위에 있는 li태그인 1의 색이 빨갛게 변한다.

  .ul1 li:first-child로 작성했기 때문에 클래스명이 ul1인 태그내에 있는 li태그에만 적용이 된다.

 

LAST CHILD

  last-child는 first-child와 반대로 마지막 요소를 찾는다.

<ul class="ul1">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>

<ul class="ul2">
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
</ul>


<!-- CSS -->
.ul1 li:last-child {
  color: red;
}

  이렇게 작성하게 되면 ul1 클래스인 ul태그 안에 있는 li태그들 중 가장 마지막에 있는 4만 빨갛게 변한다.

 

NTH CHILD

  nth-child는 e가 형제요소중 n번째 요소라면 선택한다. n키워드를 사용하게 되면 시작은 0부터 해석한다.

  e:nth-child(n) { } 형태로 사용된다.

 

<ul class="number">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
</ul>


<!-- CSS -->
.number li:nth-child(2) {
  color: red;
}

  이렇게 작성하게 되면 2번째 li태그인 2가 빨갛게 변한다.

  

  n이 0부터 시작하는 것이라고 했는데 배열처럼 첫번째 li가 0, 두번째 li가 1 이런 형태가 아니고

  n이라는 키워드 자체가 0부터 시작이다.

 

<ul class="number">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
</ul>


<!-- CSS -->
.number li:nth-child(2n) {
  color: red;
}

  이렇게 작성하게 되면 

  이러한 결과를 볼 수 있다.

  제일 먼저 2 * 0 = 0 이므로 0에 해당하는것이 없이 아무 요소에도 적용되지 않는다.

  그리고 2 * 1 = 2 니까 두번째 li태그인 2에 적용이 되고 그 뒤로 쭉쭉 n이 증가해 4, 6, 8에 적용이 된다.

  n을 사용하면 0부터 시작해서 계속 하나씩 증가해 나간다고 생각하면 될듯 하다.

<ul class="number">
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
</ul>


<!-- CSS -->
.number li:nth-child(n + 3) {
  color: red;
}

  하나 더 보자면 n + 3은 0 + 3이 시작이므로 3번째 li부터 적용되기 시작해 n이 1씩 증가하면서 

  4, 5, 6, 7, 8, 9까지 모두 적용되게 되므로 다음과 같은 결과가 나온다.

  데이터를 쭉 불러오는데 특정 번호 아래로 적용하고 싶으나 총 몇개가 될지 모른다는 가정하에 사용하기 좋을 것 같다.

 

  nth-child에서의 유의사항은 요소가 일치해야 적용이 된다는 점이다.

<div class="number">
  <div>1</div>
  <p>2</p>
  <p>3</p>
  <span>4</span>
</div>


<!-- CSS -->
.number p:nth-child(1) {
  color: red;
}

  이렇게 작성하게 되면 p태그중 첫번째인 2에 적용이 되지 않는다.

  제일 첫 요소에 적용되는 것이기 때문에 div요소를 찾아가게되는데 p가 아닌 div이므로 적용이 되지 않게 된다.

 

  만약 여러 태그가 섞여있는데 그 중에서 p태그에만 적용을 하고 싶다면

<div class="number">
  <div>1</div>
  <p>2</p>
  <p>3</p>
  <span>4</span>
  <p>5</p>
  <p>6</p>
</div>


<!-- CSS -->
.number p:nth-child(n + 1) {
  color: red;
}

  이렇게 작성해주면 p태그에만 적용이 된다.

 

  다른 주의사항으로는 first-child에도 같이 주의해야 하는 사항인데

<div class="number">
  <div>1</div>
  <div>2</div>
  <div>3
    <div>3-1</div>
    <div>3-2</div>
    <div>3-3</div>
  </div>
</div>


<!-- CSS -->
.number div:nth-child(1){
  color: red;
}

  이렇게 작성하면 1에만 적용이 될것 같지만 3-1에도 적용이 된다.

  nth-child(1) 이나 first-child나 첫번째 자식요소만을 선택하는 것이 아닌 같은 라인의 하위 요소 중 첫번째 요소 역시

  선택하기 때문이다.

  즉, number라는 클래스를 갖고있는 요소의 하위 요소인 1, 2, 3중에서 첫번째 요소인 1을 선택했는데

  3이 하위요소들을 또 갖고 있는것을 확인하고 3-1, 3-2, 3-3 중에서 첫번째 요소를 또 선택한다는 것이다.

  

  그래서 이러한 경우를 방지하기 위해 자식선택자인 >를 사용해야 한다.

  자식선택자가 없는 경우는 계속 내려가며 체크하겠다는 의미이다.

<div class="number">
  <div>1</div>
  <div>2</div>
  <div>3
    <div>3-1</div>
    <div>3-2</div>
    <div>3-3</div>
  </div>
</div>


<!-- CSS -->
.number > div:nth-child(1){
  color: red;
}


.number > div:first-child(1){
  color: red;
}

  이렇게 변경해주게 되면 number의 바로 아래 하위요소중 첫번째인 1에만 적용이 된다.

 

  만약 하위 요소들 중 단계와 상관없이 선택을 해야 하는 상황인데 태그가 다른 상황이라면 선택자를 없애야 한다.

<div class="number">
  <div>1</div>
  <div>2</div>
  <div>3
    <p>3-1</p>
    <p>3-2</p>
    <p>3-3</p>
  </div>
</div>


<!-- CSS -->
.number div:nth-child(1){
  color: red;
}

  이렇게 작성하게 되면 div태그인 1에만 적용이 되지만 3-1에도 적용이 되게 해야 한다면

<div class="number">
  <div>1</div>
  <div>2</div>
  <div>3
    <p>3-1</p>
    <p>3-2</p>
    <p>3-3</p>
  </div>
</div>


<!-- CSS -->
.number :nth-child(1){
  color: red;
}

  이렇게 작성해주면 된다.

  그럼 태그가 다른 3의 하위요소인 p에도 적용이 된다.

 

NTH OF TYPE

  nth-of-type은 e의 타입(태그이름)과 동일한 타입인 형제요소 중 e가 n번째 요소라면 선택한다.

  이것 역시 n의 경우는 0부터 시작한다.

  e:nth-of-type(n) { } 형태로 사용한다.

<div class="number">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <p>3-1</p>
  <p>3-2</p>
  <p>3-3</p>
</div>


<!-- CSS -->
.number p:nth-of-type(1){
  color: red;
}

  이렇게 작성하게 되면 p가 number의 첫번째 하위요소가 아니더라도 p태그들중 첫번째 요소인 3-1을 찾아

  적용하게 된다.

  태그를 찾는 용도로만 사용되고 클래스로 찾는것은 불가능하다.

 

부정선택자(Negation selector)

  부정선택자는 S가 아닌 E를 선택한다.

  e:not(s) { } 이런 형태로 사용한다.

<div class="number">
  <div class="a">1</div>
  <li class="b">2</li>
  <li class="c">3</li>
  <li class="d">4</li>
  <div class="e">5</div>
</div>


<!-- CSS -->
.number li:not(.b){
  color: red;
}

  이렇게 작성하면 b라는 class를 갖고 있는 2를 제외한 나머지 li태그에 적용된다.

  여기서도 역시 선택자를 제거하면 태그에 상관없이 전체 적용이 된다.

 

 

 

레퍼런스

패스트캠퍼스 올인원패키지 - CSS

'HTML&CSS' 카테고리의 다른 글

CSS 선택자(Selector)  (0) 2021.04.08
CSS란?  (0) 2021.04.07
HTML(Hyper Text Markup Language)  (0) 2021.04.06

+ Recent posts