데이터 테이블

Data table

행과 열로 정리된 데이터를 보여주고, 흔히 헤더를 눌러 정렬하거나 행을 선택할 수 있는 표.

다른 이름: TableData gridGrid view
···
html
<table class="dt">
  <thead><tr><th scope="col" id="dth" aria-sort="ascending"><button>이름 <i>↑</i></button></th><th scope="col">역할</th><th scope="col">상태</th></tr></thead>
  <tbody id="dtb">
    <tr><td>김서연</td><td>디자이너</td><td><span class="pill on">활성</span></td></tr>
    <tr><td>박도윤</td><td>개발자</td><td><span class="pill on">활성</span></td></tr>
    <tr><td>이하은</td><td>PM</td><td><span class="pill off">휴면</span></td></tr>
    <tr><td>최서준</td><td>디자이너</td><td><span class="pill on">활성</span></td></tr>
  </tbody>
</table>
css
.dt{border-collapse:collapse;width:min(280px,94%);font-size:11px}
.dt th{text-align:left;padding:7px 9px;border-bottom:1px solid var(--line);color:var(--muted);font-weight:600}
.dt th button{border:0;background:none;color:inherit;font:inherit;cursor:pointer;display:flex;gap:4px;align-items:center}
.dt th i{font-style:normal;color:var(--accent);transition:transform .2s}
.dt td{padding:7px 9px;border-bottom:1px solid var(--line);color:var(--fg)}
.pill{font-size:9px;font-weight:700;padding:2px 7px;border-radius:999px}
.pill.on{background:color-mix(in srgb, #18c29c 20%, transparent);color:#0f9d78}
.pill.off{background:var(--line);color:var(--muted)}
tr{transition:transform .3s ease}
js
const tbody = document.getElementById('dtb'), th = document.getElementById('dth'), icon = th.querySelector('i');
let asc = true;
function sortRows() {
  const rows = [...tbody.querySelectorAll('tr')];
  rows.sort((a, b) => {
    const av = a.children[0].textContent, bv = b.children[0].textContent;
    return asc ? av.localeCompare(bv, 'ko') : bv.localeCompare(av, 'ko');
  });
  rows.forEach((r) => tbody.appendChild(r));
  th.setAttribute('aria-sort', asc ? 'ascending' : 'descending');
  icon.textContent = asc ? '↑' : '↓';
}
sortRows();
th.querySelector('button').addEventListener('click', () => { asc = !asc; sortRows(); });
setInterval(() => { asc = !asc; sortRows(); }, 1800);

div로 표를 흉내 내지 말고 진짜 <table>/<th scope="col">를 씁니다 — 스크린리더는 실제 표 마크업이라야 "3행 2열, 이름 열"처럼 셀의 위치를 안내할 수 있습니다. 정렬 가능한 헤더는 버튼으로 감싸고 aria-sort="ascending"/"descending"/"none"을 헤더 셀(th)에 둡니다.

카드형 목록과 비교됩니다 — 데이터 테이블은 여러 속성(이름, 역할, 상태, 날짜…)을 같은 열로 정렬해 한눈에 비교하기 좋고, 카드 목록은 항목 하나하나를 이미지·설명과 함께 더 풍부하게 보여줄 때 좋습니다. 행이 아주 많으면 보통 페이지네이션과 짝을 이룹니다.

좁은 화면에서는 열을 통째로 줄이기보다, 덜 중요한 열을 접어 각 행을 세로 카드처럼 펼치는 반응형 패턴을 흔히 씁니다.