프라이싱 테이블

Pricing table

요금제를 카드로 나열하고 하나를 강조해 선택을 유도하며, 월간/연간 토글로 가격을 전환하는 섹션.

다른 이름: Pricing plansPlan comparison cards
···
html
<div class="pricing">
  <div class="toggle" id="toggle"><span class="lbl">Monthly</span><span class="switch"><i id="knob"></i></span><span class="lbl">Yearly</span></div>
  <div class="cards">
    <div class="plan"><h4>Starter</h4><div class="price"><span id="p1">$9</span><small>/mo</small></div><span class="cta">Choose</span></div>
    <div class="plan pop"><span class="badge">Popular</span><h4>Pro</h4><div class="price"><span id="p2">$29</span><small>/mo</small></div><span class="cta">Choose</span></div>
    <div class="plan"><h4>Scale</h4><div class="price"><span id="p3">$79</span><small>/mo</small></div><span class="cta">Choose</span></div>
  </div>
</div>
css
.pricing{width:min(94%,760px);display:flex;flex-direction:column;align-items:center;gap:clamp(8px,2vmin,16px)}
.toggle{display:flex;align-items:center;gap:8px;font-size:clamp(8px,1.5vmin,12px);color:var(--muted)}
.switch{width:clamp(24px,5vmin,36px);height:clamp(13px,2.8vmin,20px);border-radius:999px;background:var(--line);
  position:relative;flex:none}
.switch i{position:absolute;top:10%;left:6%;width:44%;aspect-ratio:1;border-radius:50%;background:var(--accent);
  transition:transform .4s cubic-bezier(.2,.8,.2,1)}
.switch.on i{transform:translateX(90%)}
.cards{display:flex;gap:clamp(6px,1.5vmin,12px);width:100%}
.plan{flex:1;background:var(--surface);border:1px solid var(--line);border-radius:10px;
  padding:clamp(8px,2vmin,16px);display:flex;flex-direction:column;align-items:flex-start;gap:6%;position:relative}
.plan.pop{border-color:var(--accent);box-shadow:0 8px 20px color-mix(in oklab,var(--accent) 30%,transparent);
  transform:translateY(-3%)}
.badge{position:absolute;top:-9px;right:8%;font-size:clamp(6px,1.1vmin,9px);font-weight:700;color:#fff;
  background:var(--accent);padding:.2em .7em;border-radius:999px}
.plan h4{margin:0;font-size:clamp(8px,1.6vmin,12px);color:var(--muted);font-weight:600}
.price{font-size:clamp(13px,3.4vmin,24px);font-weight:800}
.price small{font-size:.4em;color:var(--muted);font-weight:500}
.cta{margin-top:auto;align-self:stretch;text-align:center;font-size:clamp(7px,1.4vmin,11px);font-weight:700;
  padding:.5em 0;border-radius:6px;background:var(--line);color:var(--fg)}
.plan.pop .cta{background:var(--accent);color:#fff}
js
const monthly = { p1: '$9', p2: '$29', p3: '$79' };
const yearly = { p1: '$7', p2: '$23', p3: '$63' };
const knob = document.getElementById('knob');
let isYearly = false;
function render() {
  const prices = isYearly ? yearly : monthly;
  Object.keys(prices).forEach(function (id) {
    document.getElementById(id).textContent = prices[id];
  });
  knob.parentElement.classList.toggle('on', isYearly);
}
render();
setInterval(function () {
  isYearly = !isYearly;
  render();
}, 2400);

보통 2~4개의 카드를 나란히 두고, 그중 하나(대개 중간 가격대)를 "가장 인기" 배지와 함께 살짝 크게·다른 색으로 강조합니다. 이 강조가 바로 넛지(nudge) 역할을 해서 사람들이 극단(제일 싸거나 제일 비싼 것)보다 중간을 더 많이 고르게 만듭니다.

월간/연간 토글은 전환 즉시 모든 카드의 가격을 다시 계산해서 보여줘야 하고, 연간을 고르면 "2개월 무료"처럼 할인율을 같이 보여줘야 설득력이 생깁니다. 각 카드는 가격, 대상(누구를 위한 요금제인지 한 줄), 포함 기능 체크리스트, CTA 버튼으로 구성합니다.

기능 체크리스트가 카드마다 다른 순서로 나열되면 비교가 어려워집니다. 모든 카드에서 같은 기능은 같은 줄에 오도록 정렬하세요 — 이게 안 되면 아예 `comparison-table`로 바꾸는 게 낫습니다.

언제 쓰나

요금제가 2~4개로 단순할 때. 기능 차이가 많아 줄줄이 비교해야 한다면 `comparison-table`이 더 명확합니다.