CSS / Flex / justify-content

Flexbox의 justify-content는 주축 방향에서 아이템 묶음을 정렬하거나 남는 공간을 아이템 사이와 주변에 분배하는 CSS 속성입니다. row에서는 보통 가로, column에서는 보통 세로 방향으로 동작하므로 먼저 flex-direction을 확인해야 합니다. 아이템이 공간을 이미 모두 채우면 값을 바꾸어도 정렬 차이가 보이지 않을 수 있습니다.

정렬 값과 공간 분배 값의 차이

값 남는 공간이 있을 때의 배치
flex-start 주축 시작에 모음
flex-end 주축 끝에 모음
center 아이템 묶음을 주축 가운데에 모음
space-between 첫·끝 아이템을 양끝에 놓고 아이템 사이에 분배
space-around 아이템 주위에 분배, gap이 없으면 아이템 사이는 양끝의 두 배
space-evenly 양끝과 아이템 사이 간격을 같게 분배

현재 기본값은 normal이며 Flex 레이아웃에서는 주축 시작 쪽에 놓이는 동작을 합니다. 목적을 분명히 나타내려면 flex-start 등을 명시할 수 있습니다. 주축 시작은 고정된 왼쪽이 아니며 row-reverse에서는 기본 가로쓰기·ltr 조건에서 오른쪽이 됩니다.

center는 각 아이템의 가운데를 모두 같은 점에 겹치는 설정이 아닙니다. 아이템들을 묶어서 가운데로 옮깁니다. space-between도 컨테이너의 테두리에 직접 붙이는 뜻은 아니며, padding이 있으면 그 안쪽의 배치 공간을 기준으로 합니다.

전체 예제: 같은 크기의 아이템으로 여섯 값 비교

아래 코드를 justify-content.html로 저장한 뒤 브라우저에서 엽니다. 외부 파일은 필요하지 않습니다. 아이템은 각각 40px이고 늘어나지 않게 flex: none을 주었습니다. gap은 지정하지 않아 공간 분배 값 자체의 차이가 드러납니다.

<!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>주축 정렬과 공간 분배 비교</title>
  <style>
    body { margin: 20px; font: 16px/1.6 "Noto Sans KR", sans-serif; color: #203348; }
* { box-sizing: border-box; }
    h1 { font-size: 24px; }
    h2 { margin: 14px 0 6px; font-size: 16px; }
    .samples { max-width: 560px; }
    .box { display: flex; height: 56px; padding: 8px;
      border: 1px solid #84a3b7; background: #edf4f8; }
    .box > span { display: grid; place-items: center; flex: none;
      width: 40px; height: 32px; color: white; background: #176b86; }
    .flex-start { justify-content: flex-start; }
    .flex-end { justify-content: flex-end; }
    .center { justify-content: center; }
    .space-between { justify-content: space-between; }
    .space-around { justify-content: space-around; }
    .space-evenly { justify-content: space-evenly; }
  </style>
</head>
<body>
<h1>justify-content 비교</h1>
<div class="samples">
<h2>flex-start</h2>
<div class="box flex-start"><span>가</span><span>나</span><span>다</span></div>
<h2>flex-end</h2>
<div class="box flex-end"><span>가</span><span>나</span><span>다</span></div>
<h2>center</h2>
<div class="box center"><span>가</span><span>나</span><span>다</span></div>
<h2>space-between</h2>
<div class="box space-between"><span>가</span><span>나</span><span>다</span></div>
<h2>space-around</h2>
<div class="box space-around"><span>가</span><span>나</span><span>다</span></div>
<h2>space-evenly</h2>
<div class="box space-evenly"><span>가</span><span>나</span><span>다</span></div>
</div>
</body>
</html>

flex-start·flex-end·center는 아이템들이 서로 붙은 묶음의 위치만 바뀝니다. space-between은 내부 아이템 사이만 벌어지고, space-around는 양끝에도 여백이 생깁니다. space-evenly는 양끝 여백과 아이템 사이의 거리가 같습니다. 부모를 좁히면 분배할 공간도 함께 줄어듭니다.

flex-start, flex-end, center, space-between, space-around, space-evenly의 아이템 간격을 비교한 브라우저 화면

첫 번째 규칙의 flex-start만 center로 바꾸어 묶음이 가운데로 이동하는지 확인하고 복원하세요. 이번에는 각 상자의 나·다 아이템을 제거해 한 개만 남겨 봅니다. space-between은 시작 쪽에, space-around와 space-evenly는 가운데에 놓이는 차이를 관찰할 수 있습니다. 비교 후 아이템을 복원합니다.

gap·자동 여백·flex-grow가 결과에 주는 영향

항목 사이에 항상 필요한 기본 간격은 gap으로 지정할 수 있습니다. 예제 .box에 gap: 12px를 추가하면 해당 간격을 먼저 확보한 뒤 남은 공간을 정렬·분배합니다. 따라서 gap이 있는 space-around의 실제 아이템 사이 간격은 양끝 여백의 정확한 두 배라고 단정할 수 없습니다. 확인 후 gap 선언을 제거합니다.

아이템에 flex-grow가 적용되어 남는 공간을 모두 소비하면 justify-content가 분배할 공간이 없어집니다. 예제의 flex: none을 flex: 1로 바꾸면 이 차이를 확인할 수 있습니다. center를 주었는데 양끝까지 차 보일 때는 아이템의 flex 설정을 먼저 확인하고, 실습 후 flex: none으로 복원하세요.

주축의 자동 여백도 justify-content보다 먼저 남는 공간을 사용합니다. 예를 들어 마지막 아이템의 margin-inline-start: auto는 가로쓰기 row 배치에서 앞의 아이템과 마지막 아이템을 양쪽으로 나누는 데 쓸 수 있습니다. 이 경우 center의 묶음 정렬과 다르게 보이는 것이 자연스럽습니다.

column의 세로 정렬과 효과가 안 보일 때

전체 예제의 .center 규칙에 아래 설정을 추가하면 같은 center가 세로 방향으로 동작합니다. 높이를 충분히 주어 아이템 합보다 남는 공간이 있어야 합니다. align-items는 이 조건에서 가로 방향의 교차축 정렬을 담당합니다.

.center {
  flex-direction: column;
  height: 240px;
  align-items: flex-start;
}

비교 후 추가한 세 선언을 지우면 원래 가로 정렬로 돌아갑니다. column 컨테이너의 높이가 내용 높이와 같다면 세로 가운데로 옮길 남는 공간이 없습니다. 컨테이너의 실제 높이와 아이템 크기·여백을 개발자 도구에서 확인하세요.

여러 줄의 Flex에서는 각 줄의 아이템을 주축 방향으로 정렬하며, 줄들 사이의 교차축 간격은 align-content의 역할입니다. 아이템 합이 컨테이너보다 큰 넘침 상황에서는 정상적인 양의 공간 분배와 조건이 다르므로 먼저 축소·줄바꿈·크기 제한을 검토하세요. Grid에도 같은 속성이 있지만 정렬 대상과 축의 정의가 다르므로 이 글의 Flex 예제와 구분해야 합니다.

값의 정의와 남는 공간의 처리 순서는 MDN justify-content 문서에서, 주축의 방향은 flex-direction 비교 예제에서 확인할 수 있습니다.