표시 및 정상 흐름

CSS가 없는 페이지에 세 개의 단락과 몇 개의 링크를 넣으면, 여전히 자신들을 배치합니다: 단락들은 페이지 아래로 쌓이고, 링크들은 작성된 텍스트 내에 위치합니다. 아무도 브라우저에 그렇게 하라고 말하지 않았습니다. 첫 번째 레이아웃 규칙을 작성하기 전에, 이미 레이아웃이 존재하고 있으며 나중에 사용하는 모든 기술은 처음부터의 시작이 아닌 변경입니다. 이 장에서는 그 시작점과 이를 관리하는 하나의 속성에 관해 살펴봅니다.
정상 흐름
브라우저가 자신의 레이아웃 CSS 없이 페이지를 배치할 때, **정상 흐름**을 사용합니다: 요소들이 자신을 배치하는 기본 방식입니다. 단락과 제목 같은 블록 요소들은 위에서 아래로 쌓이며, 각각 자신의 줄에 위치합니다. 텍스트와 링크는 줄을 따라 왼쪽에서 오른쪽으로 흐르며, 공간이 부족하면 다음 줄로 줄바꿈합니다.
여러분은 이미 흐르는 요소들을 만났습니다: 이 장은 박스 모델을 기반으로 하는데, 이는 흐르는 것이 바로 그 박스들이기 때문입니다. 정상 흐름은 명명할 가치가 있습니다. 왜냐하면 레이아웃의 다른 모든 것은 이를 기반으로 정의되기 때문입니다. Flexbox, 그리드, 포지셔닝은 모두 "이들을 기본값과 다르게 배치하라"는 것을 의미하므로, 기본값을 아는 것이 변경 사항을 이해하는 데 도움이 됩니다.
블록 박스와 인라인 박스
요소는 정상 흐름에서 두 가지 주요 종류로 나뉩니다. **블록 박스**는 컨테이너의 전체 너비를 차지하고 자신의 줄에 쌓여 다음 요소를 아래로 밀어냅니다. 단락 <p>, 제목 <h1>, 그리고 <div>는 모두 블록이기 때문에 서로 아래에 정렬됩니다.
**인라인 박스**는 다릅니다. 텍스트의 줄 내에 위치하고 콘텐츠가 필요한 만큼만 공간을 차지하므로 여러 개가 한 줄을 공유할 수 있습니다. <span> 또는 링크 <a>는 인라인이므로, 문장 내의 링크는 자신의 줄로 이동하지 않고 단어의 흐름 내에 머물러 있습니다.
<!-- 이 단락은 블록이므로 자신의 줄에 위치합니다 -->
<p>This paragraph is a block, so it sits on its own line.</p>
<!-- 링크는 인라인이므로 문장 내에 머물러 있습니다 -->
<p>Read the <a href="/css/box-model">box model</a> for more.</p><p>와 <div>와 같은 블록 박스는 전체 너비를 차지하고 자신의 줄에 쌓입니다. <span>과 <a>와 같은 인라인 박스는 줄 내에 위치하고 필요한 공간만 차지합니다. 이것이 링크가 문장 내에 머물러 있고 자신의 줄로 나뉘지 않는 이유입니다. display 속성
모든 요소는 기본 종류, 블록 또는 인라인을 가지지만, 여러분은 그것에 국한되지 않습니다. display 속성은 요소가 어떻게 동작할지 변경할 수 있게 합니다. 링크에 display: block을 설정하면 이제 자신의 줄을 차지합니다; 목록 항목에 display: inline을 설정하면 행으로 위치합니다.
일반적인 문제를 해결하는 세 번째 값이 있습니다: display: inline-block. 인라인 박스처럼 줄 내에서 흐르지만, 블록처럼 너비, 높이, 그리고 수직 패딩을 수용합니다. 버튼 또는 네비게이션 알약처럼 이웃 옆에 앉아야 하면서도 여전히 정해진 크기를 가져야 하는 것에 원하는 것입니다.
.nav-link {
display: inline-block; /* 줄 내에서 흐르지만, 너비와 패딩을 수용함 */
padding: 8px 16px; /* 수직 패딩은 이제 작동함. 순수 인라인과 달리 */
}display 속성은 요소가 블록으로 동작하는지 또는 인라인 박스로 동작하는지를 변경합니다. block은 자신의 줄을 차지하고, inline은 텍스트 줄에 앉습니다. 편리한 중간 옵션은 inline-block이며, 이는 줄 내에서 흐르면서도 여전히 너비와 패딩을 수용하므로, 버튼과 네비게이션 링크에 원하는 것입니다. 것들을 숨기기: display none 대 visibility hidden
때때로 요소가 나타나지 않기를 원합니다. 두 가지 방법이 있으며, 그들은 다르게 동작합니다. display: none은 요소를 완전히 제거합니다: 그것은 사라지고 간격을 남기지 않으며, 페이지에 없었던 것처럼 말입니다. visibility: hidden은 그것을 보이지 않게 하지만 공간을 유지하므로, 그것이 있었던 곳에 빈 구멍이 있습니다.
어떤 것을 원하는지는 공간을 돌려받으려고 하는지 여부에 달려 있습니다. display: none을 사용하여 메뉴가 닫힐 때처럼 무언가를 완전히 떨어뜨리세요. visibility: hidden을 사용하여 레이아웃이 점프하지 않기를 원할 때 무언가를 숨기세요. 왜냐하면 그 박스가 여전히 예약되기 때문입니다.
.closed-menu {
display: none; /* 사라지고, 뒤에 간격이 없음 */
}
.placeholder {
visibility: hidden; /* 보이지 않지만, 여전히 공간을 차지함 */
}display: none은 요소를 제거하고 간격을 남기지 않으며, visibility: hidden은 보이지 않게 하지만 공간을 유지합니다. 공간이 없어지기를 원할 때 display: none을 선택하세요. 레이아웃이 점프하지 않기를 원할 때 visibility: hidden을 선택하세요. display가 내부 레이아웃을 변경하는 방법
여러분은 display가 요소를 블록과 인라인 사이를 전환하는 것을 보았습니다. 더 깊은 수준에서 더 많이 합니다. 같은 속성은 컨테이너를 flexbox 또는 그리드로 변환하는 것이며, 이는 행과 열에 자식을 배치하기 위한 두 가지 현대 도구입니다. 지금은, 붙잡아야 할 것은 display가 박스가 레이아웃하는 방식과 자신의 자식들이 그것을 레이아웃하는 방식을 결정하는 하나의 다이얼이라는 것입니다.
레이아웃은 한 번 켜는 하나의 큰 스위치가 아닙니다. 다른 배치가 필요한 특정 컨테이너에서 display를 변경하고, 여러분이 남겨둔 모든 것은 정상 흐름에 머물러 있습니다. flexbox 및 positioning 장은 여기에서 계속됩니다.
display 속성은 컨테이너를 자식을 배치하기 위한 flexbox 또는 그리드로 변환하는 것이기도 합니다. 레이아웃은 한 번 켜는 하나의 스위치가 아닙니다; 이것이 필요한 컨테이너에서 display를 변경하고 나머지를 정상 흐름에 두세요. flexbox 및 positioning 장이 여기에서 계속됩니다. 
