오늘은 CSS의 최고봉! Flexbox에 알아보는 시간이었다. Flexbox는 다양한 경우의 수가 많기 때문에 구현을 해보면서 익히는 게 최고라고 생각한다. 그리고 이번 유닛에는 과제가 있는데... 그것은 바로! 계산기 목업 만들기ㅎㅎ
오늘은 3시까지는 레이아웃, Flexbox에 대해 공부하고 3시 이후부터는 페어랑 만나서 해당 과제에 대해서 고민을 했는데 아무래도 다음주 월요일까지 시간이 있기에 오늘은 코드스테이츠에서 준 소스 코드 분석하고 다음주부터 본격적으로 만들기로 하였습니다.
진짜 여기에 있다보니 일주일이 너무 빠르네요 ^^; 주말에는 코드스테이츠, 정처기 복습 열심히 해야 할 거 같습니닷. 오늘 하루도 잘 마무리 하면서 주말에도 화이팅~!
★하드코딩이 아닌 변수를 이용한 데이터 관리★
// JavaScript 어딘가에는 tweet 내용이 담긴 객체가 존재합니다.
let tweet = { user: '김코딩', content: 'SNS는 인생의...' }
---
★하드코딩한 HTML 문서★
<!-- 실제로는 어떤 로직에 의해서 적절한 위치에 값이 들어가게 됩니다. -->
<div class="writer">김코딩</div>
<div class="content">SNS는 인생의...</div>
// 각 숫자의 2단을 소스 코드에 모두 출력하는 하드코딩의 예
console.log('2 x 1 = 2')
console.log('2 x 2 = 4')
console.log('2 x 3 = 6')
console.log('2 x 4 = 8')
대부분의 콘텐츠의 흐름은 좌에서 우, 위에서 아래로 흐른다. CSS로 화면을 구분할 때는 수직 분할과 수평 분할을 차례대로 적용하여 콘텐츠의 흐름을 따라 작업을 진행한다.
[수직 분할] 화면을 수직으로 구분하여, 콘텐츠가 가로로 배치될 수 있도록 요소를 배치한다.
[수평 분할] 분할된 각각의 요소를 수평으로 구분하여, 내부 콘텐츠가 세로로 배치될 수 있도록 요소를 배치한다.
height
속성을 추가하면, 수평 분할을 보다 직관적으로 할 수 있다.레이아웃 적용 예시
1. 다음과 같은 이미지를 큰 틀에서 추상화를 한다.
2. 추상화를 하게 되면 아래와 같은 결과가 나온다.
3. CSS로 화면을 구분할 때는 수직 분할과 수평 분할을 차례로 적용한다. HTML의 경우는 아래와 같이 구성한다.
<div id="container">
<div class="col w10">
<div class="icon">아이콘 1</div>
<div class="icon">아이콘 2</div>
<div class="icon">아이콘 3</div>
</div>
<div class="col w20">
<div class="row h40">영역1</div>
<div class="row h40">영역2</div>
<div class="row h20">영역3</div>
</div>
<div class="col w70">
<div class="row h80">영역4</div>
<div class="row h20">영역5</div>
</div>
</div>
4. 클래스 이름에 맞게 CSS를 구현한다.
.w70 { width: 70%; }
.h40 { height: 40%; }
* {
box-sizing: border-box;
}
body {
margin: 0;
padding: 0;
}
display: flex;
를 자식 요소가 아닌 부모 요소에 적용해야 함을 이해한다.flex-direction
을 이용하여 요소를 정렬할 방향을 결정할 수 있다.justify-content
와 align-itmes
를 이용하여 수평-수직 정렬을 결정할 수 있다.flex-grow
를 이용하여 요소를 얼마나 늘릴 것인지 결정할 수 있다.flex-basis
를 이용하여 요소의 기본 크기를 결정할 수 있다.dispaly: flex
는 부모 박스 요소에 적용해, 자식 박스의 방향과 크기를 결정하는 레이아웃 구성 방법이다. flex-direction
: 정렬 축 정하기flex-wrap
: 줄 바꿈 설정하기flex-content
: 축 수평 방향 정렬align-items
: 축 수직 방향 정렬flex
속성에는 세 가지 값을 지정해줄 수 있다.flex: <grow(팽창 지수)> <shrink(수축 지수)> <basis(기본 크기)>
flex
속성을 따로 설정해주지 않으면 다음과 같은 기본값이 적용된다.flex: 0 1 auto;
flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;
flex-grow
속성과 flex-shrink
속성을 함께 사용하는 일은 추천하지 않는다.
flex-grow
속성 또는 flex: <grow> 1 auto
와 같이 grow
속성에 변화를 주는 방식을 권장한다.flex-shrink
속성은 width
나 이후 설명할 flex-basis
속성에 따른 비율이므로 실제 크기를 예측하기가 어렵다.flex-grow
속성으로 비율을 변경하는 경우, flex-shrink
속성은 기본값인 1로 두어도 무방하다.flex-grow속성의 값이 0인 경우에만 flex-basis
속성의 값이 유지된다.
display
속성에 flex
가 적용된 컨테이너 내부에 존재하는 자식 박스는 경우에 따라, basis
로 설정된 크가가 항상 유지되는 것은 아니다. flex-grow
속성의 값이 양수일 경우, 늘어나면서 flex-basis
속성에 적용한 값보다 커질 수 있다.
width
와 flex-basis
를 동시에 적용하는 경우, flex-basis
가 우선된다.
콘텐츠가 많아 자식 박스가 넘치는 경우, width
가 정확한 크기를 보장하지 않는다.
(flex-basis
를 사용하지 않는다면) 콘텐츠가 많아 자식 박스가 넘치는 경우를 대비해, width
대신 max-width
를 쓸 수 있다.