ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Css] 기초 복습
    Css 2022. 10. 20. 16:04

    poiemaweb에서 html, css와 같은 기본 문법에 대해 복습하던 중 헷갈리거나 제대로 알지 못했던 부분들이 있어 기록으로 남기고자 한다.

     

     

    웹 프로그래밍 튜토리얼 | PoiemaWeb

    Front-end Development Tutorial

    poiemaweb.com

     


    1. Selector

    style을 적용하고자하는 HTML 요소를 특정할 때에 우리는 selector를 사용한다.

    selector의 종류에 대해 자세히 알지 못하면 우리는 class를 남발하며 코드는 복잡해지고 읽기 어려워진다.

     

    그렇기에 selector에 대해 제대로 알아갈 필요가 있다.

     

    (1) 전체 셀렉터 (Universal Selector)

    전체 셀렉터는 웬만하면 사용을 지양하는 편이라 존재를 까먹곤 한다.

    패턴 Description
    * HTML 문서 내의 모든 요소를 선택한다. html 요소를 포함한 모든 요소가 선택된다. (head 요소도 포함된다)

     

    (2) 어트리뷰트 셀렉터 (Attribute Selector)

    패턴 Description
    셀렉터[어트리뷰트] 지정된 어트리뷰트를 갖는 모든 요소를 선택한다.
      <style>
        /* a 요소 중에 href 어트리뷰트를 갖는 모든 요소 */
        a[href] { color: red; }
      </style>

     

     

    패턴 Description
    셀렉터[어트리뷰트=”값”] 지정된 어트리뷰트를 가지며 지정된 값과 어트리뷰트의 값이 일치하는 모든 요소를 선택한다.
      <style>
        /* a 요소 중에 target 어트리뷰트의 값이 "_blank"인 모든 요소 */
        a[target="_blank"] { color: red; }
      </style>

     

     

    패턴 Description
    셀렉터[어트리뷰트~=”값”] 지정된 어트리뷰트의 값이 지정된 값을 (공백으로 분리된) 단어로 포함하는 요소를 선택한다.
      <style>
        /* h1 요소 중에 title 어트리뷰트 값에 "first"를 단어로 포함하는 요소 */
        h1[title~="first"] { color: red; }
      </style>

     

     

    패턴 Description
    셀렉터[어트리뷰트|=”값”] 지정된 어트리뷰트의 값과 일치하거나 지정 어트리뷰트 값 뒤 연이은 하이픈(“값-“)으로 시작하는 요소를 선택한다.
      <style>
        /* p 요소 중에 lang 어트리뷰트 값이 "en"과 일치하거나 "en-"로 시작하는 요소 */
        p[lang|="en"] { color: red; }
      </style>

     

     

    패턴 Description
    셀렉터[어트리뷰트^=”값”] 지정된 어트리뷰트 값으로 시작하는 요소를 선택한다.
      <style>
        /* a 요소 중에 href 어트리뷰트 값이 "https://"로 시작하는 요소 */
        a[href^="https://"] { color: red; }
      </style>

     

     

    패턴 Description
    셀렉터[어트리뷰트$=”값”] 지정된 어트리뷰트 값으로 끝나는 요소를 선택한다.
      <style>
        /* a 요소 중에 href 어트리뷰트 값이 ".html"로 끝나는 요소 */
        a[href$=".html"] { color: red; }
      </style>

     

    패턴 Description
    셀렉터[어트리뷰트*=”값”] 지정된 어트리뷰트 값을 포함하는 요소를 선택한다.
      <style>
        /* div 요소 중에서 class 어트리뷰트 값에 "test"를 포함하는 요소 */
        div[class*="test"] { color: red; }
        /* div 요소 중에서 class 어트리뷰트 값에 "test"를 단어로 포함하는 요소 */
        div[class~="test"] { background-color: yellow; }
      </style>

     

     

    (3) 복합 셀렉터 (Combinator)

    (3-1) 자식 셀렉터 (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>

    Heading

    paragraph 1

    paragraph 2

    paragraph 3

    paragraph 4

     

    (3-2) 형제(동위) 셀렉터 (Sibling Combinator)

    형제(동위) 셀렉터는 형제 관계(동위 관계)에서 뒤에 위치하는 요소를 선택할 때 사용한다.

     

    [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>
        <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>
    A div element.
    • Coffee
    • Tea
    • Milk

    The first paragraph.

    • Coffee
    • Tea
    • Milk

    Another list

    • Coffee
    • Tea
    • Milk

     

    [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>
        <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>
    A div element.
    • Coffee
    • Tea
    • Milk

    The first paragraph.

    • Coffee
    • Tea
    • Milk

    Another list

    • Coffee
    • Tea
    • Milk

     

    (4) 가상 클래스 셀렉터 (Pseudo-Class Selector)

    가상 클래스는 요소의 특정 상태에 따라 스타일을 정의할 때 사용된다. 특정 상태란 예를 들어 다음과 같다.

    - 마우스가 올라와 있을 때
    - 링크를 방문했을 때와 아직 방문하지 않았을 때
    - 포커스가 들어와 있을 때

     

    (4-1) 링크 셀렉터(Link pseudo-classes), 동적 셀렉터(User action pseudo-classes)

    pseudo-class Description
    :link 셀렉터가 방문하지 않은 링크일 때
    :visited 셀렉터가 방문한 링크일 때
    :hover 셀렉터에 마우스가 올라와 있을 때
    :active 셀렉터가 클릭된 상태일 때
    :focus 셀렉터에 포커스가 들어와 있을 때

     

    (4-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: blue;
        }
        /* input 요소가 사용 불가능한 상태일 때,
           input 요소 바로 뒤에 위치하는 인접 형제 span 요소를 선택 */
        input:disabled + span {
          color: gray;
          text-decoration: line-through;
        }
        /* 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>
    Male
    Female
    Neuter
    I have a bicycle
    I have a car
    I have a motorcycle

     

    (4-3) 구조 가상 클래스 셀렉터(Structural pseudo-classes)

    pseudo-class Description
    :first-of-type 셀렉터에 해당하는 요소의 부모 요소의 자식 요소 중 첫번째 등장하는 요소를 선택한다.
    :last-of-type 셀렉터에 해당하는 요소의 부모 요소의 자식 요소 중 마지막에 등장하는 요소를 선택한다.
    :nth-of-type(n) 셀렉터에 해당하는 요소의 부모 요소의 자식 요소 중 앞에서 n번째에 등장하는 요소를 선택한다.
    :nth-last-of-type(n) 셀렉터에 해당하는 요소의 부모 요소의 자식 요소 중 뒤에서 n번째에 등장하는 요소를 선택한다.

     

    (5) 부정 셀렉터(Negation pseudo-class)

    pseudo-class Description
    :not(셀렉터) 셀렉터에 해당하지 않는 모든 요소를 선택한다.
    <!DOCTYPE html>
    <html>
    <head>
      <style>
        /* input 요소 중에서 type 어트리뷰트의 값이 password가 아닌 요소를 선택 */
        input:not([type=password]) {
          background: yellow;
        }
      </style>
    </head>
    <body>
      <input type="text" value="Text input">
      <input type="email" value="email input">
      <input type="password" value="Password input">
    </body>
    </html>

     

    (6) 정합성 체크 셀렉터(validity pseudo-class)

    pseudo-class Description
    :valid(셀렉터) 정합성 검증이 성공한 input 요소 또는 form 요소를 선택한다.
    :invalid(셀렉터) 정합성 검증이 실패한 input 요소 또는 form 요소를 선택한다.
    <!DOCTYPE html>
    <html>
    <head>
      <style>
        input[type="text"]:valid {
          background-color: greenyellow;
        }
    
        input[type="text"]:invalid {
          background-color: red;
        }
      </style>
    </head>
    <body>
      <label>입력값이 반드시 필요
        <input type="text" required>
      </label>
      <br>
      <label>특수문자를 포함하지 않는 4자리 문자 또는 숫자
        <input type="text" value="ab1!"
          pattern="[a-zA-Z0-9]{4}" required>
      </label>
      <br>
      <label>핸드폰 번호 형식
        <input type="text" value="010-1111-2222"
          pattern="^\d{3}-\d{3,4}-\d{4}$" required>
      </label>
    </body>
    </html>


     

    (7) 가상 요소 셀렉터 (Pseudo-Element Selector)

    가상 요소는 요소의 특정 부분에 스타일을 적용하기 위하여 사용된다. 특정 부분이란 예를 들어 다음과 같다.

    가상 요소에는 두개의 콜론(::)을 사용한다. CSS 표준에 의해 미리 정의된 이름이 있기 때문에 임의의 이름을 사용할 수 없다.

    pseudo-element Description
    ::first-letter 콘텐츠의 첫글자를 선택한다.
    ::first-line 콘텐츠의 첫줄을 선택한다. 블록 요소에만 적용할 수 있다.
    ::after 콘텐츠의 뒤에 위치하는 공간을 선택한다. 일반적으로 content 프로퍼티와 함께 사용된다.
    ::before 콘텐츠의 앞에 위치하는 공간을 선택한다. 일반적으로 content 프로퍼티와 함께 사용된다.
    ::selection 드래그한 콘텐츠를 선택한다. iOS Safari 등 일부 브라우저에서 동작 않는다.

     


     

    2. Box Model

    (1) border 프로퍼티

    (1-1) border-style

    border-style 프로퍼티는 테두리 선의 스타일을 지정한다.

    <!DOCTYPE html>
    <html>
      <head>
        <style>
          p {
            background: palegreen;
            padding: 10px;
          }
          p.dotted { border-style: dotted; }
          p.dashed { border-style: dashed; }
          p.solid  { border-style: solid; }
          p.double { border-style: double; }
          p.groove { border-style: groove; }
          p.ridge  { border-style: ridge; }
          p.inset  { border-style: inset; }
          p.outset { border-style: outset; }
          p.none   { border-style: none; }
          p.hidden { border-style: hidden; }
          p.mix    { border-style: dotted dashed solid double; }
        </style>
      </head>
      <body>
        <h2>border-style Property</h2>
    
        <p class="dotted">dotted</p>
        <p class="dashed">dashed</p>
        <p class="solid">solid</p>
        <p class="double">double</p>
        <p class="groove">groove</p>
        <p class="ridge">ridge</p>
        <p class="inset">inset</p>
        <p class="outset">outset</p>
        <p class="none">none</p>
        <p class="hidden">hidden</p>
        <p class="mix">dotted dashed solid double</p>
      </body>
    </html>

    border-style Property

    dotted

    dashed

    solid

    double

    groove

    ridge

    inset

    outset

    none

    dotted dashed solid double

     

    프로퍼티 값의 갯수에 따라 4개 방향(top, right, left, bottom)에 대하여 지정이 가능하다.

    <!DOCTYPE html>
    <html>
    <head>
      <style>
        p {
          background: palegreen;
          padding: 10px;
        }
        p.d1 {
          /* four sides */
          border-style: dashed;
        }
        p.d2 {
          /* horizontal | vertical */
          border-style: dotted solid;
        }
        p.d3 {
          /* top | horizontal | bottom */
          border-style: hidden double dashed;
        }
        p.d4 {
          /* top | right | bottom | left */
          border-style: none solid dotted dashed;
        }
      </style>
    </head>
    <body>
      <p class="d1">border-style: dashed;</p>
      <p class="d2">border-style: dotted solid;</p>
      <p class="d3">border-style: hidden double dashed;</p>
      <p class="d4">border-style: none solid dotted dashed;</p>
      </body>
    </html>

    border-style: dashed;

    border-style: dotted solid;

    border-style: hidden double dashed;

    border-style: none solid dotted dashed;

     

    border-color 또한 동일하게 값의 갯수에 따라 4개 방향(top, right, left, bottom)에 대하여 지정이 가능하다.

    border-color 프로퍼티는 border-style과 함께 사용하지 않으면 적용되지 않는다.

     

    (2) border

    border 프로퍼티는 border-width, border-style, border-color를 한번에 설정하기 위한 shorthand 프로퍼티이다.

    border: border-width border-style border-color;

     


     

    3. Display

    (1) visibility 프로퍼티

    visibility 프로퍼티는 요소를 보이게 할 것인지 보이지 않게 할 것인지를 정의한다. 즉, 요소의 렌더링 여부를 결정한다.

    프로퍼티값 Description
    visible 해당 요소를 보이게 한다 (기본값)
    hidden 해당 요소를 보이지 않게 한다.
    display: none;은 해당 요소의 공간까지 사라지게 하지만 visibility: hidden;은 해당 요소의 공간은 사라지지 않고 남아있게 된다.
    collapse table 요소에 사용하며 행이나 열을 보이지 않게 한다.
    none table 요소의 row나 column을 보이지 않게 한다.
    IE, 파이어폭스에서만 동작하며 크롬에서는 hidden과 동일하게 동작한다.
    <!DOCTYPE html>
    <html>
    <head>
      <style>
        .visible { visibility: visible; }
        .hidden  { visibility: hidden; }
    
        table, td { border: 1px solid black; }
        .collapse { visibility: collapse; }
        /* .collapse { visibility: hidden; } */
      </style>
    </head>
    <body>
      <h1 class="visible">visibility: visible</h1>
      <h1 class="hidden">visibility: hidden</h1>
      <h1 style="display:none">display:none</h1>
    
      <table>
        <tr>
          <td>A</td>
          <td>B</td>
        </tr>
        <tr class="collapse">
          <td>C</td>
          <td>D</td>
        </tr>
      </table>
    </body>
    </html>

    visibility: visible

    visibility: hidden

    display:none

    A B
    C D

     


     

    4. Float

    아래 예제를 보면 float 프로퍼티가 선언된 두개의 자식 요소를 포함하는 부모 요소의 높이가 정상적인 값을 가지지 못하는 문제가 발생한다.

    float 요소는 일반적인 흐름 상에 존재하지 않기 때문에 float 요소의 높이를 알 수 없기 때문인데 이 문제는 부모 요소 이후에 위치하는 요소의 정렬에 문제를 발생시킨다.

    <!DOCTYPE html>
    <html>
    <head>
      <style>
        .container {
          color: white;
          text-align: center;
          padding: 10px;
          background-color: #def0c2;
        }
        .d1, .d2 {
          float: left;
          width: 50%;
          padding: 20px 0;
        }
        .d1 {
          background-color: #59b1f6;
        }
        .d2 {
          background-color: #ffb5b4;
        }
      </style>
    </head>
    <body>
      <div class="container">
        <div class="d1">1</div>
        <div class="d2">2</div>
      </div>
      <div style="background:red;padding:10px;color:white;">3</div>
    </body>
    </html>
    1
    2
    3

     

    이 문제를 해결하는 가장 쉬운 방법은 float 프로퍼티가 선언된 자식 요소의 부모 요소(.container)에 overflow: hidden 프로퍼티를 선언하는 것이다.

    .container {
      ...
      overflow: hidden;
    }
    1
    2
    3

    이 외에도 overflow: hidden;과 함께 많이 사용되는 방법은 ::after 가상 요소 선택자를 이용하는 것이다.

    가상 요소 선택자는 CSS2 문법(:after)과 CSS3 문법(::after)이 있는데 IE8까지 지원하는 CSS2 문법을 사용하는 편이 좋다.

    <!DOCTYPE html>
    <html>
    <head>
      <style>
        .container {
          color: white;
          text-align: center;
          padding: 10px;
          background-color: #def0c2;
          /*overflow: hidden;*/
        }
        .clearfix:after {
          content: "";
          display: block;
          clear: both;
        }
        .d1, .d2 {
          float: left;
          width: 50%;
          padding: 20px 0;
        }
        .d1 {
          background-color: #59b1f6;
        }
        .d2 {
          background-color: #ffb5b4;
        }
      </style>
    </head>
    <body>
      <div class="container clearfix">
        <div class="d1">1</div>
        <div class="d2">2</div>
      </div>
      <div style="background:red;padding:10px;color:white;">3</div>
    </body>
    </html>
    1
    2
    3

     

    보통 clear: both; 방식을 자주 사용했는데 overflow: hidden;으로도 해결이 되는지 처음 알았다.

     


    5. 벤더 프리픽스

    CSS3 표준으로 확정되기 이전 또는 브라우저 개발사가 실험적으로 제공하는 기능을 사용하기 위해서는 벤더 프리픽스(Vendor Prefix)를 사용해야 한다.

     

    브라우저의 버전이 올라감에 따라 벤더 프리픽스를 사용하지 않아도 될 수 있다. 그러나 구형 브라우저를 지원하기 위하여 벤더 프리픽스를 사용해야 할 필요가 있다.

     

    많은 브라우저를 위한 벤더 프리픽스를 사용하는 것은 코드의 양을 늘게 하고 또한 브라우저는 거의 매달 업데이트가 이루어지고 있어 불필요한 벤더 프리픽스를 사용할 가능성이 크다.

    사용하지 않아도 되는 벤더 프리픽스를 사용하는 것은 성능에도 영향을 주기 때문에 Prefix Free 라이브러리를 사용하는 것은 매우 유용한 방법이다.

     

    Prefix free: Break free from CSS vendor prefix hell!

    -prefix-free lets you use only unprefixed CSS properties everywhere. It works behind the scenes, adding the current browser’s prefix to any CSS code, only when it’s needed. Test drive Test the prefixing that -prefix-free would do for this browser, by w

    projects.verou.me

     

    사용법은 매우 간단하다. Prefix Free 사이트에서 라이브러리를 다운로드하고 include하기만 하면 이 후에는 벤더 프리픽스없이 모든 CSS를 사용할 수 있다.

    <script src="prefixfree.min.js"></script>
    

     


     

    6. 반응형 웹

    아래의 표는 Media Query의 표현식에서 사용할 수 있는 프로퍼티이다.

    프로퍼티 Description
    width viewport 너비(px)
    height viewport 높이(px)
    device-width 디바이스의 물리적 너비(px)
    device-height 디바이스의 물리적 높이(px)
    orientation 디바이스 방향 (가로 방향: landscape, 세로방향: portrait)
    device-aspect-ratio 디바이스의 물리적 width/height 비율
    color 디바이스에서 표현 가능한 최대 색상 비트수
    monochrome 흑백 디바이스의 픽셀 당 비트수
    resolution 디바이스 해상도

    orientation을 제외한 모든 프로퍼티는 min/max 접두사를 사용할 수 있다.

Designed by Tistory.