플레이스홀더 vs 라벨

Placeholder vs. Label

플레이스홀더는 입력하는 순간 사라진다 — 라벨을 대신 쓰면 안 되는 이유. 실제 <input>으로 직접 확인해보세요.

다른 이름: Floating label
···
html
<div class="stage">
  <div class="pane bad"><span class="mark">✕</span><span class="label">Before</span>
    <input class="finput" id="bi" readonly>
    <p class="why" id="bw"></p></div>
  <div class="pane good"><span class="mark">✓</span><span class="label">After</span>
    <span class="flabel" id="glabel"></span>
    <input class="finput" id="gi" readonly>
    <p class="why" id="gw"></p></div>
</div>
css
.stage{width:94%;height:88%;display:flex;gap:4%}
.pane{position:relative;flex:1;border-radius:14px;border:1px solid var(--line);background:var(--surface);padding:16px 14px 12px;display:flex;flex-direction:column;justify-content:center;gap:6px}
.mark{position:absolute;top:10px;right:12px;font:800 16px/1 system-ui;color:var(--accent-2)}
.good .mark{color:var(--accent-3)}
.label{position:absolute;top:10px;left:12px;font:700 10px/1 monospace;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.flabel{font:700 11px/1 -apple-system,sans-serif;color:var(--fg)}
.finput{height:30px;border-radius:7px;border:1px solid var(--line);background:var(--bg);padding:0 10px;font:600 13px/1 -apple-system,sans-serif;color:var(--fg);width:100%}
.why{margin:0;font:500 11px/1.3 -apple-system,sans-serif;color:var(--muted)}
js
const bi = document.getElementById('bi'), gi = document.getElementById('gi');
const glabel = document.getElementById('glabel'), bw = document.getElementById('bw'), gw = document.getElementById('gw');
const L = {
  ko: { ph: '이름', val: '홍길동', bw: '입력하면 힌트가 통째로 사라져요', gw: '라벨이 항상 보여서 맥락이 유지돼요' },
  en: { ph: 'Name', val: 'Jordan Lee', bw: 'the hint disappears once you type', gw: 'the label stays visible the whole time' },
};
let lang = 'ko', filled = false;
function paint() {
  const t = L[lang];
  bi.placeholder = t.ph; gi.placeholder = t.ph; glabel.textContent = t.ph;
  bi.value = filled ? t.val : ''; gi.value = filled ? t.val : '';
  bw.textContent = t.bw; gw.textContent = t.gw;
}
paint();
setInterval(() => { filled = !filled; if (!filled) lang = lang === 'ko' ? 'en' : 'ko'; paint(); }, 1700);

플레이스홀더('placeholder')는 입력 전에 보이는 힌트일 뿐, 라벨('label')이 아닙니다. 값을 입력하는 순간 브라우저가 플레이스홀더를 지워버리기 때문에, 라벨 역할까지 맡기면 사용자는 무엇을 입력하던 칸이었는지 곧바로 잊어버립니다.

짧은 폼 하나라면 버틸 만해도, 여러 칸을 채우다 위쪽 칸으로 돌아가거나 자동완성이 값을 채워 넣으면 문제가 커집니다. 스크린리더도 플레이스홀더를 라벨만큼 안정적으로 읽어주지 않습니다.

데모는 실제 input 두 개입니다. 같은 값이 채워져도 ✕ 칸은 힌트가 통째로 사라지고, ✓ 칸은 위 라벨이 그대로 남아 맥락을 지킵니다.

언제 쓰나

짧은 검색창 하나쯤은 플레이스홀더만으로 버틸 수 있지만, 폼에 필드가 2개 이상이면 항상 별도 라벨을 두세요.