[CSS] 반응형 테이블 만들기

소요 시간: 10분

현대 웹 디자인에서 반응형 테이블은 필수 요소로 자리 잡았습니다. 다양한 디바이스와 화면 크기에 따라 데이터를 최적의 형태로 표시하는 반응형 테이블은 사용자 경험을 극대화하며 접근성을 향상시킵니다. 이 글에서는 반응형 테이블의 중요성과 구현 방법에 대해 자세히 알아보겠습니다.


반응형 테이블

반응형 테이블은 다양한 디바이스와 화면 크기에서 최적의 사용자 경험을 제공하기 위해 자동으로 레이아웃을 조정하는 테이블을 의미합니다. 이러한 테이블은 데스크탑, 태블릿, 모바일 등 각기 다른 환경에서 데이터의 가독성과 접근성을 유지하면서 사용자에게 일관된 인터페이스를 제공합니다.

반응형 테이블은 화면 크기에 따라 열과 행의 표시 방식을 유연하게 변경하고, 터치 기반 상호작용을 지원하여 작은 화면에서도 중요한 정보를 쉽게 찾을 수 있도록 설계됩니다.

반응형 테이블의 중요성을 다음과 같은 측면에서 설명할 수 있습니다

① 접근성과 사용성

반응형 테이블은 다양한 디바이스에서 데이터를 쉽게 볼 수 있도록 하여 접근성과 사용성을 높입니다. 데스크탑, 태블릿, 모바일 등 각기 다른 화면 크기에 맞춰 레이아웃을 자동으로 조정해 사용자에게 최적의 환경을 제공합니다. 이렇게 함으로써 사용자는 화면 크기에 상관없이 불편함 없이 데이터를 열람할 수 있습니다.

또한, 작은 화면에서도 중요한 정보를 빠르고 쉽게 찾을 수 있도록 폰트 크기와 셀 간격을 조정해 가독성을 유지합니다.

② 사용자 경험 향상

반응형 테이블은 터치스크린 환경에서도 원활한 상호작용을 지원하여 사용자 경험을 크게 향상시킵니다.

예를 들어, 터치 기반 스크롤링이나 확대/축소 기능 등을 제공해 사용자 편의를 높입니다.

또한, 중요한 정보를 우선적으로 보여주고 덜 중요한 정보는 숨기거나 접을 수 있어 사용자가 필요한 정보를 신속하게 찾을 수 있게 돕습니다.

③ 디자인 및 일관성

반응형 디자인은 다양한 디바이스와 화면 크기에서 일관된 UI/UX를 제공하여 브랜드 신뢰성을 높입니다. 화면 크기에 따라 테이블의 열과 행이 유연하게 변형되기 때문에 사용자에게 최적의 레이아웃을 제공합니다.

이러한 일관된 디자인은 사용자에게 더욱 전문적이고 신뢰할 수 있는 이미지를 전달합니다.

④ 성능 및 SEO

반응형 디자인은 페이지 로드 속도를 최적화하여 사용자 이탈률을 줄입니다. 특히 모바일 환경에서는 빠른 로드 속도가 중요한 요소로 작용합니다.

또한, 반응형 웹 디자인은 검색 엔진 최적화(SEO)에도 긍정적인 영향을 미칩니다. Google은 반응형 웹사이트를 선호하며, 이는 검색 순위에 긍정적인 영향을 미쳐 더 많은 유입을 기대할 수 있습니다.

⑤ 유지보수 용이성

반응형 디자인을 사용하면 여러 버전의 웹사이트를 유지할 필요가 없어 코드 관리가 간편해지고 유지보수 비용이 절감됩니다. 이는 장기적인 유지보수에 있어 큰 장점으로 작용하며, 기술 발전과 디바이스 다양화에 대비할 수 있는 유연한 웹사이트 구조를 제공합니다.

따라서 반응형 테이블은 사용자 만족도를 높이고 웹사이트의 성능과 접근성을 극대화하는 중요한 UI/UX 요소로 작용합니다.


코드 구현

다음 코드는 CSS 미디어 쿼리를 사용하여 화면 너비가 600픽셀 이하로 줄어들면 테이블 헤더를 숨기고 각 셀 앞에 해당 헤더의 이름을 추가하여 모바일에서도 읽기 쉽게 만듭니다.

HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Responsive Table</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="table-container">
        <table class="responsive-table">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Age</th>
                    <th>Occupation</th>
                    <th>Location</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>John Doe</td>
                    <td>30</td>
                    <td>Engineer</td>
                    <td>New York</td>
                </tr>
                <tr>
                    <td>Jane Smith</td>
                    <td>25</td>
                    <td>Designer</td>
                    <td>Los Angeles</td>
                </tr>
                <tr>
                    <td>Sam Johnson</td>
                    <td>28</td>
                    <td>Developer</td>
                    <td>San Francisco</td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>

테이블 태그만 간략하게 알아보겠습니다.

이 구조는 테이블을 구성하는 기본 요소들을 포함하고 있으며, 각 요소가 어떤 역할을 하는지 설명합니다. 테이블은 <table>, <thead>, <tbody>, <tr>, <th>, <td> 태그들로 구성되며, 각 태그는 테이블의 특정 부분을 정의합니다.

테이블 태그

HTML에서 테이블은 <table> 태그로 시작하여 끝납니다. 이 태그는 테이블 전체를 감싸는 역할을 합니다. 예를 들어:

<table class="responsive-table">

위 코드에서 class="responsive-table"는 CSS 스타일을 적용하기 위해 사용됩니다.

</table>

</table> 태그는 테이블의 끝을 나타냅니다.

테이블 헤더

테이블의 헤더는 <thead> 태그로 정의합니다. 이 태그는 테이블의 머리 부분을 나타내며, <tr> 태그로 행을 만들고, 그 안에 <th> 태그로 각 열의 제목을 정의합니다. 예를 들어, 아래와 같습니다:

<thead>
    <tr>
        <th>Name</th>
        <th>Age</th>
        <th>Occupation</th>
        <th>Location</th>
    </tr>
</thead>

위 코드에서 <thead>는 테이블의 헤더 부분을 나타내고, <tr>은 행(row)을, <th>는 열의 제목을 정의합니다. "Name", "Age", "Occupation", "Location"이 각각 열의 제목입니다.

테이블 본문

테이블의 본문은 <tbody> 태그로 감싸여 있으며, 실제 데이터가 들어가는 부분입니다. <tbody> 안에는 여러 개의 <tr> 태그를 사용하여 행을 만들고, 각 행 내에서 <td> 태그를 사용하여 셀을 정의합니다. 예를 들어:

<tbody>
    <tr>
        <td>John Doe</td>
        <td>30</td>
        <td>Engineer</td>
        <td>New York</td>
    </tr>
    <tr>
        <td>Jane Smith</td>
        <td>25</td>
        <td>Designer</td>
        <td>Los Angeles</td>
    </tr>
    <tr>
        <td>Sam Johnson</td>
        <td>28</td>
        <td>Developer</td>
        <td>San Francisco</td>
    </tr>
</tbody>

위 코드에서 <tbody>는 테이블의 본문을 나타내고, <tr>은 각각의 행을 정의하며, <td>는 각 셀의 데이터를 나타냅니다. 첫 번째 행은 'John Doe', '30', 'Engineer', 'New York'의 데이터를 포함하고, 두 번째 행은 'Jane Smith', '25', 'Designer', 'Los Angeles', 세 번째 행은 'Sam Johnson', '28', 'Developer', 'San Francisco'의 데이터를 포함합니다.

이 구조를 통해 데이터를 행과 열로 정리하여 쉽게 읽을 수 있도록 합니다.

CSS (styles.css)

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

.table-container {
    width: 100%;
    padding: 20px;
}

.responsive-table {
    width: 100%;
    border-collapse: collapse;
    margin: 0 auto;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
}

.responsive-table thead {
    background-color: #009879;
    color: #ffffff;
    text-align: left;
    font-weight: bold;
}

.responsive-table th,
.responsive-table td {
    padding: 12px 15px;
}

.responsive-table tbody tr {
    border-bottom: 1px solid #dddddd;
}

.responsive-table tbody tr:nth-of-type(even) {
    background-color: #f3f3f3;
}

.responsive-table tbody tr:last-of-type {
    border-bottom: 2px solid #009879;
}

@media screen and (max-width: 600px) {
    .responsive-table thead {
        display: none;
    }

    .responsive-table, .responsive-table tbody, .responsive-table tr, .responsive-table td {
        display: block;
        width: 100%;
    }

    .responsive-table tr {
        margin-bottom: 15px;
    }

    .responsive-table td {
        text-align: right;
        padding-left: 50%;
        position: relative;
    }

    .responsive-table td::before {
        content: attr(data-label);
        position: absolute;
        left: 0;
        width: 50%;
        padding-left: 15px;
        font-weight: bold;
        text-align: left;
    }
}

기본 스타일

body {
    font-family: Arial, sans-serif;
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

이 코드는 페이지의 기본 스타일을 설정합니다. 전체 페이지에 Arial 글꼴을 적용하고, 기본 여백과 안쪽 여백을 제거하여 레이아웃이 깔끔하게 보이도록 합니다. box-sizing: border-box는 요소의 크기 계산 방식을 변경하여 패딩과 테두리를 포함한 크기를 지정할 수 있게 합니다.

테이블 컨테이너

.table-container {
    width: 100%;
    padding: 20px;
}

이 코드는 테이블을 감싸는 컨테이너의 스타일을 설정합니다. 컨테이너의 너비를 100%로 설정하여 페이지 전체에 걸치게 하고, 20픽셀의 안쪽 여백을 주어 여유 공간을 만듭니다.

테이블 스타일

.responsive-table {
    width: 100%;
    border-collapse: collapse;
    margin: 0 auto;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
}

이 코드는 테이블 자체에 적용됩니다. 테이블의 너비를 100%로 설정하여 컨테이너에 맞게 확장되고, border-collapse를 사용하여 셀 테두리를 하나로 합칩니다. margin: 0 auto는 테이블을 가운데 정렬하며, box-shadow는 테이블에 약간의 그림자를 추가해 입체감을 줍니다.

테이블 헤더

.responsive-table thead {
    background-color: #009879;
    color: #ffffff;
    text-align: left;
    font-weight: bold;
}

이 코드는 테이블 헤더의 스타일을 설정합니다. 헤더의 배경색을 초록색(#009879)으로 설정하고, 글자 색상을 흰색으로 변경하여 대비를 줍니다. 텍스트를 왼쪽으로 정렬하고, 굵게 표시하여 강조합니다.

테이블 셀

.responsive-table th,
.responsive-table td {
    padding: 12px 15px;
}

이 코드는 테이블 헤더(th)와 셀(td)의 공통 스타일을 설정합니다. 12픽셀의 위아래 여백과 15픽셀의 좌우 여백을 주어 셀 안의 내용이 충분한 공간을 가지도록 합니다.

테이블 행 스타일

.responsive-table tbody tr {
    border-bottom: 1px solid #dddddd;
}

이 코드는 각 테이블 행의 아래에 1픽셀 두께의 회색(#dddddd) 선을 추가하여 행을 구분합니다.

짝수 행 스타일

.responsive-table tbody tr:nth-of-type(even) {
    background-color: #f3f3f3;
}

이 코드는 짝수 행에 연한 회색(#f3f3f3) 배경색을 적용하여 줄무늬 패턴을 만들어 가독성을 높입니다.

마지막 행 스타일

.responsive-table tbody tr:last-of-type {
    border-bottom: 2px solid #009879;
}

이 코드는 마지막 행 아래에 굵은 초록색(#009879) 선을 추가하여 테이블의 끝을 명확히 합니다.

반응형 스타일

@media screen and (max-width: 600px) {
    .responsive-table thead {
        display: none;
    }

    .responsive-table, .responsive-table tbody, .responsive-table tr, .responsive-table td {
        display: block;
        width: 100%;
    }

    .responsive-table tr {
        margin-bottom: 15px;
    }

    .responsive-table td {
        text-align: right;
        padding-left: 50%;
        position: relative;
    }

    .responsive-table td::before {
        content: attr(data-label);
        position: absolute;
        left: 0;
        width: 50%;
        padding-left: 15px;
        font-weight: bold;
        text-align: left;
    }
}

이 코드는 화면 너비가 600픽셀 이하일 때 적용되는 스타일을 정의합니다. 작은 화면에서는 테이블 헤더를 숨기고, 테이블과 그 안의 모든 요소들을 블록 형식으로 표시하여 세로로 쌓이게 합니다. 각 행의 아래에는 15픽셀의 여백을 추가하여 행 간의 간격을 확보합니다.

작은 화면에서 각 셀의 텍스트는 오른쪽으로 정렬되고, 왼쪽에 50%의 여백을 줍니다. 이렇게 하면 셀 앞에 헤더 이름이 표시될 공간을 확보할 수 있습니다. ::before 가상 요소를 사용하여 각 셀 앞에 해당 셀의 헤더 이름을 표시합니다. 이 이름은 data-label 속성에서 가져오며, 셀의 왼쪽에 위치하고 굵은 글자로 표시됩니다. 이렇게 하면 작은 화면에서도 각 셀의 내용이 어떤 헤더에 속하는지 쉽게 알 수 있습니다.


결론

반응형 테이블은 모든 디바이스에서 일관된 사용자 경험을 제공하는 중요한 UI 요소입니다. 이를 통해 접근성, 사용성, 디자인 일관성, 성능, 그리고 SEO 최적화를 동시에 달성할 수 있습니다. 반응형 테이블을 구현함으로써 웹사이트의 전체적인 품질을 한층 높일 수 있습니다.

CSS 리스트