Korean_hamster
지현의 개발자 성장과정
Korean_hamster
전체 방문자
오늘
어제
  • 분류 전체보기 (122)
    • Front-End Developer (79)
      • Project (12)
      • HTML (8)
      • CSS (17)
      • Computer Science (9)
      • JavaScript (20)
      • React (13)
    • 이런저런 생각 (7)
    • 주간 성장회고 (24)
    • English (0)
    • 리뷰 (2)
    • Books (5)

블로그 메뉴

  • 방명록

공지사항

인기 글

태그

  • 멋쟁이사자처럼
  • 비전공개발자
  • HTML
  • 리액트
  • 면접관님
  • sass
  • CS
  • js
  • CSS
  • 깃
  • 멋사
  • fetch
  • AtomicHabits
  • 반응형웹
  • 프론트앤드스쿨
  • 깃헙
  • flex
  • 라우터
  • 비전공자개발자
  • 프론트앤드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Korean_hamster

지현의 개발자 성장과정

헷갈리는 CSS Combinators - 형제선택자 편
Front-End Developer/CSS

헷갈리는 CSS Combinators - 형제선택자 편

2022. 4. 21. 01:15

매번 헷갈리지만 그냥저냥 넘어갔던 선택자들을 정리하려 한다.

실무적인 측면에서도 이런 선택자들을 활용해 CSS적인 문제를 해결해줄 수 있는 팁들이 많으니 꼭 알아두도록 하자.

 

예제 

핵심: div를 제외한 h1, h2, h3, h4 그리고 ul은 모두 형제요소이다. 

 <body>
    <div>
      <h1>나는야 h1</h1>
      <ul>
        <li>짬뽕</li>
        <li>탕수육</li>
        <li>피자</li>
      </ul>
      <h2>나는야 h2</h2>
      <ul>
        <li>사과</li>
        <li>딸기</li>
        <li>배</li>
      </ul>
      <h3>나는야 h3</h3>
      <ul>
        <li>광주</li>
        <li>서울</li>
        <li>부산</li>
      </ul>
      <h4>나는야 h4</h4>
      <ul>
        <li>자전거</li>
        <li>버스</li>
        <li>지하철</li>
      </ul>
    </div>
  </body>

 


형제 선택자, 무슨말이야?

 

아래 선택자는 뭘 선택하고 있을까?

      h1 + ul {
        background-color: yellow;
      }

 = 너가 ul인데, 너 바로 앞 형제가 h1야? 라는 의미다.

(ul이면서, 바로 앞에 형제요소로 h1을 가지고 있는)

 

바로 앞 형제요소인 h1을 가지고있는 ul이 선택된 것을 볼 수 있다.

 

밑에서는는 실전처럼 ul에 class를 주었다.

이제 아래 선택자를 통해 백그라운드 색깔을 핑크색으로 바꿔보자!

<h1>나는야 h1</h1>
<ul class="parent">
  <li>짬뽕</li>
  <li>탕수육</li>
  <li>피자</li>
</ul>​
.parent li + li {
  background-color: pink;
}

이게 의미하는 바는 뭘까?

= .parent 안에 들어있으면서, 니가 li인데 니 바로앞에 형제가 li이야?

class명으로 parent를 가지고 있는 ul 안에서, 바로 앞 형제 요소로 li를 가지고 있는 li를 선택하는 것이다.

첫번 째 li는 바로 앞 형제요소로 li이가 있나? 없다! h1이 있을 뿐이다.

그렇기 때문에 첫번째 li는 선택되지 않았고, 자기 바로 앞에 형제속성으로 li를 가지고 있는 두 번 째, 세 번 째 li들이 선택된 것을 볼 수 있다.

 


이제는  div 안에있는 li중 바로 앞 형제선택자로 li를 가지고 있는 요소를 다 선택해보면

div li + li {
  background-color: pink;
}

이런 결과를 볼 수 있다. 모든 div 안에서 li를 바로 앞 형제요소로 가지고있는 li들을 선택했으니까@

 

 


실무에서 사용할 수 있는 꿀팁 (중요)

 

보통 이런 상황에서 박스 1부터 5까지 일정한 간격을 주고싶을 때,

 

우리는 보통

  1. 각각의 요소를 공통적으로 선택해 margin:bottom을 주는데
  2. 가장 마지막에 위치한 요소는 그 아래 이미 위치한 패딩이나 다른 공간과 합쳐져버리기 때문에 빈 공간이 상대적으로 커져버려서
  3. 이를 해결하기 위해 부모요소에 nth:child속성을 넣어 마지막 요소만 따로 선택하고 margin-bottom: none 값을 적용해줬다.

이렇게 5번 밑 공간만 원래있던 패딩과 합쳐져 더 커져버렸다.

 

하지만 여기서 형제선택자를 적용하면 아주 깔끔하게 간격을 줄 수 있다.

그냥 자기 앞에 형제선택자로 li를 가지고 있는 li를 선택해서 margin-top을 주면 되는것이다.

(현재 예제에서는 li를 사용했지만 block level 요소라면 뭐든지 상관없다)

 

첫번째에 위치한 li는 바로 앞에 형제선택자로 또다론 li가 없기 때문에 (자신이 맨 첫번째이기 때문에) 선택이 되지 않고, 그 뒤에 따라오는 li들만 선택되어 margin-top이 먹혔다. 

      li + li {
        margin-top: 20px;
      }

아주 깔끔하다! 

저작자표시

'Front-End Developer > CSS' 카테고리의 다른 글

가지고 놀면서 배우는 position: absolute;  (3) 2022.04.25
Sass 연습 - @function 와 @return  (0) 2022.04.25
background-image에 no-repeat이 안되요 - 초심자의 깜찍한 실수  (0) 2022.04.19
항상 헷갈리는 text-align, 딱 두 가지만 기억하자  (4) 2022.04.19
알아두면 너무 유용한 네거티브 마진  (4) 2022.04.18
    Korean_hamster
    Korean_hamster
    Keep pushing myself to the limits

    티스토리툴바