본문으둜 κ±΄λ„ˆλ›°κΈ°

μ„ νƒμž(Selector) - 2편

❗️ ν•΄λ‹Ή 글은 패슀트캠퍼슀 - ν”„λ‘ νŠΈμ—”λ“œ 개발 κ°•μ˜μ—μ„œ HTML & CSS, SASS(SCSS) Part의 λ°•μ˜μ›… κ°•μ‚¬λ‹˜μ˜ κ°•μ˜μžλ£Œλ₯Ό μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€.

가상 클래슀 μ„ νƒμž(Pseudo-Classes Selectors)#

Hover#

μš”μ†Œμ— 마우슀(포인터)κ°€ μ˜¬λΌκ°€ μžˆλŠ” λ™μ•ˆμ—λ§Œ 선택

a:hover {    font-weight: bold;    font-size: 20px;}
<a href="<https://google.com>">Google!</a>

Active#

μš”μ†Œλ₯Ό 마우슀둜 ν΄λ¦­ν•˜λŠ” λ™μ•ˆμ—λ§Œ 선택

.box {    width: 100px;    height: 100px;    background: tomato;}.box:active {    background: yellowgreen;}
<div class="box"></div>

Focus#

μš”μ†Œκ°€ 포컀슀 된 λ™μ•ˆμ—λ§Œ 선택

λŒ€ν™”ν˜• μ½˜ν…μΈ μ—μ„œ μ‚¬μš© κ°€λŠ₯, input ...

input:focus {    border-color: red;    width: 200px;}
<input type="text" />

hover, active, focusλŠ” μ„ νƒμžμ΄μ§€λ§Œ JSμ—μ„œμ˜ 이벀트 κ°œλ…κ³Ό ν—·κ°ˆλ¦΄ μ†Œμ§€κ°€ μžˆλ‹€. (? 아직 λͺ¨λ₯΄λŠ” λ‚΄μš©)


First child#

ν˜•μ œ μš”μ†Œ 쀑 첫번째 μš”μ†ŒμΈ λͺ¨λ“  μš”μ†Œ μ€‘μ—μ„œ 선택

.fruits li:first-child {    color: red;}
<ul class="fruits">    <li>λ”ΈκΈ°</li>    <!--선택-->    <li>사과</li>    <li>μ˜€λ Œμ§€</li>    <li>망고</li></ul>

Last child#

ν˜•μ œ μš”μ†Œ 쀑 λ§ˆμ§€λ§‰ μš”μ†ŒμΈ λͺ¨λ“  μš”μ†Œ μ€‘μ—μ„œ 선택

.fruits li:last-child {    color: red;}
<ul class="fruits">    <li>λ”ΈκΈ°</li>    <li>사과</li>    <li>μ˜€λ Œμ§€</li>    <li>망고</li>    <!--선택--></ul>

N-th child#

ν˜•μ œ μš”μ†Œ 쀑 n번째 μš”μ†ŒμΈ λͺ¨λ“  μš”μ†Œ μ€‘μ—μ„œ 선택( n ν‚€μ›Œλ“œ μ‚¬μš©μ‹œ 0λΆ€ν„° 해석 (Zero-base))

  • n ν‚€μ›Œλ“œ λ―Έμ‚¬μš©μ‹œ

    .fruits li:nth-child(2) {    color: red;}
    <ul class="fruits">    <li>λ”ΈκΈ°</li>    <li>사과</li>    <!--선택-->    <li>μ˜€λ Œμ§€</li>    <li>망고</li></ul>
  • n ν‚€μ›Œλ“œ μ‚¬μš©μ‹œ

    .fruits li:nth-child(n + 3) {    color: red;}/* n은 0λΆ€ν„° μ‹œμž‘μ΄λ―€λ‘œ 3μ΄μƒμ˜ λͺ¨λ“  μš”μ†Œ */
    <ul class="fruits">    <li>λ”ΈκΈ°</li>    <li>사과</li>    <li>μ˜€λ Œμ§€</li>    <!--선택-->    <li>망고</li>    <!--선택--></ul>

:xxx-child μœ μ˜μ‚¬ν•­ :

  • p:nth-child(1) 인 경우 - p 인 νƒœκ·Έ μ€‘μ—μ„œ ν˜•μ œ μš”μ†Œ 쀑 첫 번째 μš”μ†ŒμΈ κ²ƒμ΄μ•„λ‹ˆλΌ ν˜•μ œ μš”μ†Œ 쀑 첫 번째 μš”μ†Œκ°€ p νƒœκ·Έμ΄λ©΄ μ„ νƒμœΌλ‘œ ν•΄μ„λ˜λŠ” 것 β†’ μ „μžμ˜μ„€λͺ…은 nth-of-type μ°Έμ‘° - κΈ°λ³Έ, 후손, μžμ‹ μ„ νƒμžμ™€μ˜ ν˜Όν•© μ‚¬μš©μ‹œ μ£Όμ˜μš”ν•¨.

  • .fruits :nth-child(1) 인 경우 - class="fruits" 인 μš”μ†Œμ˜ 후손 쀑, ν˜•μ œ μš”μ†Œ 쀑 첫 번째인 μš”μ†ŒλŠ” λͺ¨λ‘ 선택됨.


N-th of type#

ν˜•μ œ μš”μ†Œ 쀑 νƒ€μž…(tag)의 n번째 μš”μ†Œ 선택( n ν‚€μ›Œλ“œ μ‚¬μš©μ‹œ 0λΆ€ν„° 해석 (Zero-base))

.fruits {    font-size: 40px;}.fruits p:nth-of-type(1) {    color: red;}
<div class="fruits">    <div>λ”ΈκΈ°</div>    <p>사과</p>    <!--선택-->    <p>망고</p>    <span>μ˜€λ Œμ§€</span></div>

:nth-of-type() μœ μ˜μ‚¬ν•­ :

  • νƒ€μž…(tag)의 n번째λ₯Ό μ°ΎλŠ” 것이기 λ•Œλ¬Έμ— class λ˜λŠ” id μ„ νƒμžλ₯Ό λ„£μœΌλ©΄ 각 νƒ€μž…μ€‘ n번째 μ€‘μ—μ„œ class λ˜λŠ” id μ„ νƒμžλ‘œ μ„ νƒν•˜λŠ” 것이지, class λ˜λŠ” id μ„ νƒμžλ₯Όκ°–λŠ” μš”μ†Œ 쀑 n번째λ₯Ό μ°ΎλŠ” 것이 μ•„λ‹ˆλ‹€.

λΆ€μ • μ„ νƒμž(Negation Selector)#

ν•΄λ‹Ή μ„ νƒμžκ°€ μ•„λ‹Œ μš”μ†Œλ₯Ό 선택

.fruits {    font-size: 40px;}.fruits li:not(.strawberry) {    color: red;}
<ul class="fruits">    <li>μ˜€λ Œμ§€</li>    <!--선택-->    <li class="strawberry">λ”ΈκΈ°</li>    <li>망고</li>    <!--선택-->    <li>사과</li>    <!--선택--></ul>

가상 μš”μ†Œ μ„ νƒμž(Pseudo-Elements Selectors)#

emmit 문법 : ul>li{\$}*10

Before#

μš”μ†Œ λ‚΄λΆ€μ˜ μ•žμ— λ‚΄μš©(content)을 μ‚½μž…

ul li::before {    content: '숫자';    color: red;}
<ul>    <li>1</li>    <li>2</li>    <li>3</li></ul>

μœ μ˜μ‚¬ν•­ content 속성을 μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 아무것도 보이지 μ•ŠλŠ”λ‹€. 빈 λ‚΄μš©μ„ λ„£κ³ μ‹Άλ‹€λ©΄ content: ""; λ₯Ό μΆ”κ°€ν•΄μ•Όν•œλ‹€.


After#

μš”μ†Œ λ‚΄λΆ€μ˜ 뒀에 λ‚΄μš©(content)을 μ‚½μž…

ul li::after {    content: '.0';}
<ul>    <li>1</li>    <li>2</li>    <li>3</li></ul>

::before λ‚˜ ::after λͺ¨λ‘ content에 ν…μŠ€νŠΈ 뿐 μ•„λ‹ˆλΌ 이미지λ₯Ό μ‚½μž…ν•˜λŠ” 것도가λŠ₯ν•˜λ‹€. url ν•¨μˆ˜ λ₯Ό μ΄μš©ν•˜λŠ” 방법이 μžˆλ‹€.

ul li::after {    content: url('<https://heropy.blog/css/images/logo.png>');}
<ul>    <li>1</li>    <li>2</li>    <li>3</li></ul>

μœ μ˜μ‚¬ν•­ :before , :after 도 λ™μž‘ν•˜μ§€λ§Œ, μ΄λŠ” 과거에 가상 클래슀 μ„ νƒμž, κ°€μƒμš”μ†Œ μ„ νƒμž κ°œλ…μ΄ λΆ„λ¦¬λ˜κΈ° 전에 μ‚¬μš©λ˜λ˜ κ²ƒμœΌλ‘œ ν˜„μž¬λŠ” ::before , ::after λ‘œμ‚¬μš©ν•˜λŠ” 것이 ν‘œμ€€μ΄λ‹€.


속성 μ„ νƒμž(Attribute Selectors)#

Attr#

속성 attr 을 ν¬ν•¨ν•œ μš”μ†Œ 선택

[disabled] {    opacity: 0.2;}
<input type="text" value="HEROPY" /><input type="password" value="1234" /><input type="text" value="disabled text" disabled />

Attr=Value#

속성 attr 을 ν¬ν•¨ν•˜λ©° 속성 값이 value 인 μš”μ†Œ 선택

[type='password'] {    opacity: 0.5;    color: red;}
<input type="text" value="HEROPY" /><input type="password" value="1234" /><input type="text" value="disabled text" disabled />

value μ—λŠ” λ”°μ˜΄ν‘œλ₯Ό 뢙일 μˆ˜λ„ 뢙이지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. type=password or type="password"


Attr^=Value#

속성 attr 을 ν¬ν•¨ν•˜λ©° 속성 값이 value 둜 μ‹œμž‘ν•˜λŠ” μš”μ†Œ 선택

[class^='btn-'] {    font-weight: bold;    border-radius: 20px;}
<button class="btn-success">Success</button><button class="btn-danger">Danger</button><button>Normal</button>

Attr\$=Value#

속성 attr 을 ν¬ν•¨ν•˜λ©° 속성 값이 value 둜 λλ‚˜λŠ” μš”μ†Œ 선택

[class$='btn-'] {    font-weight: bold;    border-radius: 20px;}[class$='success'] {    color: green;}[class$='danger'] {    color: red;}
<button class="btn-success">Success</button><button class="btn-danger">Danger</button><button>Normal</button>

상속(Inheritance)#

.ecosystem {    color: red;}
<div class="ecosystem">    μƒνƒœκ³„    <div class="animal">        동물        <div class="tiger">ν˜Έλž‘μ΄</div>        <div class="lion">μ‚¬μž</div>        <div class="elephant">코끼리</div>    </div>    <div class="plant">식물</div></div>

μƒνƒœκ³„(.ecosystem)에 적용된 색상이 ν•˜μœ„ μš”μ†Œλ“€μ— λͺ¨λ‘ μ μš©λœλ‹€.


μƒμ†λ˜λŠ” 속성듀(properties)#

κΈ€μžλ₯Ό λ‹€λ£¨λŠ” 속성듀이 기본적으둜 상속이 λœλ‹€. λ‚˜λ¨Έμ§€ 속성듀은 상속이 λ˜μ§€ μ•ŠλŠ”λ‹€.

  • font

    • font-size

    • font-weight

    • font-style

    • line-height

    • font-family

  • color

  • text-align

  • text-indent

  • text-decoration

  • letter-spacing

  • opacity

  • etc...


κ°•μ œ 상속#

μ›λž˜λŠ” μƒμ†λ˜μ§€ μ•ŠλŠ” 속성을 κ°•μ œμ μœΌλ‘œ μƒμ†μ‹œν‚¬ 수 μžˆλ‹€.

<div class="parent">    <div class="child"></div></div>
.parent {    position: absolute; /* μ›λž˜λŠ” μƒμ†λ˜μ§€ μ•ŠλŠ” 속성과 κ°’ */}.child {    position: inherit; /* λΆ€λͺ¨μ˜ 속성과 κ°’ position: absolute; 을 κ°•μ œ 상속 λ°›λŠ”λ‹€ */}

μƒμ†λ˜μ§€ μ•ŠλŠ” 속성도 inherit μ΄λΌλŠ” 값을 μ‚¬μš©ν•΄μ„œ λΆ€λͺ¨μ—μ„œ μžμ‹μœΌλ‘œ κ°•μ œ μƒμ†μ‹œν‚¬ 수 μžˆλ‹€. μžμ‹μ„ μ œμ™Έν•œ ν›„μ†μ—κ²ŒλŠ” μ μš©λ˜μ§€ μ•ŠμœΌλ©°, λͺ¨λ“  속성이 κ°•μ œ 상속을 μ‚¬μš©ν•  수 μžˆλŠ” 것은 μ•„λ‹ˆλ‹€.


μš°μ„ μˆœμœ„(Priority)#

<body>    <!--인라인 선언방식-->    <div id="color_yellow" class="color_green" style="color: orange;">        Hello world!    </div></body>
div {    color: red !important;} /* !important */
#color_yellow {    color: yellow;} /* id μ„ νƒμž */
.color_green {    color: green;} /* class μ„ νƒμž */
div {    color: blue;} /* tag μ„ νƒμž */
* {    color: darkblue;} /* 전체 μ„ νƒμž */
body {    color: violet;} /* 상속 */

ν•˜λ‚˜μ˜ μš”μ†Œλ₯Ό κ°€λ₯΄ν‚€λŠ” μ—¬λŸ¬ μ„ μ–Έλ“€. μ–΄λ–€ 것이 μ„ νƒλ κΉŒ?


μš°μ„ μˆœμœ„ κ²°μ •#

같은 μš”μ†Œκ°€ μ—¬λŸ¬ μ„ μ–Έμ˜ λŒ€μƒμ΄ 될 경우, μ–΄λ–€ μ„ μ–Έμ˜ CSS 속성(property)을 μš°μ„  μ μš©ν• μ§€ κ²°μ •ν•˜λŠ” 방법

  1. λͺ…μ‹œλ„ μ μˆ˜κ°€ 높은 선언이 μš°μ„ (λͺ…μ‹œλ„)

  2. μ μˆ˜κ°€ 같은 경우, κ°€μž₯ λ§ˆμ§€λ§‰μ— 해석(늦게 μž‘μ„±ν•œ)λ˜λŠ” 선언이 μš°μ„ (μ„ μ–Έ μˆœμ„œ)

  3. λͺ…μ‹œλ„λŠ” '상속' κ·œμΉ™λ³΄λ‹€ μš°μ„ (μ€‘μš”λ„)

  4. !important κ°€ 적용된 μ„ μ–Έ 방식이 λ‹€λ₯Έ λͺ¨λ“  방식보닀 μš°μ„ (μ€‘μš”λ„)

μš°μ„ μˆœμœ„μ—λŠ” 'μ€‘μš”λ„, λͺ…μ‹œλ„, μ„ μ–Έ μˆœμ„œ'의 κ°œλ…μ΄ μžˆλ‹€.


1. κ°€μž₯μ€‘μš”( !important )#

λͺ¨λ“  선언을 λ¬΄μ‹œν•˜κ³  κ°€μž₯ μš°μ„ 

점수 : ∞ pt


2. 인라인 μ„ μ–Έ 방식(Style Attribute)#

인라인 μ„ μ–Έ(HTML style 속성을 μ‚¬μš©)

점수 : 1000 pt


3. Id μ„ νƒμž(ID Selector)#

아이디 μ„ νƒμž

점수 : 100 pt


4. 클래슀 μ„ νƒμž(Class Selector)#

클래슀 μ„ νƒμž

점수 : 10 pt


5. νƒœκ·Έ μ„ νƒμž(Tag Selector)#

νƒœκ·Έ μ„ νƒμž

점수 : 1 pt


6. 전체 μ„ νƒμž(Universal Selector)#

전체 μ„ νƒμž

점수 : 0 pt


7. 상속(CSS Inheritance)#

상속 받은 속성은 항상 μš°μ„ ν•˜μ§€ μ•ŠμŒ

점수 : κ³„μ‚°ν•˜μ§€ μ•ŠμŒ

.list li.item {    color: red;} /* 21pt 클래슀+νƒœκ·Έ+클래슀 */
.list li:hover {    color: red;} /* 21pt 클래슀+νƒœκ·Έ+(가상)클래슀 */
.box::before {    content: 'Good ';    color: red;} /* 11pt 클래슀+(가상 μš”μ†Œ)νƒœκ·Έ */
#submit span {    color: red;} /* 101pt 아이디+νƒœκ·Έ */
header .menu li:nth-child(2) {    color: red;} /* 22pt νƒœκ·Έ+클래슀+νƒœκ·Έ+(가상)클래슀 */
h1 {    color: red;} /* 1pt νƒœκ·Έ */
:not(.box) {    color: red;} /* 10pt 클래슀 */
:not(span) {    color: red;} /* 1pt νƒœκ·Έ */

:hover 와 같은 '가상 클래슀'λŠ” '클래슀' μ„ νƒμž 점수( 10pt )λ₯Ό 가지며 '가상 μš”μ†Œ'λŠ” 'νƒœκ·Έ' μ„ νƒμž 점수( 1pt )λ₯Ό 가진닀. λΆ€μ • μ„ νƒμž :not() λŠ” 점수λ₯Ό κ°€μ§€μ§€μ•ŠλŠ”λ‹€.


Reference#

패슀트캠퍼슀 - ν”„λ‘ νŠΈμ—”λ“œ 개발 κ°•μ˜ - HTML & CSS, SASS(SCSS) Part by ParkYoungWoong