css (cascading style sheets)
- 웹페이지 스타일 및 레이아웃을 정의하는 스타일시트 언어
- 웹사이트 사용자가 html문서에 작성된 콘텐츠를 잘 이해할 수 있도록 돕는 역할
프론트엔드 개발자에게 요구되는 css역량
- 컴포넌트 기능별로 묶어서 제작
- 화면의 구성이나 배치 (레이아웃 디자인)
- 굵은 글씨와 같은 타이포그래피와 색상을 적용하는 일
- (선택) 정렬이나 배색에 대한 감각
- (선택) UX에 대해 고민해보고 UX가 잘 적용된 웹이나 앱을 분석해 본 경험

셀렉터: id & 클래스
id
- #으로 선택
- 한 문서에 단 하나의 요소에만 적용
- 특정 요소에 이름을 붙이는 데 사용
class
- .으로 선택
- 동일한 값을 갖는 요소 많음
- 스타일의 분류(classification)에 사용
스타일링
- 굵기 :
font-weight
- 밑줄, 가로줄: `text-decoration'
- 자간:
letter-spacing
- 행간:
line-height
정렬
text-align
: left
,right
,center
,justify
절대단위 vs 상대단위
절대단위: px, pt
상대단위: %, em, rem, ch, vw, vh 등
- 글꼴 사이즈 정할 때
- 환경에 영향받지 않는 절대적 크기로 정하는 경우
: px
- 일반적인 경우
: 상대 단위인 rem
사용 (브라우저의 기본 글자 크기가 1rem이며 두 배로 크게 하고싶다면 2rem, em
은 부모 엘리먼트에 따라 상대적 크기가 변경되므로 계산이 어려운 반면 rem
은 root의 글자 크기에 따라서만 상대적으로 변함)
- 화면 사이즈 정할 때
- 반응형 웹(responsive web)에서 기준점 만들 때
: iphone 12 Pro Max 의 너비는 414px, 보통 450px 미만의 너비를 갖는 디바이스는 세로 모드로 생각하면 됨
- 화면 너비나 높이에 따른 상대적 크기가 중요할 때
: vw
(viewport width), vh
(viewport height) -> 화면을 가득 채우며 딱 떨어지게 스크롤 되는 사이트는 100vw
, 100vh
로 구현한 것
박스모델

줄 바꿈이 되는 박스(block) vs 옆으로 붙는 박스(inline, inline block)
- block
- 대표적인 예:<div>
, <p>
- inline
- 대표적인 예: <span>
,a
,img
width
, height
속성이 적용되지 않음

- inline-block 박스
- inline 박스처럼 다른 요소의 옆으로 붙으면서 자체적으로 고유의 크기를 가짐
width
, height
속성이 적용됨

| block | inline-block | inline |
---|
줄바꿈 여부 | O | X | X |
기본 너비값 | 100% | 글자가 차지하는 만큼 | 글자가 차지하는 만큼 |
width, height 사용가능여부 | O | O | X |
박스 구성 요소

p {
border: 1px solid tomato;
}
p {
margin: 10px 20px 30px 40px;
}
padding
overflow
- 콘텐츠가 박스를 뚫고 나가는 경우 박스 안에 스크롤을 추가하여 콘텐츠를 확인할 수 있게 함
overflow
의 auto
값은 콘텐츠가 넘치는 경우 스크롤을 생성하도록 함. 넘치는 콘텐츠의 내용을 보여주고 싶지 않을 경우 overflow
속성에 hidden
값을 사용함
overflow-x
, overflow-y
box-sizing: border-box
-> 박스의 여백과 테두리를 포함한 크기로 자동 계산됨
content-box
vs border-box

css selector
<header>
<p>
<span>
<p></p>
</span>
</p>
<p>
<span>
<p></p>
</span>
</p>
</header>
자식 셀렉터
header > p {}
- 첫번째로 입력한 요소의 바로 아래 자식인 요소
<header>
요소 바로 아래 있는 두 개의 <p>
요소는 선택되지만 <span>
요소의 자식인 <p>
요소는 선택되지 않음
후손 셀렉터
- `header p {}
- 첫번째로 입력한 요소의 후손
<header>
요소 바로 아래 있는 두 개의 <p>
요소와 <span>
요소 자식인 <p>
요소까지 선택됨
형제 셀렉터
section ~p {}
- 같은 부모를 공유하면서 첫 버너쨰 입력한 요소 뒤에 오는 두번째 입력한 요소 모두를 선택
<header>
<section></section>
<p></p>
<p></p>
<p></p>
</header>
인접 형제 셀렉터
section + p {}
- 같은 부모 요소를 공유하면서 첫번째 입력한 요소 바로 뒤에 오는 두번째 입력한 요소를 선택
<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 {} // 사용불가능한 상태일때 선택
- 구조 가상 클래스 셀렉터
p:first-child { }
ul > li:last-child { }
ul > li:nth-child(2n) { } // 짝수
section > p:nth-child(2n+1) { } // 홀수
ul > li:first-child { }
li:last-child { }
div > div:nth-child(4) { }
div:nth-last-child(2) { } // 같은 형제 중 끝에서 2번째
section > p:nth-last-child(2n + 1) { } // 같은 형제 중에서 끝에서 홀수
p:first-of-type { }
div:last-of-type { }
ul:nth-of-type(2) { }
p:nth-last-of-type(1) { }
- 부정 셀렉터
input:not([type="password"]) { }
div:not(:nth-of-type(2)) { }
- 적합성 확인 셀렉터
input[type="text"]:valid { }
input[type="text"]:invalid { }
헷갈리는 셀렉터 작성방법
#container.mx-auto {…}
: id가 container이면서 동시에 class가 mx-auto인 엘리먼트를 선택
#container .mx-auto {...}
: id가 container인 자손 중에 class가 mx-auto인 엘리먼트를 선택