Flexbox로 만드는 사이드바 레이아웃 안정성 높이기
- .playground 컨테이너:
- background-color: aqua;: 컨테이너의 배경색을 청록색으로 설정합니다.
- border-radius: 10px;: 컨테이너의 모서리를 둥글게 10px로 설정합니다.
- padding: 10px;: 컨테이너 내부의 여백을 10px로 설정합니다.
- display: flex;: 플렉스 박스 레이아웃을 사용하여 자식 요소들을 배치합니다.
- min-height: 400px;: 컨테이너의 최소 높이를 400px로 설정합니다.
- gap: 10px;: 플렉스 항목 사이의 간격을 10px로 설정합니다.
- .contents와 .sidebar 공통 스타일:
- background-color: mediumaquamarine;: 배경색을 중간 아쿠아마린으로 설정합니다.
- color: lime;: 텍스트 색상을 라임색으로 설정합니다.
- font-size: 40px;: 글자 크기를 40px로 설정합니다.
- border: 6px solid green;: 테두리를 초록색 실선 6px로 설정합니다.
- border-radius: 10px;: 모서리를 둥글게 10px로 설정합니다.
.sidebar 스타일:
- width: 180px;: 사이드바의 너비를 180px로 고정합니다.
- min-width: 180px;: 사이드바의 최소 너비를 180px로 설정하여, 사이드바의 너비가 줄어들지 않도록 합니다.
- .contents 스타일:
- flex-grow: 1;: 남은 공간을 차지하도록 설정합니다. .sidebar 요소가 고정 너비를 차지한 후, .contents 요소가 남은 공간을 모두 차지하게 됩니다.
- flex-basis: 0;: 초기 크기를 0으로 설정하여 남은 공간을 최대한 활용합니다. 이렇게 하면 .contents 요소가 플렉스 컨테이너의 나머지 공간을 차지하도록 유연하게 조정됩니다. =>sidebar의 영역을 침법하지 않음
이 설정을 통해 .sidebar 요소는 고정된 너비 180px를 가지며, .contents 요소는 남은 공간을 차지하게 되어 유동적으로 크기가 조정됩니다.
if) contents내 크기가 과하게 큰 자식요소로 인해 부모컨테이너의 안정성이 깨진다면?
->즉 내부컨텐츠가 부모의 너비에 영향을 끼치지 않게끔 하려면 어떻게 해야 하는가?
sol) min-width를 0으로 설정
-> .contents 요소의 최소 너비를 0으로 설정해 .contents 요소가 부모 컨테이너의 크기에 맞춰 줄어들 수 있습니다.
-내부 컨텐츠는 안정성이 보장된 레이아웃 내에서 배치되는 것이다
- width: 180px;: .sidebar 요소의 너비를 180px로 고정합니다. 이 설정으로 사이드바는 항상 180px 너비를 가지며, 너비가 조정되지 않습니다.
- flex-grow: 1;: 이 속성은 .contents 요소가 플렉스 컨테이너의 남은 공간을 모두 차지하도록 설정합니다. 플렉스 컨테이너 내에서 .contents 요소는 가능한 한 많은 공간을 차지합니다.
- flex-basis: 0;: 이 속성은 플렉스 항목의 기본 크기를 설정합니다. flex-basis: 0;는 .contents 요소의 기본 크기를 0으로 설정하여, 플렉스 컨테이너 내에서 가능한 모든 남은 공간을 차지하도록 합니다. 이 설정은 flex-grow 속성에 의해 .contents 요소가 늘어날 수 있도록 합니다.
- min-width: 0;: 이 속성은 .contents 요소의 최소 너비를 0으로 설정합니다. 이를 통해 .contents 요소가 부모 컨테이너의 크기에 맞춰 줄어들 수 있습니다. 만약 이 속성이 없다면, .contents 요소는 기본적으로 최소 너비를 유지하려 할 수 있어 플렉스 레이아웃에서 예상하지 못한 동작을 할 수 있습니다.
이 설정은 .sidebar 요소의 너비를 고정하고, .contents 요소가 플렉스 컨테이너의 남은 모든 공간을 차지하도록 합니다. .contents 요소는 기본 크기를 0으로 설정하고, 최소 너비를 0으로 설정하여, 사이드바의 너비를 초과하는 공간을 차지할 수 있습니다. flex-grow 속성 덕분에 .contents 요소는 사이드바의 너비를 제외한 모든 공간을 차지하게 됩니다.
이렇게 설정하면 사이드바는 항상 180px 너비를 유지하고, .contents 요소는 그 나머지 공간을 유동적으로 채우게 됩니다. .contents 요소의 크기가 부모 컨테이너의 크기에 맞춰 조정되며, 너무 커지지 않고 자연스럽게 레이아웃이 조정됩니다.
flex-grow: 1 => 가용 공간 가득 채우라. 이제 flex-basis를 곁들인... flex-basis: 0 => 내부 콘텐츠 크기 + grow 가 아닌, grow로만 너비가 결정될 수 있도록 함. min-width: 0 => 내부 콘텐츠가 부모의 너비에 영향을 끼치지 않게끔 처리함.