Selector

1. κ°œμš”

styleλ₯Ό 적용 ν•˜κ³ μžν•˜λŠ” HTMLμš”μ†Œλ₯Ό νŠΉμ •ν•  ν•„μš”κ°€ μžˆλ‹€. μ΄λ•Œ μ‚¬μš©ν•˜λŠ” 것이 μ…€λ ‰ν„°/μ„ νƒμž(Selector)이닀. styleλ₯Ό μ μš©ν•˜κ³ μžν•˜λŠ” HTML μš”μ†Œλ₯Ό μ…€λ ‰ν„°λ‘œ νŠΉμ •ν•˜κ³  μ„ νƒλœ μš”μ†Œμ— μŠ€νƒ€μΌμ„ μ •μ˜ν•˜λŠ” 것. 볡수개의 μ…€λ ‰ν„°λ₯Ό μ—°μ†ν•˜μ—¬ μ§€μ •ν•  수 있으며 μ‰Όν‘œ(,)둜 ꡬ뢄함. CSS Rule Set

  • νƒœκ·Έ(tag): <p></p>와 같은 νƒœκ·Έ 자체

  • μš”μ†Œ(element): <p>hello world</p>μ—μ„œ <p>νƒœκ·Έ 및 λ‚΄λΆ€ 뢀뢄을 λͺ¨λ‘ 포함

<p>νƒœκ·Έλ₯Ό μ μš©ν•œ μŠ€νƒ€μΌμ΄λΌλŠ” ν‘œν˜„μ€ μ˜³μ§€ μ•ŠμŒ. pμš”μ†Œμ— μ μš©ν•˜λŠ” μŠ€νƒ€μΌλ‘œ ν‘œν˜„ν•˜λŠ” 것이 μ˜³λ°”λ¦„.


2. 전체 μ…€λ ‰ν„°(Universal Selector)

전체 μ…€λ ‰ν„°λŠ” μŠ€νƒ€μΌμ„ λ¬Έμ„œμ˜ λͺ¨λ“  μš”μ†Œμ— μ μš©ν•  λ•Œ μ‚¬μš©. html μš”μ†Œλ₯Ό ν¬ν•¨ν•œ μš”μ†Œκ°€ 선택됨.(head μš”μ†Œλ„ 포함)

κΈ°λ³Έν˜• * {속성: κ°’;}

...
<head>
  <style>
    /* λͺ¨λ“  μš”μ†Œλ₯Ό 선택 */
    * {
      color: red;
    }
  </style>
</head>
<body>
  <h1>Welcome my TIL</h1>
  <p>λ°˜κ°‘μŠ΅λ‹ˆλ‹€.</p>
  <span>μ•ˆλ…•ν•˜μ„Έμš”.</span>
</body>

3. νƒœκ·Έ/νƒ€μž… μ…€λ ‰ν„°(Type Selector)

νƒœκ·Έ μ…€λ ‰ν„°λŠ” νŠΉμ • νƒœκ·Έλ₯Ό μ‚¬μš©ν•œ λͺ¨λ“  μš”μ†Œμ— μŠ€νƒ€μΌμ„ 적용. νƒœκ·Έ μ„ νƒμžλ₯Ό μ‚¬μš©ν•΄ μŠ€νƒ€μΌμ„ μ§€μ •ν•˜λ©΄ ν•΄λ‹Ή νƒœκ·Έλ₯Ό μ‚¬μš©ν•œ λͺ¨λ“  μš”μ†Œμ— 적용.

κΈ°λ³Έν˜• νƒœκ·Έλͺ… { μŠ€νƒ€μΌ κ·œμΉ™ }

<head>
  <style>
    /* λͺ¨λ“  p νƒœκ·Έ μš”μ†Œλ₯Ό 선택 */
    p {
      color: red;
    }
  </style>
</head>
<body>
  <h1>Welcome my TIL</h1>
  <p>λ°˜κ°‘μŠ΅λ‹ˆλ‹€.</p>
  <p>μ•„λž˜μ˜ λ‚΄μš©μ„ λ³΄μ„Έμš”.</p>
  <span>μ•ˆλ…•ν•˜μ„Έμš”.</span>
</body>

4. ID μ…€λ ‰ν„°(ID Selector)

id μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 μ§€μ •ν•˜μ—¬ μΌμΉ˜ν•˜λŠ” μš”μ†Œλ₯Ό 선택. id μ–΄νŠΈλ¦¬λ·°νŠΈ 값은 쀑볡될 수 μ—†λŠ” μœ μΌν•œ κ°’μ΄λ―€λ‘œ 주둜 λ¬Έμ„œμ˜ λ ˆμ΄μ•„μ›ƒκ³Ό κ΄€λ ¨λœ μŠ€νƒ€μΌμ„ μ§€μ •ν•˜λŠ”λ° μ‚¬μš©.

κΈ°λ³Έν˜• #id μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’ { μŠ€νƒ€μΌ κ·œμΉ™ }

<head>
  <style>
    /* id μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 header인 μš”μ†Œλ₯Ό 선택 */
    #header {
      color: red;
    }
  </style>
</head>
<body>
  <header id="header">
    <h1>Welcome my TIL</h1>
    <p>λ°˜κ°‘μŠ΅λ‹ˆλ‹€.</p>
    <p>μ•„λž˜μ˜ λ‚΄μš©μ„ λ³΄μ„Έμš”.</p>
    <span>μ•ˆλ…•ν•˜μ„Έμš”.</span>
  </header>
</body>

5. 클래슀 μ…€λ ‰ν„°(Class Selector)

class μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 μ§€μ •ν•˜μ—¬ μΌμΉ˜ν•˜λŠ” μš”μ†Œλ₯Ό 선택. class μ–΄νŠΈλ¦¬λ·°νŠΈ 값은 쀑볡될 수 있음.

κΈ°λ³Έν˜• .class μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’ { μŠ€νƒ€μΌ κ·œμΉ™ }

<head>
  <style>
    /* λͺ¨λ“  p νƒœκ·Έ μš”μ†Œλ₯Ό 선택 */
    p {
      background-color: black;
    }

    /* class μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 text1인 λͺ¨λ“  μš”μ†Œλ₯Ό 선택 */
    .text1 {
      color: yellow;
    }

    /* class μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 text2인 λͺ¨λ“  μš”μ†Œλ₯Ό 선택 */
    .text2 {
      color: #fff;
    }

    /* class μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 text-large인 λͺ¨λ“  μš”μ†Œλ₯Ό 선택 */
    .text-large {
      font-size: 200%;
    }

    /* class μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 text-center인 λͺ¨λ“  μš”μ†Œλ₯Ό 선택 */
    .text-center {
      text-align: center;
    }
  </style>
</head>
<body>
  <header id="header">
    <h1>Welcome my TIL</h1>
    <p class="text1 text-large">λ°˜κ°‘μŠ΅λ‹ˆλ‹€.</p>
    <p class="text1 text-center">μ•„λž˜μ˜ λ‚΄μš©μ„ λ³΄μ„Έμš”.</p>
    <p class="text2 text-large text-center">μ•„λž˜μ˜ λ‚΄μš©μ„ λ³΄μ„Έμš”.</p>
    <span>μ•ˆλ…•ν•˜μ„Έμš”.</span>
  </header>
</body>

HTMLμš”μ†Œμ— class μ–΄νŠΈλ¦¬λ·°νŠΈ 값은 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ μ—¬λŸ¬ 개 μ§€μ •ν•  수 있음. μœ„μ™€ 같이 클래슀 μ…€λ ‰ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ 미리 μŠ€νƒ€μΌμ„ μ •μ˜ν•΄ 두고, HTMLμš”μ†ŒλŠ” 이미 μ •μ˜λ˜μ–΄ μžˆλŠ” 클래슀λ₯Ό μ§€μ •ν•˜λŠ” κ²ƒμœΌλ‘œ ν•„μš”ν•œ μŠ€νƒ€μΌμ„ μ§€μ •ν•  수 있음. μ΄λŠ” μž¬μ‚¬μš©μ˜ μΈ‘λ©΄μ—μ„œ μœ μš©ν•¨.

Tailwind Css의 κ°œλ…μ΄μ§€ μ•Šμ„κΉŒ? μ‹Άλ‹€. κ³΅μ‹λ¬Έμ„œ


6. μ–΄νŠΈλ¦¬λ·°νŠΈ μ…€λ ‰ν„°(Attribute Selector)

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κ°–λŠ” λͺ¨λ“  μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ] { μŠ€νƒ€μΌ κ·œμΉ™ }

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κ°€μ§€λ©° μ§€μ •λœ κ°’κ³Ό μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ 값이 μΌμΉ˜ν•˜λŠ” λͺ¨λ“  μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ="κ°’"] { μŠ€νƒ€μΌ κ·œμΉ™ }

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ 값이 (곡백으둜 λΆ„λ¦¬λœ) λ‹¨μ–΄λ‘œ ν¬ν•¨ν•˜λŠ” μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ~="κ°’"] { μŠ€νƒ€μΌ κ·œμΉ™ }

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈμ˜ κ°’κ³Ό μΌμΉ˜ν•˜κ±°λ‚˜ μ§€μ • μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’ λ’€ 연이은 ν•˜μ΄ν°("κ°’-")으둜 μ‹œμž‘ν•˜λŠ” μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ|="κ°’"] { μŠ€νƒ€μΌ κ·œμΉ™ }

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’μœΌλ‘œ μ‹œμž‘ν•˜λŠ” μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ^="κ°’"] { μŠ€νƒ€μΌ κ·œμΉ™ }

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈ κ°’μœΌλ‘œ λλ‚˜λŠ” μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ$="κ°’"] { μŠ€νƒ€μΌ κ·œμΉ™ }

  • μ§€μ •λœ μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 ν¬ν•¨ν•˜λŠ” μš”μ†Œλ₯Ό 선택

    • κΈ°λ³Έν˜• μ…€λ ‰ν„°[μ–΄νŠΈλ¦¬λ·°νŠΈ*="κ°’"] { μŠ€νƒ€μΌ κ·œμΉ™ }

<head>
  <style>
    /* a μš”μ†Œ 쀑에 href μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό κ°–λŠ” λͺ¨λ“  μš”μ†Œ */
    a[href] {
      color: red;
    }

    /* a μš”μ†Œ 쀑에 target μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 "_blank"인 λͺ¨λ“  μš”μ†Œ */
    a[target="_blank"] {
      font-size: 28px;
    }

    /* h1 μš”μ†Œ 쀑에 title μ–΄νŠΈλ¦¬λ·°νŠΈ 값에 "first"λ₯Ό 단어λ₯Ό ν¬ν•¨ν•˜λŠ” μš”μ†Œ */
    h1[title~="first"] {
      color: blue;
    }

    /* h1 μš”μ†Œ 쀑에 lang μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 "en"κ³Ό μΌμΉ˜ν•˜κ±°λ‚˜ "en-"둜 μ‹œμž‘ν•˜λŠ” μš”μ†Œ */
    h1[lang|="en"] {
      background-color: yellow;
    }

    /* a μš”μ†Œ 쀑에 href μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 "https://"둜 μ‹œμž‘ν•˜λŠ” μš”μ†Œ  */
    a[href^="https://"]
    {
      font-weight: 700;
    }

    /* a μš”μ†Œ 쀑에 href μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 ".html"둜 λλ‚˜λŠ” μš”μ†Œ */
    a[href$=".html"] {
      color: green;
    }

    /* h1 μš”μ†Œ μ€‘μ—μ„œ class μ–΄νŠΈλ¦¬λ·°νŠΈ 값에 "test"λ₯Ό ν¬ν•¨ν•˜λŠ” μš”μ†Œ */
    h1[class*="test"] {
      font-style: italic;
    }
  </style>
</head>
<body>
  <header id="header">
    <a href="https://www.poiemaweb.com">poiemaweb.com</a><br />
    <a href="https://www.google.com" target="_blank">google.com</a><br />
    <a href="https://www.naver.com" target="_top">naver.com</a><br />
    <a href="http://www.test.com" target="_top">test.com</a>
    <h1 title="heading first" lang="en" class="first_test">Heading first</h1>
    <h1 title="heading-first" lang="en-us" class="second">Heading-first</h1>
    <h1 title="heading second" lang="en-gb" class="test">Heading second</h1>
    <h1 title="heading third" lang="us" class="second_test">Heading third</h1>
    <h1 title="heading third" lang="no">Heading third</h1>
    <a href="test.html">test.html</a><br />
    <a href="test.jsp">test.jsp</a>
  </header>
</body>
AttributeSelector

7. 볡합 μ…€λ ‰ν„° (Combinator)

7-1. 후손 μ…€λ ‰ν„° (Descendant Combinator)

μžμ‹ μ˜ 1 level μƒμœ„μ— μ†ν•˜λŠ” μš”μ†Œλ₯Ό λΆ€λͺ¨ μš”μ†Œ, 1 level ν•˜μœ„μ— μ†ν•˜λŠ” μš”μ†Œλ₯Ό μžμ† μš”μ†Œ(μžμ‹ μš”μ†Œ)라 함. μžμ‹ λ³΄λ‹€ n level ν•˜μœ„μ— μ†ν•˜λŠ” μ†ν•˜λŠ” μš”μ†ŒλŠ” 후손 μš”μ†Œ(ν•˜μœ„ μš”μ†Œ)라 함.

<body>
  <div>
    <h2>λ‚˜λŠ” μžμ†μ΄λ©΄μ„œ ν›„μ†μ΄μ—μš”.</h2>
    <p>λ‚˜λŠ” μžμ†μ΄λ©΄μ„œ ν›„μ†μ΄μ—μš”.</p>
    <span>
      <p>λ‚˜λŠ” ν›„μ†μ΄μ—μš”.</p>
    </span>
  </div>
</body>

κΈ°λ³Έν˜• μ…€λ ‰ν„°A μ…€λ ‰ν„°B { μŠ€νƒ€μΌ κ·œμΉ™ }

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* div μš”μ†Œμ˜ ν›„μ†μš”μ†Œ 쀑 p μš”μ†Œ */
      div p {
        color: red;
      }
    </style>
  </head>
  <body>
    <h1>Heading</h1>
    <div>
      <p>paragraph 1</p>
      <p>paragraph 2</p>
      <span><p>paragraph 3</p></span>
    </div>
    <p>paragraph 4</p>
  </body>
</html>

paragraph 4λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 것듀에 μŠ€νƒ€μΌμ΄ 적용됨.


7-2. μžμ‹ μ…€λ ‰ν„° (Child Combinator)

μžμ‹ μ…€λ ‰ν„°λŠ” μ…€λ ‰ν„°A의 λͺ¨λ“  μžμ‹ μš”μ†Œ 쀑 μ…€λ ‰ν„°B와 μΌμΉ˜ν•˜λŠ” μš”μ†Œλ₯Ό 선택. 후손은 μ•„λ‹˜.

κΈ°λ³Έν˜• μ…€λ ‰ν„°A > μ…€λ ‰ν„°B { μŠ€νƒ€μΌ κ·œμΉ™ }

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* div μš”μ†Œμ˜ μžμ‹μš”μ†Œ 쀑 p μš”μ†Œ */
      div > p {
        color: red;
      }
    </style>
  </head>
  <body>
    <h1>Heading</h1>
    <div>
      <p>paragraph 1</p>
      <p>paragraph 2</p>
      <span><p>paragraph 3</p></span>
    </div>
    <p>paragraph 4</p>
  </body>
</html>

paragraph 1, 2만 μŠ€νƒ€μΌμ΄ 적용됨.


7-3. ν˜•μ œ(λ™μœ„) μ…€λ ‰ν„° (Sibling Combinator)

ν˜•μ œ(λ™μœ„) μ…€λ ‰ν„°λŠ” ν˜•μ œ 관계(λ™μœ„ 관계)μ—μ„œ 뒀에 μœ„μΉ˜ν•˜λŠ” μš”μ†Œλ₯Ό 선택할 λ•Œ μ‚¬μš©ν•œλ‹€.

Sibling Combinator

7-3-1. 인접 ν˜•μ œ μ…€λ ‰ν„° (Adjacent Sibling Combinator)

μ…€λ ‰ν„°A의 ν˜•μ œ μš”μˆ˜ 쀑 μ…€λ ‰ν„°A λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λŠ” μ…€λ ‰ν„°B μš”μ†Œλ₯Ό 선택. A와 B사이에 λ‹€λ₯Έ μš”μ†Œκ°€ μ‘΄μž¬ν•˜λ©΄ μ„ νƒλ˜μ§€ μ•ŠμŒ.

κΈ°λ³Έν˜• μ…€λ ‰ν„°A + μ…€λ ‰ν„°B { μŠ€νƒ€μΌ κ·œμΉ™ }

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* p μš”μ†Œμ˜ ν˜•μ œ μš”μ†Œ 쀑에 p μš”μ†Œ λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λŠ” ul μš”μ†Œλ₯Ό μ„ νƒν•œλ‹€. */
      p + ul {
        color: red;
      }
    </style>
  </head>
  <body>
    <div>A div element.</div>
    <ul>
      <li>Coffee</li>
      <li>Tea</li>
      <li>Milk</li>
    </ul>

    <p>The first paragraph.</p>
    <!-- μ•„λž˜μ˜ ulμš”μ†Œ(ν›„μ†μš”μ†Œ 포함)κ°€ μŠ€νƒ€μΌμ΄ μ μš©λœλ‹€. -->
    <ul>
      <li>Coffee</li>
      <li>Tea</li>
      <li>Milk</li>
    </ul>

    <h2>Another list</h2>
    <ul>
      <li>Coffee</li>
      <li>Tea</li>
      <li>Milk</li>
    </ul>
  </body>
</html>

7-3-2. 일반 ν˜•μ œ μ…€λ ‰ν„° (General Sibling Combinator)

μ…€λ ‰ν„°A의 ν˜•μ œ μš”μ†Œ 쀑 μ…€λ ‰ν„°A 뒀에 μœ„μΉ˜ν•˜λŠ” μ…€λ ‰ν„°B μš”μ†Œλ₯Ό λͺ¨λ‘ 선택

κΈ°λ³Έν˜• μ…€λ ‰ν„°A ~ μ…€λ ‰ν„°B { μŠ€νƒ€μΌ κ·œμΉ™ }

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* p μš”μ†Œμ˜ ν˜•μ œ μš”μ†Œ 쀑에 p μš”μ†Œ 뒀에 μœ„μΉ˜ν•˜λŠ” ul μš”μ†Œλ₯Ό λͺ¨λ‘ μ„ νƒν•œλ‹€. */
      p ~ ul {
        color: red;
      }
    </style>
  </head>
  <body>
    <div>A div element.</div>
    <ul>
      <li>Coffee</li>
      <li>Tea</li>
      <li>Milk</li>
    </ul>

    <p>The first paragraph.</p>
    <!-- μ•„λž˜μ˜ ulμš”μ†Œ(ν›„μ†μš”μ†Œ 포함)κ°€ μŠ€νƒ€μΌμ΄ μ μš©λœλ‹€. -->
    <ul>
      <li>Coffee</li>
      <li>Tea</li>
      <li>Milk</li>
    </ul>

    <h2>Another list</h2>
    <!-- μ•„λž˜μ˜ ulμš”μ†Œ(ν›„μ†μš”μ†Œ 포함)κ°€ μŠ€νƒ€μΌμ΄ μ μš©λœλ‹€. -->
    <ul>
      <li>Coffee</li>
      <li>Tea</li>
      <li>Milk</li>
    </ul>
  </body>
</html>

8. 가상 클래슀 μ…€λ ‰ν„° (Pseudo-Class Selector)

가상 ν΄λž˜μŠ€λŠ” μš”μ†Œμ˜ νŠΉμ • μƒνƒœμ— 따라 μŠ€νƒ€μΌμ„ μ •μ˜ν•  λ•Œ μ‚¬μš©.

  • λ§ˆμš°μŠ€κ°€ μ˜¬λΌμ™€ μžˆμ„ λ•Œ

  • 링크λ₯Ό λ°©λ¬Έν–ˆμ„ λ•Œμ™€ 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜μ„ λ•Œ

  • ν¬μ»€μŠ€κ°€ 듀어와 μžˆμ„ λ•Œ

μ΄λŸ¬ν•œ νŠΉμ • μƒνƒœμ—λŠ” μ›λž˜ ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ 가상 클래슀λ₯Ό μž„μ˜λ‘œ μ§€μ •ν•˜μ—¬ μ„ νƒν•˜λŠ” 방법 가상 ν΄λž˜μŠ€λŠ” λ§ˆμΉ¨ν‘œ(.) λŒ€μ‹  콜둠(:)을 μ‚¬μš©, 가상 ν΄λž˜μŠ€λŠ” 미리 μ •μ˜λœ 이름이 있기 λ•Œλ¬Έμ— μž„μ˜μ˜ 이름을 μ‚¬μš©ν•  수 μ—†μŒ.

μ‚¬μš©λ²• μ…€λ ‰ν„°:κ°€μƒν΄λž˜μŠ€ { 클래슀 κ·œμΉ™ }

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* a μš”μ†Œκ°€ hover μƒνƒœμΌ λ•Œ */
      a:hover {
        color: red;
      }
      /* input μš”μ†Œκ°€ focus μƒνƒœμΌ λ•Œ */
      input:focus {
        background-color: yellow;
      }
    </style>
  </head>
  <body>
    <a href="#">Hover me</a><br /><br />
    <input type="text" placeholder="focus me" />
  </body>
</html>

pseudo-class
Description

:link

μ…€λ ‰ν„°κ°€ λ°©λ¬Έν•˜μ§€ μ•ŠλŠ” 링크일 λ•Œ

:visited

μ…€λ ‰ν„°κ°€ λ°©λ¬Έν•œ 링크일 λ•Œ

:hover

μ…€λ ‰ν„°κ°€ λ§ˆμš°μŠ€κ°€ μ˜¬λΌμ™€ μžˆμ„ λ•Œ

:active

μ…€λ ‰ν„°κ°€ 클릭된 μƒνƒœμΌ λ•Œ

:focus

셀렉터에 ν¬μ»€μŠ€κ°€ 듀어와 μžˆμ„ λ•Œ

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* a μš”μ†Œκ°€ λ°©λ¬Έν•˜μ§€ μ•Šμ€ 링크일 λ•Œ */
      a:link {
        color: red;
      }

      /* a μš”μ†Œκ°€ λ°©λ¬Έν•œ 링크일 λ•Œ */
      a:visited {
        color: blue;
      }

      /* a μš”μ†Œμ— λ§ˆμš°μŠ€κ°€ μ˜¬λΌμ™€ μžˆμ„ λ•Œ */
      a:hover {
        font-weight: 700;
      }

      /* a μš”μ†Œκ°€ 클릭된 μƒνƒœμΌ λ•Œ */
      a:active {
        color: green;
      }

      /* text input μš”μ†Œμ™€ password input μš”μ†Œμ— ν¬μ»€μŠ€κ°€ 듀어와 μžˆμ„ λ•Œ */
      input[type="text"]:focus,
      input[type="password"]:focus {
        color: red;
      }
    </style>
  </head>
  <body>
    <a href="#" target="_blank">This is a link</a><br />
    <input type="text" value="I'll be red when focused" /><br />
    <input type="password" value="I'll be red when focused" />
  </body>
</html>

8-2. UI μš”μ†Œ μƒνƒœ μ…€λ ‰ν„° (UI element states pseudo-classes)

pseudo-class
Description

:checked

μ…€λ ‰ν„°κ°€ 체크 μƒνƒœμΌ λ•Œ

:enabled

μ…€λ ‰ν„°κ°€ μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœμΌ λ•Œ

:disabled

μ…€λ ‰ν„°κ°€ μ‚¬μš© λΆˆκ°€λŠ₯ν•œ μƒνƒœμΌ λ•Œ

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* input μš”μ†Œκ°€ μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœμΌ λ•Œ, input μš”μ†Œ λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λŠ” 인접 ν˜•μ œ span μš”μ†Œλ₯Ό 선택 */
      input:enabled + span {
        color: red;
      }

      /* input μš”μ†Œκ°€ μ‚¬μš© λΆˆκ°€λŠ₯ν•œ μƒνƒœμΌ λ•Œ, input μš”μ†Œ λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λŠ” 인접 ν˜•μ œ span μš”μ†Œλ₯Ό 선택 */
      input:disabled + span {
        color: blue;
      }

      /* input μš”μ†Œκ°€ 체크 μƒνƒœμΌ λ•Œ, input μš”μ†Œ λ°”λ‘œ 뒀에 μœ„μΉ˜ν•˜λŠ” 인접 ν˜•μ œ span μš”μ†Œλ₯Ό 선택 */
      input:checked + span {
        color: red;
      }
    </style>
  </head>
  <body>
    <input type="radio" checked="checked" value="male" name="gender" />
    <span>Male</span><br />
    <input type="radio" value="female" name="gender" /> <span>Female</span
    ><br />
    <input type="radio" value="neuter" name="gender" disabled />
    <span>Neuter</span>
    <hr />

    <input type="checkbox" checked="checked" value="bicycle" />
    <span>I have a bicycle</span><br />
    <input type="checkbox" value="car" /> <span>I have a car</span><br />
    <input type="checkbox" value="motorcycle" disabled />
    <span>I have a motorcycle</span>
  </body>
</html>

8-3. ꡬ쑰 가상 클래슀 μ…€λ ‰ν„° (Structural pseudo-classes)

pseudo-class
Description

:first-child

셀렉터에 ν•΄λ‹Ήν•˜λŠ” λͺ¨λ“  μš”μ†Œ 쀑 첫번째 μžμ‹μΈ μš”μ†Œλ₯Ό 선택, ν˜•μ œ μš”μ†Œ 쀑 제일 첫 μš”μ†Œλ₯Ό 선택

:last-child

셀렉터에 ν•΄λ‹Ήν•˜λŠ” λͺ¨λ“  μš”μ†Œ 쀑 λ§ˆμ§€λ§‰ μžμ‹μΈ μš”μ†Œλ₯Ό 선택, ν˜•μ œ μš”μ†Œ 쀑 제일 λ§ˆμ§€λ§‰ μš”μ†Œλ₯Ό 선택

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* p μš”μ†Œ μ€‘μ—μ„œ 첫번째 μžμ‹μ„ 선택 */
      p:first-child {
        color: red;
      }

      /* p μš”μ†Œ μ€‘μ—μ„œ λ§ˆμ§€λ§‰ μžμ‹μ„ 선택 */
      /* body μš”μ†Œμ˜ λ‘λ²ˆμ§Έ p μš”μ†ŒλŠ” λ§ˆμ§€λ§‰ μžμ‹ μš”μ†Œκ°€ μ•„λ‹ˆλ‹€.
       body μš”μ†Œμ˜ λ§ˆμ§€λ§‰ μžμ‹ μš”μ†ŒλŠ” div μš”μ†Œμ΄λ‹€. */
      p:last-child {
        color: blue;
      }
    </style>
  </head>
  <body>
    <p>This paragraph is the first child of its parent (body).</p>

    <h1>Welcome to My Homepage</h1>
    <p>This text isn't selected: it's not last child.</p>

    <div>
      <p>This paragraph is the first child of its parent (div).</p>
      <p>This paragraph is not the first child of its parent.</p>
    </div>
  </body>
</html>
Structural pseudo-classes
pseudo-class
Description

:nth-child(n)

셀렉터에 ν•΄λ‹Ήν•˜λŠ” λͺ¨λ“  μš”μ†Œ 쀑 μ•žμ—μ„œ n번째 μžμ‹μΈ μš”μ†Œλ₯Ό 선택

:nth-last-child(n)

셀렉터에 ν•΄λ‹Ήν•˜λŠ” λͺ¨λ“  μš”μ†Œ 쀑 λ’€μ—μ„œ n번째 μžμ‹μΈ μš”μ†Œλ₯Ό 선택

:first-of-type

셀렉터에 ν•΄λ‹Ήν•˜λŠ” μš”μ†Œμ˜ λΆ€λͺ¨ μš”μ†Œμ˜ μžμ‹ μš”μ†Œ 쀑 첫번째 λ“±μž₯ν•˜λŠ” μš”μ†Œλ₯Ό 선택

:last-of-type

셀렉터에 ν•΄λ‹Ήν•˜λŠ” μš”μ†Œμ˜ λΆ€λͺ¨ μš”μ†Œμ˜ μžμ‹ μš”μ†Œ 쀑 λ§ˆμ§€λ§‰μ— λ“±μž₯ν•˜λŠ” μš”μ†Œλ₯Ό 선택

:nth-of-type(n)

셀렉터에 ν•΄λ‹Ήν•˜λŠ” μš”μ†Œμ˜ λΆ€λͺ¨ μš”μ†Œμ˜ μžμ‹ μš”μ†Œ 쀑 μ•žμ—μ„œ n번째 λ“±μž₯ν•˜λŠ” μš”μ†Œλ₯Ό 선택

:nth-last-type(n)

셀렉터에 ν•΄λ‹Ήν•˜λŠ” μš”μ†Œμ˜ λΆ€λͺ¨ μš”μ†Œμ˜ μžμ‹ μš”μ†Œ 쀑 λ’€μ—μ„œ n번째 λ“±μž₯ν•˜λŠ” μš”μ†Œλ₯Ό 선택

ꡬ쑰 가상 μ…€λ ‰ν„°λŠ” 생각보닀 κ΅¬λ³„ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€. μ—¬λŸ¬λ²ˆ μ“°λ©΄μ„œ μ΅μˆ™ν•΄μ§€λ„λ‘ λ…Έλ ₯ν•˜κΈ° 각각의 ꡬ쑰 가상 μ…€λ ‰ν„°λ§ˆλ‹€ νŠΉμ§•μ΄ μžˆλ‹€. λͺ¨λ‘ λ‹€λ₯΄λ―€λ‘œ 상황에 맞게 κ³ λ―Όν•˜λ©° μ‚¬μš©ν•˜κΈ° 상황에 λ”°λΌμ„œλŠ” 같은 μš”μ†Œλ₯Ό μ„ νƒν•˜λŠ” κ²½μš°λ„ μžˆλ‹€.


8-4. λΆ€μ • μ…€λ ‰ν„° (Negation pseudo-class)

셀렉터에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  μš”μ†Œλ₯Ό 선택

μ‚¬μš©λ²• :not(μ…€λ ‰ν„°) { μŠ€νƒ€μΌ κ·œμΉ™ }

<!DOCTYPE html>
<head>
  <style>
    /* input μš”μ†Œ μ€‘μ—μ„œ type μ–΄νŠΈλ¦¬λ·°νŠΈ 값이 passwordκ°€ μ•„λ‹Œ μš”μ†Œλ₯Ό 선택 */
    input:not([type="password"]) {
      color: red;
    }
  </style>
</head>
<body>
  <input type="text" value="Text input" />
  <input type="email" value="email input" />
  <input type="password" value="Password input" />
</body>
<!DOCTYPE html>
<head>
  <style>
    div {
      max-width: 300px;
      padding: 10px;
      margin-bottom: 10px;
    }
    /* div μš”μ†Œ μ€‘μ—μ„œ 1, 4, 7...번째 λ“±μž₯ν•˜λŠ” μš”μ†Œκ°€ μ•„λ‹Œ μš”μ†Œλ§Œμ„ 선택 */
    /* 1, 4, 7... : 곡차가 3인 λ“±μ°¨μˆ˜μ—΄ */
    div:not(:nth-child(3n + 1)) {
      color: red;
    }

    /* div μš”μ†Œ μ€‘μ—μ„œ 4번째 이후 λ“±μž₯ν•˜λŠ” μš”μ†Œκ°€ μ•„λ‹Œ μš”μ†Œλ§Œμ„ 선택 */
    div:not(:nth-of-type(n + 4)) {
      background-color: yellow;
    }
  </style>
</head>
<body>
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
</body>

μœ„μ˜ 경우 nth-child()κ³Ό nth-of-type()쀑 μ•„λ¬΄κ±°λ‚˜ μ‚¬μš©ν•΄λ„ 같은 μš”μ†Œλ“€μ΄ μ„ νƒλœλ‹€.

NegationPseudoClass

8-5. μ •ν•©μ„± 체크 μ…€λ ‰ν„° (validity pseudo-class)

pseudo-class
Description

:valid

μ •ν•©μ„± 검증이 μ„±κ³΅ν•œ input μš”μ†Œ λ˜λŠ” form μš”μ†Œλ₯Ό μ„ νƒν•œλ‹€.

:invalid

μ •ν•©μ„± 검증이 μ‹€νŒ¨ν•œ input μš”μ†Œ λ˜λŠ” form μš”μ†Œλ₯Ό μ„ νƒν•œλ‹€.

<!DOCTYPE html>
<html>
  <head>
    <style>
      /* μ •ν•©μ„± 검증에 μ„±κ³΅ν•œ 경우 */
      input[type="text"]:valid {
        background-color: white;
      }

      /* μ •ν•©μ„± 검증에 μ‹€νŒ¨ν•œ 경우 */
      input[type="text"]:invalid {
        background-color: red;
      }
    </style>
  </head>
  <body>
    <label
      >μž…λ ₯값이 λ°˜λ“œμ‹œ ν•„μš”
      <input type="text" required />
    </label>
  </body>
</html>
ValidityPseudoClass

9. 가상 μš”μ†Œ μ…€λ ‰ν„° (Pseudo-Element Selector)

가상 μš”μ†ŒλŠ” μš”μ†Œμ˜ νŠΉμ • 뢀뢄에 μŠ€νƒ€μΌμ„ μ μš©ν•˜κΈ° μœ„ν•˜μ—¬ μ‚¬μš©

  • μš”μ†Œ μ½˜ν…μΈ μ˜ μ²«κΈ€μž λ˜λŠ” 첫쀄

  • μš”μ†Œ 콘첸츠의 μ•ž λ˜λŠ” λ’€

μ‚¬μš©λ²• μ…€λ ‰ν„°::pseudo-element { μŠ€νƒ€μΌ κ·œμΉ™}

pseudo-class
Description

::first-letter

μ½˜ν…μΈ μ˜ μ²«κΈ€μžλ₯Ό 선택

::first-line

μ½˜ν…μΈ μ˜ 첫쀄을 선택, 블둝 μš”μ†Œμ—λ§Œ 적용

::after

μ½˜ν…μΈ μ˜ 뒀에 μœ„μΉ˜ν•˜λŠ” 곡간을 선택, 일반적으둜 content ν”„λ‘œνΌν‹°μ™€ ν•¨κ»˜ μ‚¬μš©

::before

μ½˜ν…μΈ μ˜ μ•žμ— μœ„μΉ˜ν•˜λŠ” 곡간을 선택, 일반적으둜 content ν”„λ‘œνΌν‹°μ™€ ν•¨κ»˜ μ‚¬μš©

::selection

λ“œλž˜κ·Έ ν•œ μ½˜ν…μΈ λ₯Ό 선택, iOS Safari λ“± 일뢀 λΈŒλΌμš°μ €μ—μ„œλŠ” λ™μž‘ν•˜μ§€ μ•ŠμŒ

<!DOCTYPE html>
<head>
  <style>
    /* p μš”μ†Œ μ½˜ν…μΈ μ˜ μ²«κΈ€μžλ₯Ό 선택 */
    p::first-letter {
      font-size: 40px;
    }

    /* p μš”μ†Œ μ½˜ν…μΈ μ˜ 첫쀄을 선택 */
    p::first-line {
      color: blue;
    }

    /* h1 μš”μ†Œ μ½˜ν…μΈ μ˜ μ•ž 곡간에 content μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 μ‚½μž… */
    h1::after {
      content: "HELLO!! ";
      color: red;
    }

    /* h1 μš”μ†Œ μ½˜ν…μΈ μ˜ λ‘£ 곡간에 content μ–΄νŠΈλ¦¬λ·°νŠΈ 값을 μ‚½μž… */
    h1::before {
      content: " WORLD!!";
      color: green;
    }

    /* p μš”μ†Œ 쀑 λ“œλž˜κ·Έν•œ μ½˜ν…μΈ λ₯Ό 선택 */
    p::selection {
      background: yellow;
    }
  </style>
</head>
<body>
  <h1>제λͺ©μž…λ‹ˆλ‹€.</h1>
  <p>
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Explicabo illum
    sunt distinctio sed, tempore,<br />
    repellat rerum et ea laborum voluptatum! Quisquam error fugiat debitis
    maiores officiis, tenetur ullam amet in!
  </p>
</body>

PseudoElementSelector


μ°Έκ³ 

poiemaweb 2-2 μ…€λ ‰ν„° λ„μ„œ - HTML + CSS + μžλ°”μŠ€ν¬λ¦½νŠΈ μ›Ή ν‘œμ€€μ˜ 정석


πŸ‘†

πŸ“… 2022-07-10

Last updated