css의 기본 배치방법을 normal flow라고 부릅니다.
normal flow는 Block Formatting Context, Inline Formatting Context, relative positioning으로 구성되어 있습니다.
relative positioning은 레이아웃 파트 position에서 다루므로 제외하고, 앞의 두 가지를 살펴보겠습니다.
block요소들이 배치되는 환경과 관련된 규칙들입니다.
inline요소들이 배치되는 환경과 관련된 규칙들입니다.
위에 설명한 block, inline box들은 자기 자신에게 적용되는 outer display 입니다.
새롭게 나온 flow display들(예를 들면 flex, grid)은 자기 자신의 직계 자식에게 영향을 미치는 inner display 입니다.
즉, 직계 자식의 배치에 영향을 미치는 것인데 이는 layout 파트에서 다루겠습니다.
레이아웃과 공간을 만드는 역할을 합니다. 수많은 종류가 있고, 역사적으로 css가 잘 발달하지 않았을 때부터 존재했기에 대부분의 속성들이 html 태그가 애초에 갖고 있는 속성들을 의미하기도 합니다. 전부 공부하기보다 자주 쓰이고 의미있을 법한 것들만 추려보았습니다.
BFC 성격을 가진 속성입니다.
IFC 성격을 가진 속성입니다.
기본적으로는 inline이지만 box-model을 가지는 속성입니다.
새로운 BFC를 만들어 내는 속성입니다.
.clearfix 핵을 대신할 수 있습니다. 단.. IE는 미지원입니다.
레이아웃 챕터에서 다룹니다.
box sizing
박스의 크기는 기본적으로 content의 width값이 width값으로 되지만, 우리는 일반적으로 border까지 width값으로 생각하는 경향이 있습니다. 우리가 일반적으로 생각하는 방향대로 코딩하기 위해서 즉, 매번 content's width + padding value + border value를 하지 않으려면 box-sizing 속성으로 width값 계산 방식을 바꿀 수 있습니다.
html {
box-sizing: border-box;
}
*, *::before, *::after {
box-sizing: inherit;
}
여백. 박스 주변의 보이지 않는 공간이며, 다른 요소들을 밀어냅니다.
.box {
margin-top: -40px;
margin-right: 30px;
margin-bottom: 40px;
margin-left: 4em;
}
마진 병합은 두 개의 요소(부모와 자식 혹은 자식 간에) 사이에 margin이 서로 적용되어 있다면, 두 요소의 margin value의 total이 아니라 둘 중에 더 큰 값으로 적용되는 현상을 말합니다.
버그가 아니라 애초에 의도된 설정입니다. 보통 자식과 자식 간의 간격은 일정하길 바라는대로 동작합니다(Ex: li) 그런데 부모와 자식 간의 마진은 우리가 원하는 바가 아닐 경우가 종종 있어 해결해야 할 경우가 있습니다.
마진 병합 현상이 발생하는 조건
부모 자식 간의 마진 병합 해결하기
방법은 여러 가지입니다. 만능 해결책은 없으며 그 때 그 때 상황에 맞는 해결책을 사용하시면 됩니다.
마진은 음수 값을 가질 수 있습니다. 음수 값을 지정하는 것의 의미는 물론 양수 값의 반대 방향으로 적용되기도 하지만 포인트는 기준 점을 속이는 것입니다.
box-sizing의 값에 따라 width값에 포함될 수도 있고 안될 수도 있습니다.
.box {
border: 1px solid #333333;
border-top-style: dotted;
border-right-width: 20px;
border-bottom-color: hotpink;
}
border-radius
상자의 모서리를 둥글게 하는 속성입니다.
.box {
border: 10px solid rebeccapurple;
border-radius: 1em;
border-top-right-radius: 10% 30%;
}
실제로 공간을 차지하진 않지만 그려집니다. 즉, repaint단계에서 그려지는 속성입니다.
border-radius의 영향을 받으며 ','로 여러 개를 만들어낼 수 있습니다.
여러 개의 속성일 경우 적용되는 순서는 마지막 선언부터 거꾸로입니다.
속성을 'inset 0 0 0 크기 색상'으로 주면 border 안쪽 padding영역에 그려집니다.
.box {box-shadow: 0 0 0 5px black, 0 0 0 10px gold, inset 0 0 0 1px black;}
border 바깥쪽에 위치하지만 이 속성도 공간을 차지하지 않습니다.
border-radius의 영향을 받지 않습니다.
border에서부터 공간을 안으로 밀어냅니다. 음수 값은 없습니다.
공간의 배경을 꾸밀 수 있는 속성입니다. 단지 스타일링만을 위한 이미지 요소를 담는 용도로도 사용됩니다.
스크린리더기가 background는 읽을 수 없기 때문입니다.
다양한 속성이 있지만, 속기를 쓸 때는 아래 내용만 조심해주시면 됩니다.
.box {
background: linear-gradient(105deg, rgba(255,255,255,.2) 39%, rgba(51,56,57,1) 96%) center center / 400px 200px no-repeat,
url(big-star.png) center no-repeat, rebeccapurple;
}
콘텐츠가 부모 박스의 영역을 넘을 정도로 양이 많을 때 어떻게 제어할지를 정하는 속성입니다.
.box {
border: 1px solid #333333;
width: 200px;
height: 100px;
overflow: hidden;
}