본문 바로가기
frontend/CSS

flexbox wrap & grow (feat. shrink)

by Mr.코딩 2023. 7. 25.

먼저 알아두기

 

[css] flexbox 속성 중 wrap 기능에 대해 알려 줘.

 

bard

 

flexbox 속성 중 wrap 기능은 flex 컨테이너의 내부 요소가 한 줄에 모두 배치되지 않고, 너비가 모자라면 다음 줄로 넘어가서 배치되도록 하는 기능입니다.

wrap 기능을 사용하지 않으면 flex 컨테이너의 내부 요소는 한 줄에 모두 배치됩니다. 이때 내부 요소의 너비가 flex 컨테이너의 너비보다 크면 overflow가 발생합니다.

wrap 기능을 사용하면 flex 컨테이너의 내부 요소는 너비가 모자라면 다음 줄로 넘어가서 배치됩니다. 이때 overflow가 발생하지 않습니다.

wrap 기능을 사용하려면 flex 컨테이너의 flex-wrap 속성에 wrap 속성을 지정합니다.

예를 들어 다음 CSS 코드는 flex 컨테이너의 내부 요소를 한 줄에 모두 배치하지 않고, 너비가 모자라면 다음 줄로 넘어가서 배치합니다.

```css
div {
  display: flex;
  flex-wrap: wrap;
}
```

wrap 기능은 flexbox를 사용하여 다양한 레이아웃을 만들 수 있는 데 도움이 되는 중요한 기능입니다.


chatGTP

 

flexbox의 `flex-wrap` 속성은 아이템들이 한 줄에 모두 배치되지 않고 여러 줄에 걸쳐 배치되는 방법을 지정하는 속성입니다. 이를 통해 flex 컨테이너가 너비를 벗어날 경우 아이템들을 줄바꿈하여 배치할 수 있습니다.

`flex-wrap` 속성은 다음과 같은 값들을 가질 수 있습니다:

1. `nowrap` (기본값): 아이템들을 한 줄에 모두 배치합니다. 아이템들이 flex 컨테이너의 너비를 초과할 경우, 아이템들이 자동으로 축소되어 너비에 맞게 배치됩니다.

2. `wrap`: 아이템들을 여러 줄에 걸쳐 배치합니다. 아이템들이 flex 컨테이너의 너비를 초과할 경우, 줄바꿈이 발생하여 여러 줄로 나누어집니다. 아이템의 크기를 지정하지 않는 경우 여러 줄에 걸쳐 나뉘는 것을 볼 수 있습니다.

3. `wrap-reverse`: `wrap`과 동일하게 아이템들을 여러 줄에 걸쳐 배치하지만, 아이템들의 순서가 역순으로 배치됩니다.

예시 코드를 통해 `flex-wrap` 속성을 사용하는 방법을 살펴보겠습니다:

HTML:
```html
<div class="flex-container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
  <div class="item">6</div>
  <div class="item">7</div>
</div>
```

CSS:
```css
.flex-container {
  display: flex;
  flex-wrap: wrap; /* 아이템들을 여러 줄에 걸쳐 배치 */
  width: 300px; /* flex 컨테이너의 너비를 설정 */
}

.item {
  flex: 0 0 100px; /* 아이템들의 크기를 설정 */
  height: 100px;
  background-color: lightblue;
  margin: 5px;
}
```

위의 코드에서는 `flex-wrap: wrap;` 속성을 사용하여 `.flex-container`에 있는 아이템들이 너비를 초과할 경우 여러 줄에 걸쳐 배치됩니다. `flex: 0 0 100px;` 속성은 각 아이템의 크기를 지정하는데, 여기서는 너비를 100px로 고정하고 유연하지 않게 설정하였습니다.

이렇게 하면 너비가 300px인 flex 컨테이너에 3개의 아이템이 한 줄에 배치되고, 나머지 4개의 아이템은 두 번째 줄로 자동으로 배치되어 나타날 것입니다.


같이 기억할 것

 

* `flex-grow`는 아이템이 부모 요소의 공간을 얼마나 차지할지 지정하는 속성입니다. `flex-grow: 1`을 지정하면 아이템은 부모 요소의 공간을 균등하게 차지합니다. `flex-grow: 2`를 지정하면 아이템은 부모 요소의 공간을 두 배로 차지합니다.

 

* `flex-shrink`는 아이템이 부모 요소의 공간이 줄어들 때 얼마나 줄어들지 지정하는 속성입니다. `flex-shrink: 1`을 지정하면 아이템은 부모 요소의 공간이 줄어들 때 균등하게 줄어듭니다. `flex-shrink: 2`를 지정하면 아이템은 부모 요소의 공간이 줄어들 때 두 배로 줄어듭니다.

 

* `flex-basis`는 아이템의 기본 크기를 지정하는 속성입니다. `flex-basis: 100px`를 지정하면 아이템은 너비가 100px가 됩니다. `flex-basis: 100%`를 지정하면 아이템은 부모 요소의 너비를 100% 차지합니다.


[CSS, flexbox] 만약 하나의 섹션(parent 안에 3개의 자식 아이템이 있다면, .mom {
 display: flex;
}

.child1 {
 flex-grow: 2;
}
.child2 {
 flex-grow: 1;
}
.child3 {
 flex-grow: 3;
}

... 이렇게 작성한다면,

자식 아이템 세 개는 각각 2 대 1 대 3 만큼의 공간을 차지하나?

 

chatGTP

 

네, 맞습니다! 주어진 CSS 코드에 따르면 자식 아이템들은 각각 `flex-grow` 속성에 지정된 비율에 따라 공간을 차지하게 됩니다.

부모 요소인 `.mom`에 `display: flex;`를 설정하면 자식 요소들이 flex 컨테이너가 되어 `flex-grow` 속성을 활용하여 남은 공간을 분배하게 됩니다.

여기서 `.child1`은 `flex-grow: 2;`, `.child2`는 `flex-grow: 1;`, `.child3`은 `flex-grow: 3;`으로 설정되어 있습니다.

이 경우, 남은 공간을 총 2+1+3 = 6으로 나누어 각 자식 아이템이 차지하는 공간을 계산합니다.

- `.child1`: 2 / 6 * 남은 공간
- `.child2`: 1 / 6 * 남은 공간
- `.child3`: 3 / 6 * 남은 공간

따라서 각 자식 아이템은 2/6, 1/6, 3/6의 비율로 공간을 차지하게 됩니다. 또한 이들의 크기는 자식 아이템의 총합이 부모 요소의 크기와 일치하도록 유동적으로 조정될 것입니다.


.mom {
 display: flex;
}

.child1 {
 flex-shrink: 2;
}
.child2 {
flex-shrink: 1;
}
.child3 {
 flex-shrink: 3;
}

... 이렇게 작성한다면,

 

child1은 child2에 비해 두 배 "빨리" 줄어드나?


이때 "빨리" 줄어든다는 표현이 이상하지는 않나?

 

맞습니다. "빨리" 줄어든다는 표현은 애매하고 이해하기 어려운 표현입니다. 올바른 표현은 "빨리"가 아닌 "비율에 따라 더 많이" 또는 "비율에 따라 더 크게" 줄어든다는 것입니다. `flex-shrink` 속성은 비율에 따라 아이템들이 줄어드는 정도를 결정하는데, 비율이 큰 값일수록 더 많이 줄어들게 됩니다.

따라서 올바른 표현은 다음과 같습니다:

- `.child1`: `.child2`에 비해 더 많이 줄어듭니다.
- `.child2`: `.child3`에 비해 더 많이 줄어듭니다.
- `.child3`: 가장 큰 `flex-shrink` 값으로 설정되어 있으므로 다른 자식 아이템들보다 더욱 많이 줄어듭니다.

 


만약 

.child1 {

flex-grow: 2;
 flex-shrink: 2;


}
.child2 {

flex-grow: 1;

flex-shrink: 1;
}
.child3 {

flex-grow: 3;
 flex-shrink: 3;
}

 

이렇게  두 값을 동이하게 작성했다면, 세 아이템이 만약 극단까지 줄어들 경우, 최소 크기에 이르는 시간은 동일하지 않나?

 

chatGTP

네, 맞습니다. 주어진 CSS 코드에 따르면 자식 아이템들은 각각 `flex-shrink` 속성에 지정된 비율에 따라 줄어들게 됩니다. 모든 자식 아이템들의 `flex-shrink` 속성 값이 동일하므로, 모든 아이템들이 극단적으로 줄어들 경우 최소 크기에 이르는 시간은 동일합니다.

각 자식 아이템의 `flex-grow` 값도 설정되어 있으며, 이는 아이템들이 컨테이너의 크기에 따라 얼마나 빠르게 늘어날 수 있는지를 결정하는 속성입니다. 그러나 모든 아이템들의 `flex-grow` 값이 동일하게 2, 1, 3으로 설정되어 있기 때문에 이 또한 모든 아이템들이 동일한 비율로 늘어날 것입니다.

따라서 세 아이템이 극단적으로 줄어들 경우, 최소 크기에 이르는 시간은 동일할 것입니다. 즉, 모든 아이템들은 동일한 비율로 줄어들며, 모든 아이템들이 동일한 시점에서 최소 크기에 도달할 것입니다.


그렇다면, flex-shrink의 기능을 이해하거나 설명하는데 "빨리"라는 표현도 크게 틀린 말은 아니군?

 

네, 맞습니다. "빨리"라는 표현은 `flex-shrink` 속성이 아이템의 크기를 줄이는 속성이라는 개념을 설명하는 데 사용할 수 있습니다. 이렇게 표현하면 비교적 쉽게 이해할 수 있습니다.

`flex-shrink` 속성은 아이템이 flex 컨테이너의 너비를 초과할 경우 얼마나 빨리(비율에 따라) 줄어드는지를 결정합니다. 속성 값이 클수록 아이템이 빨리 줄어들며, 값이 작을수록 느리게 줄어들게 됩니다.

예를 들어, `flex-shrink: 3;`과 `flex-shrink: 1;`을 비교한다면, 전자의 경우 아이템이 더 빨리 줄어들게 되고, 후자의 경우 아이템이 상대적으로 느리게 줄어들게 됩니다.

따라서 "빨리"라는 표현은 `flex-shrink` 속성에 대한 설명이나 이해를 돕는 데 사용될 수 있으며, 크게 틀린 말은 아닙니다. 다만, 더 정확하고 명확한 표현을 사용하는 것이 좋습니다. 예를 들어, "비율에 따라 더 많이" 또는 "비율에 따라 더 크게" 줄어든다는 표현이 더 정확하고 이해하기 쉬울 수 있습니다.


헌데 flexbox 기능을 쓰기 위해서는 부모 섹션 수준에서 플렉스박스 선언을 먼저 해야지? 

 

맞습니다. Flexbox를 사용하려면 flex 컨테이너(부모 요소)에 `display: flex;` 또는 `display: inline-flex;`를 선언해야 합니다. 이렇게 선언된 부모 요소는 자식 요소들을 flex 아이템으로 변환하게 됩니다.

부모 요소에 `display: flex;`를 선언하면 해당 부모 요소와 그 안에 포함된 자식 요소들은 Flexbox 레이아웃 모델을 사용하여 배치되게 됩니다. `display: inline-flex;`는 `display: flex;`와 동일한 방식으로 동작하지만, 부모 요소가 인라인 컨테이너로 동작하는 차이가 있습니다.

예를 들어, 다음과 같이 HTML과 CSS를 작성해보겠습니다.

HTML:
```html
<div class="flex-container">
  <div class="item">아이템 1</div>
  <div class="item">아이템 2</div>
  <div class="item">아이템 3</div>
</div>
```

CSS:
```css
.flex-container {
  display: flex; /* 또는 display: inline-flex; */
  justify-content: space-between;
}

.item {
  padding: 10px;
  border: 1px solid #000;
}
```

위 코드에서 `.flex-container`는 flex 컨테이너로 선언되어 자식 요소들이 Flexbox 레이아웃으로 배치됩니다. `justify-content: space-between;`는 자식 요소들을 좌우로 최대한 분산시켜서 배치하도록 지정한 것입니다.

Flexbox를 사용하기 위해 부모 요소에 `display: flex;` 또는 `display: inline-flex;`를 선언하는 것이 기본적인 방법이며, 이후에 자식 요소들의 배치를 유연하게 제어할 수 있습니다.


"Flexbox 레이아웃 모델을 사용하여 배치된다"는 것은 부모 섹션 (또는 부모 컨테이너) 안에서 (HTML5에서 개발된) flexbox 규칙이 작용하게 된다는 뜻이지?

 

맞습니다. "Flexbox 레이아웃 모델을 사용하여 배치된다"는 부모 요소(부모 섹션 또는 부모 컨테이너)에 `display: flex;` 또는 `display: inline-flex;` 속성이 적용되었을 때, 해당 요소와 그 안에 포함된 자식 요소들이 Flexbox 레이아웃 규칙에 따라 배치된다는 뜻입니다.

Flexbox는 CSS 레이아웃 모델로, 부모 요소에 `display: flex;` 또는 `display: inline-flex;`를 선언하면 자식 요소들이 Flexbox 레이아웃 규칙에 따라 배치됩니다. 이를 통해 요소들을 유연하게 정렬하고 배치할 수 있습니다.

Flexbox 레이아웃 규칙은 주로 부모 요소에 적용되지만, 자식 요소에도 영향을 미치는 경우가 있습니다. 자식 요소들에 대한 배치와 크기 조정을 지정하는 데에도 `flex` 속성 등의 Flexbox 관련 속성들을 사용할 수 있습니다.

따라서 "Flexbox 레이아웃 모델을 사용하여 배치된다"는 문장은 부모 요소에 `display: flex;` 또는 `display: inline-flex;`가 적용되면 해당 요소와 자식 요소들이 Flexbox 규칙에 따라 배치된다는 의미입니다.