플렉스박스 정렬

Flexbox alignment

`justify-content`(주축)와 `align-items`(교차축)로 플렉스 아이템을 정렬하는 두 축의 규칙.

다른 이름: justify-contentalign-itemsMain axis / cross axis
···
html
<div class="wrap">
  <div class="labels">
    <span class="lbl j" id="jl">justify-content: flex-start</span>
    <span class="lbl a" id="al">align-items: stretch</span>
  </div>
  <div class="box" id="box">
    <div class="chip"><b></b></div>
    <div class="chip"><b></b><b></b><b></b></div>
    <div class="chip"><b></b><b></b></div>
  </div>
</div>
css
.wrap{width:min(92%,560px);display:flex;flex-direction:column;gap:12px;align-items:center}
.labels{display:flex;gap:8px;flex-wrap:wrap;justify-content:center}
.lbl{font:700 clamp(9px,1.6vmin,11px)/1 ui-monospace,monospace;padding:5px 9px;border-radius:6px;
  background:var(--surface);border:1px solid var(--line);color:var(--accent-2);white-space:nowrap}
.lbl.a{color:var(--accent-3)}
.box{width:100%;height:min(62%,190px);border:2px dashed var(--muted);border-radius:10px;padding:10px;
  display:flex;gap:10px;transition:justify-content .6s,align-items .6s}
.chip{width:19%;border-radius:8px;background:var(--accent);color:#fff;display:flex;flex-direction:column;
  justify-content:center;align-items:center;gap:4px;padding:8px 0;transition:background .3s}
.chip b{display:block;width:44%;height:5px;border-radius:3px;background:rgba(255,255,255,.85)}
js
const box = document.getElementById('box');
const jl = document.getElementById('jl');
const al = document.getElementById('al');
const combos = [
  { j: 'flex-start', a: 'stretch' },
  { j: 'center', a: 'flex-start' },
  { j: 'space-between', a: 'center' },
  { j: 'space-around', a: 'flex-end' },
  { j: 'flex-end', a: 'stretch' },
  { j: 'space-evenly', a: 'center' },
];
let i = 0;
function apply() {
  const c = combos[i % combos.length];
  box.style.justifyContent = c.j;
  box.style.alignItems = c.a;
  jl.textContent = 'justify-content: ' + c.j;
  al.textContent = 'align-items: ' + c.a;
  i++;
}
apply();
setInterval(apply, 1900);

플렉스박스에는 축이 두 개 있습니다. `flex-direction: row`일 때 주축(main axis)은 가로, 교차축(cross axis)은 세로입니다. `justify-content`는 주축을 따라 아이템 사이·둘레의 여백을 나누고, `align-items`는 교차축에서 각 아이템의 위치(또는 늘어나는 정도)를 정합니다. 이 둘을 헷갈리면 "왜 정렬이 안 먹히지"의 8할이 설명됩니다 — `flex-direction: column`으로 바꾸는 순간 두 속성의 역할이 통째로 뒤바뀌기 때문입니다.

`align-items`의 기본값은 `stretch`입니다. 아이템에 높이를 명시하지 않으면 교차축 전체를 채우도록 늘어나고, 높이를 주는 순간 그 값이 우선해서 `center`·`flex-start`처럼 자연스러운 크기로 배치됩니다. 이 데모에서 칩마다 내용물(줄 수)이 달라 높이가 제각각인 이유가 그것입니다 — stretch일 때와 아닐 때의 차이가 실제로 보이게 하려고요.

`justify-content`는 `space-between`(양끝 붙이고 사이 균등)·`space-around`(각 아이템 양옆에 균등한 여백, 바깥쪽은 절반)·`space-evenly`(바깥쪽까지 완전히 균등)로 세분화됩니다. 셋의 차이는 "맨 끝 아이템과 컨테이너 가장자리 사이 여백"에서만 드러나므로, 나란히 비교하지 않으면 눈으로 구분하기 어렵습니다.

언제 쓰나

한 줄(또는 한 열)짜리 정렬이면 무조건 이 둘부터 확인하세요. 여러 줄로 줄바꿈되는 레이아웃의 줄 사이 간격은 `align-content`가 따로 맡습니다.