반응형

웹 개발을 하다 보면 요소들을 배치하고 정렬하는 일이 필수적입니다. 이러한 작업을 효율적으로 처리하기 위해 CSS는 여러 가지 레이아웃 방식을 제공합니다. 그중 가장 강력하고 유연한 도구 중 하나가 바로 Flexbox(Flexible Box Layout)입니다. 이번 글에서는 HTML 요소를 스타일링할 때 사용하는 CSS의 flex 속성에 대해 자세히 알아보겠습니다.


Flexbox란 무엇인가?

Flexbox는 CSS Flexible Box Layout 모듈의 약자로, 컨테이너 안에 있는 아이템들을 효율적으로 정렬하고 배치할 수 있도록 설계된 CSS 레이아웃 모델입니다. 기존의 float, table, inline-block과 같은 방식보다 훨씬 간단하면서도 강력한 기능을 제공합니다.

주요 특징

  1. 축에 따라 정렬: 아이템들을 수평축(main axis)과 수직축(cross axis) 기준으로 배치합니다.
  2. 유연한 공간 분배: 컨테이너 크기에 따라 아이템 간의 여백과 크기를 자동으로 조정합니다.
  3. 반응형 디자인에 적합: 다양한 화면 크기에 맞춰 레이아웃을 쉽게 조정할 수 있습니다.

Flexbox의 기본 개념

Flexbox는 두 가지 주요 구성 요소로 이루어집니다:

  1. Flex Container: Flexbox 레이아웃을 적용하는 부모 요소입니다.
  2. Flex Items: Flex Container 안에 포함된 자식 요소들입니다.

Flex Container의 속성

Flexbox를 사용하려면 부모 요소에 display: flex 또는 display: inline-flex를 설정해야 합니다. 이 속성을 적용하면 자식 요소들이 자동으로 Flex Items가 됩니다.

<div class="flex-container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
.flex-container {
  display: flex;
}

.item {
  background-color: lightblue;
  border: 1px solid navy;
  padding: 10px;
  margin: 5px;
}

위 코드에서 .flex-container는 Flex Container이고, .item은 Flex Items입니다.


Flexbox 속성 자세히 알아보기

1. flex-direction

flex-direction 속성은 아이템들을 배치할 주 축(main axis)의 방향을 설정합니다.

  • 기본값: row (수평 정렬)
  • 다른 값:
    • row-reverse: 수평 역방향
    • column: 수직 정렬
    • column-reverse: 수직 역방향
.flex-container {
  display: flex;
  flex-direction: column;
}

2. justify-content

justify-content 속성은 주 축(main axis)에서 아이템을 어떻게 정렬할지 결정합니다.

  • 값:
    • flex-start (기본값): 아이템들을 왼쪽으로 정렬
    • flex-end: 아이템들을 오른쪽으로 정렬
    • center: 아이템들을 중앙에 정렬
    • space-between: 첫 번째와 마지막 아이템은 끝으로, 나머지는 균등 배치
    • space-around: 아이템 간 균등 배치 (양쪽 여백 포함)
.flex-container {
  display: flex;
  justify-content: center;
}

3. align-items

align-items 속성은 교차 축(cross axis)에서 아이템을 어떻게 정렬할지 결정합니다.

  • 값:
    • stretch (기본값): 아이템을 컨테이너 높이에 맞게 늘림
    • flex-start: 위쪽 정렬
    • flex-end: 아래쪽 정렬
    • center: 중앙 정렬
    • baseline: 텍스트 기준선에 맞춰 정렬
.flex-container {
  display: flex;
  align-items: flex-end;
}

4. flex-wrap

flex-wrap 속성은 아이템들이 컨테이너 크기를 넘어갈 경우 줄 바꿈을 할지 여부를 결정합니다.

  • 값:
    • nowrap (기본값): 한 줄에 모두 배치
    • wrap: 여러 줄로 배치
    • wrap-reverse: 줄 바꿈 순서를 반대로
.flex-container {
  display: flex;
  flex-wrap: wrap;
}

5. align-content

align-content 속성은 여러 줄로 배치된 아이템들이 교차 축에서 어떻게 정렬될지 결정합니다. (단, 아이템이 여러 줄일 경우에만 적용)

  • 값:
    • stretch (기본값): 줄을 컨테이너 높이에 맞게 늘림
    • flex-start: 위쪽 정렬
    • flex-end: 아래쪽 정렬
    • center: 중앙 정렬
    • space-between: 첫 줄과 마지막 줄을 양 끝에 배치
    • space-around: 줄 간 균등 배치
.flex-container {
  display: flex;
  flex-wrap: wrap;
  align-content: center;
}

Flex Item의 속성

1. order

order 속성은 아이템의 순서를 조정합니다. 기본값은 0이며, 숫자가 낮을수록 먼저 배치됩니다.

.item {
  order: 1;
}

2. flex-grow

flex-grow 속성은 남은 공간을 아이템이 차지할 비율을 설정합니다.

  • 기본값: 0 (남은 공간을 차지하지 않음)
.item {
  flex-grow: 2;
}

3. flex-shrink

flex-shrink 속성은 컨테이너 크기가 줄어들 때 아이템의 축소 비율을 설정합니다.

  • 기본값: 1 (축소 가능)
.item {
  flex-shrink: 0;
}

4. flex-basis

flex-basis 속성은 아이템의 기본 크기를 설정합니다.

  • 기본값: auto
.item {
  flex-basis: 200px;
}

5. flex (단축 속성)

flex는 flex-grow, flex-shrink, flex-basis를 한꺼번에 설정할 수 있는 단축 속성입니다.

.item {
  flex: 1 0 auto;
}

Flexbox의 실전 활용

1. 간단한 내비게이션 바

<nav class="navbar">
  <div class="logo">Logo</div>
  <ul class="menu">
    <li>Home</li>
    <li>About</li>
    <li>Contact</li>
  </ul>
</nav>
.navbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.menu {
  display: flex;
  list-style: none;
}

.menu li {
  margin: 0 10px;
}

2. 카드 레이아웃

<div class="card-container">
  <div class="card">Card 1</div>
  <div class="card">Card 2</div>
  <div class="card">Card 3</div>
</div>
.card-container {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.card {
  flex: 1 1 calc(33.333% - 20px);
  background-color: lightgray;
  padding: 20px;
  text-align: center;
}

마무리

CSS Flexbox는 다양한 레이아웃 문제를 간단히 해결할 수 있는 강력한 도구입니다. flex-direction, justify-content, align-items 등 핵심 속성을 이해하고 활용하면 더 깔끔하고 반응형인 웹 디자인을 구현할 수 있습니다. Flexbox의 기초부터 심화까지 숙달하면 개발 생산성이 크게 향상될 것입니다. 꼭 실습하며 익혀보세요!

반응형

+ Recent posts