컨테이너를 포지셔닝하는 방식들 중, 중요한 개념인 Position과 Float 그리고 Flexbox에 대해 알아보겠습니다.
CSS에서 top
,left
,right
,bottom
,top-left
, top-right
, bottom-left
, bottom-right
를 이용하여 상자의 Position을 바꿀 수 있다. 그러나 나열된 것만으로는 컨테이너의 위치를 바꿀 수는 없다.
position: static
position 속성은 기본값으로 static
이란 값을 가지고 있다.
static은 html에 정의된 순서대로 브라우저 상에서 보여준다는 의미다.
.container {
left: 20px;
top: 20px;
position: relative;
}
position 을 relative로 변경하면, top과 left에서 20px씩 이동한 것을 확인할 수 있다.
relative는 원래(static일 때) 있어야 되는 자리에서 상대적으로 20px씩 이동한다는 의미다.
.container {
left: 20px;
top: 20px;
position: absolute;
}
absolute
는 내 아이템이 담겨있는 박스 안을 기준으로 한다.
즉, 부모 엘리먼트의 컨텐츠를 기점으로 이동한다는 의미다.
.container {
left: 20px;
top: 20px;
position: fixed;
}
fixed
는 부모 엘리먼트를 신경쓰지 않고 window를 기점으로 한다는 의미다.
.container {
left: 20px;
top: 20px;
position: sticky;
}
원래(static일 때)있던 자리에 위치하지만, 스크롤링이 되어도 원래 있던 자리에 붙어있는 것을 의미한다.
float의 원래 목적은 이미지와 텍스트를 어떻게 배치할지에 대한 용도였다.
float: left
float: center
float: right
Felxbox를 이용하면 박스와 아이템들을 행, 열로 자유자재로 배치할 수 있다.
예전에는 모든 브라우저에서 호환 가능하도록 레이아웃을 만들기 위해, Position이나 float 또는 Table을 이용했다. 그러나 너무 복잡했고 item들을 컨텐츠에 상관없이 동일한 크기의 박스로 배치하는 것, 부모 컨텐츠 내부에서 수직 수평 정렬하는 것들이 매우 복잡했다. flexbox로는 매우 편해졌다.
display : flex
flex-direction: row
row-reverse
는 오른쪽->왼쪽 방향으로 아이템을 채운다.column
은 중심축을 위에서 아래로 바꾼다.column-reverse
은 아래->위 방향으로 아이템을 채운다.flex-wrap: nowrap
wrap
을 하면, 우리가 지정한 아이템의 크기로만 한 줄을 채우며, 한 줄을 넘길 경우 다음줄로 넘긴다. 따라서 뷰포트의 크기가 바뀌면 자동으로 줄넘김을 해준다.wrap-reverse
로 하면 래핑을 아래에서 위로 해준다.flex-flow
flex-flow: column nowrap
형식으로 쓸 수 있다.justify-content: flex-start
(정렬)flex-start
다. 수평축이 중심축이면 "왼쪽"에 아이템을 붙이고, 수직축이 중심축이면 "위쪽"부터 아이템을 붙인다.flex-end
수평축이 중심축이면 "오른쪽"에 아이템들을 붙이고, 수직축이 중심축이면 "아래쪽"에 아이템들이 붙는다.space-around
아이템들에게 공간을 부여한다. 수평축이 중심축인 경우 좌우로 공간을 먹이는데, 맨 끝에 있는 요소들은 사이에 위치한 요소들보다 공간을 적게 먹게 된다.(사이에 있는 것들은 주변 요소들이 가지는 공간과 자신의 공간을 합한 너비만큼 떨어져 있다.)space-evenly
모두 균일한 공간을 준다.space-between
끝에 있는 요소는 컨테이너에 딱 붙이고, 중간에 있는 요소들의 간격을 균일하게 만든다.align-items:
center
는 flexbox의 반대축의 중앙에 위치하게 만든다.baseline
은 flexbox의 반대축의 크기를 차지하고 있는 가장 큰 아이템의 중심과 다른 요소들의 중심이 동일 선상에 위치하도록 배치하는 것이다.align-content:
order:0
flex-grow: 0
flex-grow:1
을 주면, 해당 아이템은 flexbox의 남는 공간을 채우기 위해 늘어나게 된다.flex-grow:1
을 주면, flexbox의 남는 공간을 해당 아이템들이 균일하게 늘어나면서 채우게 된다.flex-grow:2
를 주고, 다른 아이템에 flex-grow:1
을 주면, 모든 아이템이 flexbox의 남는 공간을 채우려고 하되, "2"를 준 아이템은 "1"을 준 아이템보다 2배의 크기로 공간을 먹게된다.flex-shrink:0
flex-shrink:1
을 주면, 균일한 크기로 작아진다.flex-shrink:2
를 주고, 다른 요소에 flex-shrink:1
을 주면 2를 준 아이템은 1을 준 것보다 1/2만큼 작아진다.flex-basis: auto
flex-grow
와 flex-shrink
에 정의한대로 움직이게 된다.flex-basis: 60%
처럼 %로 지정하면, 컨테이너 크기의 60%만큼의 크기를 유지하게 된다.align-self
align-self:center
를 하면, 이 속성을 준 아이템만 컨테이너의 반대축 중앙에 위치하게 된다.height: 100% vs height: 100vh
"%"는 컨테이너가 들어있는 부모의 높이를 100%로 채우겠다라는 의미다.
위에서 컨테이너를 100%라고 해도 나타나지 않는다. body의 heigth가 지정되어 있지 않기 때문이다. body를 지정해도 나타나지 않는다. body의 부모인 html의 height가 지정되어 있지 않기 때문이다. body와 html을 모두 100%로 주면, 뷰포트의 높이 모두가 베이지색으로 변경된다.
"100vh"는 부모와 상관없이, 뷰포트에 보이는 높이의 100%라고 쓰겠다는 것이다.