2021.05.01
참고
맹기완 대표님의 코드스피츠를 들으면서 알게된 내용들을 정리한 포스팅입니다.
BFC
, IFC
, position: static | relative
로 그려지는 것을 말합니다.여기서 BFC
와 IFC
란, Normal Flow를 계산하는 방식으로, Block Formatting Context와 Inline Formatting Context를 의미합니다.
position: relative
는 static을 기준으로 상대적으로 이동시키는 것을 말합니다.아래 코드는 Normal Flow에 따라 다음과 같이 렌더링됩니다.
<div>
<div>
HELLO
<span>
WORLD
<div style="background: blue"> </div>
</span>
!!
</div>
</div>
Float
는 BFC나 IFC가 아니라 Line Box
라는 모델로 그려지며, 기존의 BFC 영역을 파기하고 새로운 BFC 영역을 만들어 기존의 BFC 영역 위에 떠있는 것처럼 렌더링됩니다.아래 코드는 Normal Flow에 따라 렌더링되고, 앞서 말했듯 Inline요소는 Float의 영역에 들어가지 못합니다.
<div>
<div style="height: 50px; background: blue;">
<div style="width: 200px; height: 150px; background: rgba(0, 255, 0, 0.5); float: left"></div>
HELLO
<div style="height: 50px; background: skyblue">WORLD</div>
!!
</div>
Line Box
아래 코드는 Line Box에 따라 다음과 같이 렌더링 됩니다.
<div style="width: 500px;">
<div class="left" style="width: 200px; height: 150px">1</div>
<div class="right" style="width: 50px; height: 150px">2</div>
<div class="right" style="width: 50px; height: 100px">3</div>
<div class="left" style="width: 150px; height: 50px">4</div>
<div class="right" style="width: 150px; height: 70px">5</div>
<div class="left" style="width: 150px; height: 50px">6</div>
<div class="left" style="width: 150px; height: 50px">7</div>
</div>
Overflow
overflow: hidden | scroll
인 경우 새로운 BFC를 만듭니다.overflow: hidden | scroll
을 준 영역은 Line Box를 경계로 하기 때문에 Line Box의 width 만큼만 가로길이를 먹게됩니다.Offset
읽기 전용 속성
입니다. 즉, 브라우저가 렌더링하고 나서 나온 결과값이기 때문에 이 offset을 읽기만 하는 건 상관 없지만, JavaScript에서 offset을 바탕으로 레이아웃을 계산하는 작업을 하게 되면 전체 레이아웃을 계속 다시 계산해야하기 때문에(offset은 Geometry 계산이 끝난 결과물이니까) 부하가 많이 생기게되므로 주의가 필요합니다.프레임
이라 합니다.offset parent
를 기준으로 렌더링을 합니다. 예를 들어, position: absolute
인 엘리먼트의 offset parent가 될 수 있는 것은 position: absolute | relative
인 엘리먼트이므로, 해당 position: relative | absolute
인 부모를 재귀적으로 찾아서 올라갈 뿐 DOM의 parent와는 관련이 없습니다.position: relative
는 static의 위치를 조정하는데 쓰이기 보다는 absolute를 감싸는 컨테이너로 주로 사용됩니다.요소
position: absolute
의 기본값은 static과 동일합니다. 따라서 left
와 top
을 주지 않으면 static일 때와 동일한 위치에 렌더링되게 되며, left나 top을 주게 되면 offset parent(position: relative | absolute)
을 찾아서 그걸 기준으로 잡고 렌더링하게 됩니다.
즉 정리해보면, left와 top은 position static일 때, relative일때, absolute일때 각각 다른 계산 함수라고 볼 수 있습니다.
position: static
의 경우: 무시된다.position: relative
의 경우: Normal Flow로 그린 이후에 거리를 계산한다.position: absolute
의 경우: offset parent로부터의 거리를 계산한다.종류
Outside - Normal Flow
Inside
ListItem
Box
Legacy
FlexBox
아래 코드는 FlexBox Item의 order에 따라 다음과 같이 렌더링 됩니다.
<div style="display: flex">
<div style="order:3">1</div>
<div style="order:2">2</div>
<div style="order:1">3</div>
</div>