CSS

Min Seong Kim·2022년 7월 3일
0

CSS

  • 웹 페이지 스타일 및 레이아웃을 정의하는 스타일시트 언어이다.
  • 웹 사이트 사용자가 HTML 문서에 작성된 콘텐츠를 잘 이해할 수 있도록 돕는 역할을 한다.

CSS 내용 분해하기

  • 셀렉터는 요소 이름이나 id 또는 클래스를 선택한다.
  • 셀렉터로 특정 요소를 선택했다면 중괄호 안에서 이 요소에 적용할 내용을 작성한다.
  • 요소에 적용할 수 있는 내용을 속성이라고 한다.
  • 색상, 글자 크기 등 다양한 속성이 있다.
  • 속성에 적용할 적절한 값을 입력하여 스타일을 표현한다.
  • 그림에 나타나 있는 color: red;는 이 요소의 색상을 빨간색으로 스타일링한다.
  • 속성과 값의 끝에는 세미콜론(;)을 붙여 속성끼리 구분한다.
  • 하나의 속성만 존재할 때는 세미콜론을 붙이지 않아도 무방하지만 속성과 값을 작성한 다음 세미콜론을 적는 습관을 들이는 것이 좋다.

CSS 파일 추가

  • CSS 파일을 HTML 파일에 연결할 때는 <link> 태그 안에서 href 속성을 통해 파일을 연결한다.
<link rel="stylesheet" href="index.css" />
[코드] link 태그와 link 태그의 속성
  • <link> 요소는 HTML 파일과 다른 파일을 연결하는 목적으로 사용한다.
  • <link> 요소의 rel 은 연결하고자 하는 파일의 역할이나 특징을 나타낸다.
  • CSS(Cascading Style Sheet)는 stylesheet이므로 rel 속성에 stylesheet 를 추가한다.
  • href 속성에는 파일의 위치를 추가해야 한다.
  • 지금 작성한 두 파일은 한 폴더 내에 있으므로 파일 이름만 입력한다.
  • 다른 폴더에 파일이 존재하는 경우 절대 경로 또는 상대 경로를 입력해 원하는 파일을 찾아 연결할 수 있다.

똑같은 구조에 다른 스타일을 적용하면 완전히 다른 스타일로 탈바꿈할 수 있다.
새로운 CSS 파일을 layout.css 라는 이름으로 만들고 다음의 내용을 붙여넣고 이 CSS 파일을 연결하기 위해 새로운 <link> 요소를 추가한다.
layout.css 파일은 index.css 파일과는 달리 HTML 요소를 배치하는 역할을 한다.

<link rel="stylesheet" href="index.css" />
<link rel="stylesheet" href="layout.css" />
[코드] index.html 파일에 새로운 link 요소를 추가한다.

codepen <-작성한 코드 확인

CSS 스타일을 적용할 수 있는 방법은 3가지

  1. 같은 줄에서 스타일을 적용하는 인라인 스타일
  2. CSS 파일 내에 작성하는 내용을 별도의 파일로 구분하지 않고 <style>요소 내에 작성하는 내부 스타일 시트
  3. 외부 스타일 시트

<nav style="background: #eee; color: bule">...</nav>
[코드] css 스타일 적용법 중 인라인 스타일

기본적인 셀렉터 (selector)

id로 이름 붙여서 스타일링 적용하기

  • HTML 문서에는 <h4><p> 요소가 여럿 존재하다
    <h4> 요소에만 색을 바꾸려면 어떻게 해야 할까?
.red{
  color: #ff0000;
  }
[코드] red class의 color 속성에 #ff0000 값을 할당한다.

코드확인

navigation section에만 적용하려고 했던 의도와는 달리 aside section의 <h4> 요소에도 변경한 색상이 적용했고 navigation section 아래의 <h4> 요소를 정확하게 선택하기 위해서는 이 엘리먼트에 id를 붙여서 해결할 수 있다. 이름을 붙일 때는 가능한 의미를 담아서 구분할 수 있도록 한다. id가 있는 요소를 선택할 때는 #기호를 이용한다. id는 하나의 문서에서 한 요소에만 사용해야 한다.

<h4 id="navigation-title">This is the navigation section.</h4>
[코드] h4 요소에 id를 붙인다.
#navigation-title {
  color: red;
}
[코드] id로 요소를 선택해 스타일링한다.

코드확인

class로 스타일을 분류하여 적용하기

id와 유사하게 특정 요소에 class를 지정하는 방법도 있다. 이번에는 navigation section의 자식 <li> 요소에 밑줄을 쳐보려고 한다. 일단 <li> 요소를 선택해 스타일링해보자.

li {
  text-decoration: underline;
}
[코드] li 요소에 밑줄을 한다.

코드확인

동일한 기능을 하는 CSS를 여러 요소에 적용하기 위해서는 class를 사용해야 한다. navigation section의 모든 <li> 요소에 동일한 class를 추가하면 동일한 스타일을 여러 요소에 적용할 수 있다. class는 #이 아닌 .을 이용해 선택해야한다.

<ul>
  <li class="menu-item">Home</li>
  <li class="menu-item">Mac</li>
  <li class="menu-item">iPhone</li>
  <li class="menu-item">iPad</li>
</ul>
[코드] 여러 요소에 같은 스타일링을 적용하기 위해서는 class를 사용한다.
.menu-item {
  text-decoration: underline;
}
[코드] class menu-item을 선택하여 밑줄을 적용한다.

코드확인

여러 개의 class를 하나의 엘리먼트에 적용하기

여러 class를 하나의 요소에 적용해볼려고한다. 여러 class를 하나의 요소에 적용하기 위해서는 띄어쓰기로 적용하려는 class들의 이름을 구분해야한다. 다음 예제를 통해

  • 요소에 2개의 class가 적용된 내용을 확인할 수 있다.

    • 요소를 만들거나 요소에 스타일링을 적용할 때는 항상 이름과 목적이 일치하는지 잘 살펴보자.
    <li class="menu-item selected">Home</li>
    [코드] 하나의 요소에 여러 class를 적용하는 방법
    .selected {
      font-weight: bold;
      color: #009999;
    }
    
    [코드] 특정 클래스(selected)를 통해 요소를 스타일링하는 모습

    id와 class의 차이점을 반드시 기억하기!!!!!

    idclass
    한 문서에 단하나의 요소에만 적용동일한 값을 갖는 요소 많음
    특정 요소에 이름을 붙이는데 사용스타일의 분류(classification)에 사용

    색상

    • 글자의 색상을 변경하는 속성은 color 이다.
    .box {
      color: #155724; /* 글자 색상 */
      background-color: #d4edda; /* 배경 색상 */
      border-color: #c3e6cb; /* 테두리 색상 */
    }

    [코드] 글자, 배경, 테두리의 색상은 각기 다른 속성을 가지고 있다.

    글꼴

    • 글꼴의 속성은 font-family 이다.
    .emphasize {
      font-family: "SF Pro KR", "MalgunGothic", "Verdana";
    }

    [코드] font-family 속성을 통해 글꼴(폰트)을 설정할 수 있습니다.

    • 글꼴의 이름은 따옴표를 붙여서 적용할 수 있다.
    • 사용하려는 글꼴이 존재하지 않거나 디바이스에 따라 지원하지 않을 수 있다.
    • 이런 경우를 대비하여 fallback 글꼴을 추가할 수 있다.
    • fallback은 표현하고 싶은 글꼴이 없거나 사용할 수 없는 경우를 위한 대비책이다.
    • fallback을 위해 여러 글꼴을 사용하는 경우 쉼표로 구분하여 입력할 수 있다.
    • 입력된 순서대로 fallback이 적용됩니다.

    크기

    • 글자의 크기를 변경하기 위해서는 font-size 속성을 사용한다.
    .title {
      font-size: 24px;
    }
    

    [코드] 글자 크기를 24px로 적용한다.

    기타 스타일링

    • 굵기: font-weight
    • 밑줄, 가로줄: text-decoration
    • 자간: letter-spacing
    • 행간: line-height

    정렬

    가로로 정렬할 경우 text-align을 사용하며 유효한 값으로는 left, right, center, justify(양쪽 정렬)가 있다.

    세로로 정렬할 경우에는 문제가 조금 복잡하다. vertical-align 속성을 쉽게 떠올릴 수 있지만 이 속성은 부모 요소의 display 속성이 반드시 table-cell이어야 한다.

    <center>, <font>를 사용하지 말아야 하는 이유

    HTML의 초기에는 스타일을 별개로 정의한다는 컨셉이 없었다. 그래서 <center>가운데 정렬</center> 혹은 <font color="#ff0000">빨간 글자</font>와 같이 사용했다. 그러나 지금은 관심사 분리는 패러다임을 적용하여 더 이상 이 태그(<center>``</center>, <font>``</font>)를 사용하지 않는다.

    관심사 분리: 관심사 분리는 컴퓨터 프로그램을 구별된 부분으로 분리시키는 디자인 원칙으로 각 부문은 개개의 관심사를 해결한다.

    알아야 할 몇 가지 단위

    글꼴 크기, 화면 크기 등 크기를 다룰 때는 크기의 단위가 무엇보다 중요하다. 크기의 단위는 절대 단위와 상대 단위, 두 가지로 구분할 수 있다.

    • 절대 단위: px, pt
    • 상대 단위: %, em, rem, ch, vw, vh

    글꼴 사이즈를 정할 때

    1. 기기나 브라우저 사이즈 등의 환경에 영향을 받지 않는 절대적인 크기로 정하는 경우
      px(픽셀)을 사용한다. 픽셀은 크기가 고정된 절대 단위이기 때문에 사용자 접근성이 불리하다. 글꼴의 크기를 픽셀로 설정하면 작은 글씨를 보기 힘든 사용자가 브라우저의 기본 글꼴 크기를 더 크게 설정하더라도 글꼴의 크기는 항상 설정된 픽셀로 고정된다.

    2. 일반적인 경우
      상대 단위인 rem을 추천한다. root의 글자 크기, 즉 브라우저의 기본 글자 크기가 1rem이며 두 배로 크게 하고 싶다면 2rem, 작게 하려면 0.8rem 등으로 조절해서 사용할 수 있다. 이는 사용자가 설정한 기본 글꼴 크기를 따르므로 접근성에 유리하다.

    박스모델

    • 박스는 항상 직사각형이고 너비(width)와 높이(height)를 가진다.
    • CSS를 이용해 속성과 값으로 그 크기를 설정한다.

    줄 바꿈이 되는 박스(block) vs. 옆으로 붙는 박스(inline, inline-block)

    • block 요소의 대표적인 예: <div>, <p>
    • inline 요소의 대표적인 예: <span>

    block, inline-block, inline의 특징

    박스를 구성하는 요소

    • border(테두리)를 기준으로 padding(안쪽 여백)과 margin(바깥 여백)이 있다.
      border(테두리)를 기준으로 padding(안쪽 여백)과 margin(바깥 여백)이 있다.

    border (테두리)

    • 개발 과정에서도 매우 의미 있게 사용이 가능하며 각 영역이 차지하는 크기를 파악할 수 있으며 또한 레이아웃을 만들면서 그 크기를 시각적으로 확인할 수 있다.
    • 아래 예시 border 속성에 적용된 각각의 값은 테두리 두께(border-width), 테두리 스타일(border-style), 테두리 색상(border-color)이다.
    p {
      border: 1px solid red;
    }

    margin (바깥 여백)

    • 각각의 값은 top, right, bottom, left로 시계방향이다.
    p {
      margin: 10px 20px 30px 40px;
    }
    • 값을 두 개만 넣으면 top과 bottom이 10px, left 및 right가 20px이다.
    p {
      margin: 10px 20px;
    }
    • 값을 하나만 넣으면 모든 방향의 바깥 여백에 적용이 된다.
    p {
      margin: 10px;
    }
    • 방향에 대한 특정한 속성도 있다.
    p {
      margin-top: 10px;
      margin-right: 20px;
      margin-bottom: 30px;
      margin-left: 40px;
    }
    • 마진(바깥 여백)은 음수 값을 지정할 수 있다. 여백에 음수 값을 지정하면 다른 엘리먼트와의 간격이 줄어든다. 극단적으로 적용하면 화면(viewport)에서 아예 사라지게 하거나, 다른 엘리먼트와 겹치게 만들 수도 있다.
    p {
      margin-top: -2rem;
    }

    padding (안쪽 여백)

    • padding은 border를 기준으로 박스 내부의 여백을 지정한다. 값의 순서에 따른 방향은 margin과 동일하게 top, right, bottom, left이다.
    p {
      padding: 10px 20px 30px 40px;
    }
    • 배경색이나 border를 적용하면, 안쪽 여백을 더욱 선명하게 확인할 수 있다.
    p {
      padding: 10px 20px 30px 40px;
      border: 1px solid red;
      background-color: lightyellow;
    }

    박스를 벗어나는 콘텐츠 처리

    • 박스 크기보다 콘텐츠 크기가 더 큰 경우 overflow 속성을 이용한다.
    • overflow: auto; 값은 스크롤을 자동 생성
    • overflow: hidden; 값은 넘치는 콘텐츠를 감춘다.
    • overflow-x, overflow-y 속성은 auto, hidden, scroll 값을 이용해 가로 방향이나 세로 방향으로 스크롤을 지정할 수 있다.
    p {
      height: 40px;
      overflow: auto;
    }

    박스 크기 측정 기준

    • content-box는 박스의 크기를 측정하는 기본값이다. 그러나 대부분의 레이아웃 디자인에서 여백과 테두리를 포함하는 박스 크기 계산법인 border-box를 권장한다.

    레이아웃을 디자인 할 때 모든 요소를 선택하는 셀렉터인 *box-sizing 속성을 추가하고, border-box라는 값을 추가하면 디자인이 훨씬 더 쉽다.

    * {
      box-sizing: border-box;
    }

    CSS Selector

    전체 셀렉터

    • 전체 셀렉터는 문서의 모든 요소를 선택한다.
    * { }

    태그 셀렉터

    • 태그 셀렉터는 같은 태그명을 가진 모든 요소를 선택한다.
    • 복수로도 선택이 가능하다.
    h1 { }
    div { }
    
    section, h1 { }

    ID 셀렉터

    • ID 셀렉터는 #id로 입력하여 선택한다.
    #only { }

    class 셀렉터

    • class 셀렉터는 .class로 입력하여 선택한다.
    • 같은 class 이름을 가진 모든 요소를 선택한다.
    .widget { }
    .center { }
    

    attribute 셀렉터

    • attribute 셀렉터는 같은 속성을 가진 요소를 선택한다.
    a[href] { }
    p[id="only"] { }
    p[class~="out"] { }
    p[class|="out"] { }
    section[id^="sect"] { }
    div[class$="2"] { }
    div[class*="w"] { }

    자식 셀렉터

    자식 셀렉터는 첫 번째로 입력한 요소의 바로 아래 자식인 요소를 선택한다.
    따라서 같은 <p>태그라도 <span> 요소의 자식인 <p>요소는 선택되지 않는다.

    header > p { }
    

    ex)

    <header>
    	<p> <!-- 선택 -->
    		<span>
    			<p></p>
    		</span>
    	</p>
    	<p> <!-- 선택 -->
    		<span>
    			<p></p>
    		</span>
    	</p>
    </header>

    후손 셀렉터

    • 후손 셀렉터는 첫 번째로 입력한 요소의 후손을 선택한다.
    • <header>요소의 자식의 자식인 <p> 요소까지 모두 선택된다.
    header p {}

    ex)

    <header>
    	<p><!-- 선택 -->
    		<span>
    			<p><!-- !!선택!! -->
    			</p>
    		</span>
    	</p>
    	<p><!-- 선택 -->
    		<span>
    			<p><!-- !!선택!! -->
    			</p>
    		</span>
    	</p>
    </header>

    형제 셀렉터

    • 같은 부모 요소를 공유하면서 첫 번째 입력한 요소 뒤에 오는 두 번째 입력한 요소를 모두 선택한다.
    • 아래 예시의 경우 <section> 요소 뒤에 있는 세 개의 <p> 요소를 모두 선택한다.
    section ~ p { }

    ex)

    <header>
    	<section></section>
    	<p></p> <!-- 선택 -->
    	<p></p> <!-- 선택 -->
    	<p></p> <!-- 선택 -->
    </header>

    인접 형제 셀렉터

    • 인접 형제 셀렉터는 같은 부모 요소를 공유하면서 첫 번째 입력한 요소 바로 뒤에 오는 두 번째 입력한 요소를 선택한다.
    • 예시의 경우 <section> 요소 뒤에 있는 세 개의 <p> 요소 중 첫 번째 <p> 요소를 선택한다.
    section + p { }

    ex)

    <header>
    	<section></section>
    	<p></p> <!-- 선택 -->
    	<p></p>
    	<p></p>
    </header>

    기타 셀렉터

    가상 클래스 셀렉터

    • 가상 클래스는 요소의 상태 정보에 기반해 요소를 선택한다.
    a:link { } /*사용자가 방문하지 않은 <a>요소를 선택한다.*/
    a:visited { } /*사용자가 방문한 <a>요소를 선택한다. */
    a:hover { } /* 마우스를 요소 위에 올렸을 때 선택한다. */
    a:active { } /* 활성화 된(클릭된) 상태일 때 선택한다. */
    a:focus { } /* 포커스가 들어와 있을 때 선택한다 */

    UI 요소 상태 셀렉터

    input:checked + span { } /*체크 상태일 때 선택한다. */
    input:enabled + span { } /*사용 가능한 상태일 때 선택한다. */
    input:disabled + span { } /*사용 불가능한 상태일 때 선택한다. */
  • profile
    의미 있는 개발자

    0개의 댓글