잠깐글2. 반응형 테이블

반응형 테이블을 별도의 강좌로 만들기에는 너무 간단한 것같아서, 간단글로 정리해봤습니다.

반응형 테이블

주로 <table>로 구성되는 (데이터) 테이블은, 가로길이가 긴 경우 폭이 좁은 모바일 화면에서 보여주기 쉽지 않습니다. 대부분의 경우, 항목/필드를 열 (세로방향)로 가르고, 목록/데이터는 행 (가로방향)로 보여주게 되는데, 항목이 많아지게 되면 모바일 화면에서 한꺼번에 표시할 수 없습니다. 그런 경우, (기기에 따라서) 테이블의 일부만 보이거나, 테이블 전체를 보여주는 대신 구체적인 내용은 줌을 해야 보이게 됩니다.

_xmuNuzRQ986PUzeLliFh4v7E63pPKh4qRhtEZZ_-LzM9HyctgcobF3rcaDDzlLcDjZllZRj8yEeVXaXJyPMijSs-us6145M9ZIdtm5m_1TZGQ

출처: Chris Coyier - http://css-tricks.com/responsive-data-tables/

반응형 테이블은, 이러한 문제점을 해결하기 위하여, 테이블 형태를 조금 바꾸지만, 원래의 테이블 사용 목적에 맞추어, 조정하는 것을 뜻합니다. 이에 대해서, Chris Coyier가 정리한 글을 기반으로, 그 유형을 다시 정리해봤습니다.

제목 반복형 (또는 Reflow table)

항목이 많아질때 테이블의 폭이 넓어지는 것을 피하기 위한 방법으로, 매 행의 데이터를, 항목별 제목을 반복해가면서 보여주는 형태로 바꾸는 것입니다.

아래는 Chris Coyier의 해결 방법입니다. 보시는대로, 기존에는 한 줄로 나오던 한 사람의 내용을, 항목별 내용으로 세로로 보여주고, 매 사람마다 다른 배경색을 사용해서 가독성을 높이고 있습니다.

lFu2nhUlJxKxthpjpmz6unOxDcyf1fY7QvWOy4QvhPFAiRWPFWRwhEEVn9UytX65Jj-HdXCoL74uiUGmey88jZUQZCXT7vfibNIMJN6rs65BEQ

출처: Chris Coyier - http://css-tricks.com/responsive-data-tables/

Chris Coyier가 사용한 방법은, 테이블의 모든 요소를 block으로 바꾸고, 맨 상단 행인 항목별 제목을 가리고, 적절한 제목이 붙은 <td>를 한줄로 표기하는 것입니다.

@media only screen and (max-width: 760px), (min-device-width: 768px) and (max-device-width: 1024px)  {

        // Force table to not be like tables anymore */
        table, thead, tbody, th, td, tr { 
                display: block; 
        }
        
        // Hide table headers (but not display: none;, for accessibility) */
        thead tr { 
                position: absolute;
                top: -9999px;
                left: -9999px;
        }
        
        tr { border: 1px solid #ccc; }
        
        td { 
                // Behave  like a "row" */
                border: none;
                border-bottom: 1px solid #eee; 
                position: relative;
                padding-left: 50%; 
        }
        
        td:before { 
                // Now like a table header */
                position: absolute;
                /* Top/left values mimic padding */
                top: 6px;
                left: 6px;
                width: 45%; 
                padding-right: 10px; 
                white-space: nowrap;
        }
        
        //
        Label the data
        */
        td:nth-of-type(1):before { content: "First Name"; }
        td:nth-of-type(2):before { content: "Last Name"; }
        td:nth-of-type(3):before { content: "Job Title"; }
        td:nth-of-type(4):before { content: "Favorite Color"; }
        td:nth-of-type(5):before { content: "Wars of Trek?"; }
        td:nth-of-type(6):before { content: "Porn Name"; }
        td:nth-of-type(7):before { content: "Date of Birth"; }
        td:nth-of-type(8):before { content: "Dream Vacation City"; }
        td:nth-of-type(9):before { content: "GPA"; }
        td:nth-of-type(10):before { content: "Arbitrary Data"; }
}

이 방법의 단점은,

  1. IE에서는 table 요소들을 display:block으로 설정하면 의도치 않은 결과가 나올 수 있고
  2. 각 항목의 제목들을 :before 로 하드코딩 해야 한다

는 점입니다.

비슷한 접근 방법으로 Mobifreaks의 방법도 있습니다. 다른 점은, table요소들 대신에 table display 특성들로 설정된 div 요소들을 이용하여 테이블을 구성하는 것 (IE 문제점 해결)과, 항목제목을 :before에 하드코딩하는 것이 아니라, div의 data-label 을 통해서 넘겨주는 것 (CSS 하드코딩 문제점 부분 해결)입니다.

2311
Lorem
Ipsum dolor
22
Web designer
1234567890
.table{
        display:table;
}
.table-head{
        display:table-header-group;
}
.row{
        display:table-row;
}
.column{
        display:table-cell;
}
// Responsive table */
@media all and (max-width: 640px){
        .table,
        .row,
        .column,
        .column:before{
                display:block;        // Converts a table, table row, table column and table column:before into a block element */
        }
        .table-head{
                position:absolute;        // Hides table head but not using display none */
                top:-1000em;
                left:-1000em;
        }
        :
        .column:before{ // prints the value of data-label attribute before the column data */
                font-weight:bold;
                padding-right:20px;
                font-size:12px;
                content:" "attr(data-label)" //";        // call the attribute value of data-label and adds a string // */
        }
}
관련자료
  1. css-tricks: http://css-tricks.com/responsive-data-tables/
  2. Mobifreaks: http://mobifreaks.com/user-interface/responsive-and-seo-friendly-data-tables/
  3. Derek Pennycuffs’ mobile first version: http://jsbin.com/arixic

가로 스크롤 제공형

가로로 스크롤을 제공하여, 필요한 공간을 확보하는 형태입니다. 아래는 테이블의 행과 열을 교체하여, 항목제목은 항상 좌측에 고정하고, 내용을 가로로 스크롤 할 수 있도록 하는 방법입니다.

mqPAFokgFkpvQIEj5U3iYJYVYOEM4OnKlbul2q5XLTcOEjJckf2K_dZ_G2mUnlWVr9fMGO8ReEPUkndqUDxT_IXY_S0WxyPL3YBEdI7l_XDwJA

출처: David Bushell - http://dbushell.com/2012/01/05/responsive-tables-2/

@media only screen and (max-width: 40em) { //640*/
        #rt1 { display: block; position: relative; width: 100%; }
        #rt1 thead { display: block; float: left; }
        #rt1 tbody { display: block; width: auto; position: relative; overflow-x: auto; white-space: nowrap; }
        #rt1 thead tr { display: block; }
        #rt1 th { display: block; }
        #rt1 tbody tr { display: inline-block; vertical-align: top; }
        #rt1 td { display: block; min-height: 1.25em; }
}

참고로 이 방법은, 아이토론시스템 설명 페이지에서 토론레벨별 권한/제약을 보여지는 데에 사용되었습니다.

vtk1xOBKOtfomxvMZS_w86IaOsasYGXmBWPKcLy2FFhwb4UuzC2PbkYqYHHjpgLNQMFIMyekIw1Q9eFJwGOKTZeTLhMFY1yX1DPtTPbFaXYW9A 1OkkM152g0Dyer879MCCFupMLpmc5SGjy9OeCOqpcBgdwbM2qoLIlFbPRC1T4tFS_NqhGHZwxn-lmQ9PwqgGlXx_fXgVeO3KJWadKUCULzu3SQ

각각 테블릿까지 보이는 테이블과, 모바일에서 보이는 반응형 테이블입니다.

또다른 방법으로는, 원 테이블의 행과 열을  그대로두고 항목들을 스크롤 할 수 있도록 제공하는 것입니다. 아래는 zurb가 구현한 가로 스크롤형 반응형 테이블의 구동 원리를 보여주는 그림입니다. zurb는 이를 CSS와 js 화일로 해서 제공하고 있습니다. (github 링크)

_Tsphl6ME8ZhtSPS6IwbbKVl3aTC-6_IJgVcpm27XEArNQpGkD8uWLGVVBrcDqaJ8G_BXOJHSY21qZtJ68nth3ZU3nefHLFdieKC2Las4tSOrg

출처: zurb blog - http://www.zurb.com/article/982/a-new-take-on-responsive-tables

두가지 방법 모두 사용처가 다르기에, 다른 클래스로 지정해서 사용하거나, 사용자가 선택할 수 있도록 제공하는 것도 좋을것 같습니다.

관련자료
  1. David Bushell: http://dbushell.com/2012/01/05/responsive-tables-2/
  2. zurb: http://www.zurb.com/playground/responsive-tables

선택/생략형

또다른 접근 방법으로는, 일부 항목(열)을 선택적으로 가리거나 생략하는 방법입니다.

다음은, 각각 원래 테이블에서 점점 작아지는 스크린에서 보이는 테이블을 보이고 있습니다.

Hef42ol66k98UHKJGIHeClVndxek8q3cqAQ5S6QwXe7-GzjH8w5qwjVL8Va2BRTIbfPHS8CsdEEUwkiNQlFrznoiQ4Lh2vNqYuwfNMHnRDN5gw qsjuYcsnuPAwji6xj9J75z2uZOHyAaKWo63z-UW5GGU6jfYYv1hNW1M1LrkFR-IsbU5ASVgBRexrLvUeH0jsYJFgoyTwetH1L1Z_xaqOQgsZ_Q bglWoyjPbEHYCGBCoyAlImmWRZoy87OGzzBP40u0SLe9NAgsk3GptIh00B5DxxlOfkYZMnnP0r2Fn6DYuS8cG7ser26vY4_dxR-r4TZmoKc03g

출처: Irishstu.com(Stewart Curry) - http://www.irishstu.com/stublog/2011/12/12/tables-and-responsive-design/

원리는 간단하게, 생략하기 원하는 항목(열)의 th를 display:none; visibility:hidden; 로 가리는 것입니다.

하지만, 때로는 사용자가 보기 원하는 항목을 다를 수도 있기에, 사용자가 직접 항목을 선택하는 방법도 제안되었습니다. 반응형 웹 기법/기술을 선도하고 있는 filament group에서 제안한 방법은, 사용자에게 선택권을 주는 방법입니다. 자세한 코드는 원글에 자세히 설명되어 있으니 직접 참조하세요.

QOtEtvAkc3gziEB522qOXFzbOM27To088ZaBFhXCpRj9Zhira89yuXG0bwvk1U02F-Kb7XVA1LX0JOXGSkVwqJa4_e8yhUfjttHCqJ7XMfG1uA

출처: filament group - http://filamentgroup.com/lab/responsive_design_approach_for_complex_multicolumn_data_tables/

관련자료
  1. Stewart Curry: http://www.irishstu.com/stublog/2011/12/13/tables-responsive-design-part-2-nchilds/
  2. filament group: http://filamentgroup.com/lab/responsive_design_approach_for_complex_multicolumn_data_tables/

구조변경형

마지막으로, 원래의 테이블 구조를 포기하고 다른 형태로 변형하는 접근방법도 있습니다.

우선, 간단하게 테이블의 구조를 없애고, 각 항목(열)에 해당하는 내용을 색으로 보여주는 방법입니다. (Brad Czerniak’s Rainbow table)

q6kPpJuoOMcnUHLzLs7R08GyY3AW1oZJ-p9gVIqWqL8FGl40_Uub18YpkwvU1oE0j1tz-lUIQvCEr1qAK9qAKOaiYL2fPkYZi1Vmm6M2pGCuEw

image05.jpg출처: css-tricks.com - http://css-tricks.com/responsive-data-table-roundup/

또다른 방법으로, 테이블을 일종의 썸네일로 보여주고, 한번더 클릭하면 별도의 화면에서 전체 내용을 보여주는 방법입니다. ( Scott Jehl’s 썸네일 방식: http://jsbin.com/apane6/14 )

_RO9M68vphoCWEOW4hh4zIMXU-BcV1H7dSq8VSM5LCQBhwljWp8pZczqU_v1fy15-vR99aQY_ov6-GzJ5T3L0XrUALiz65l_kA0mlzR4ulyUTA

출처: css-tricks.com - http://css-tricks.com/responsive-data-table-roundup/

마지막으로 가장 창의적인 방법으로, 숫자가 들어있는 테이블을 자동으로 파이차트로 변형하는 방법입니다. ( Scott Jehl’s 그래프 전환: http://jsbin.com/emexa4 ) 당연히 숫자내용이 아닌 테이블의 경우는 적용할 수 없습니다.

EhGeiPzWYPU1IH0BHbkGvCFZdF-Cfl1cOj5WKgsnRBnU6LgOEMnoOUAIYOgsAt5qURI9DxbSfZ8LRJBjv3f8Y6M-jurJYOargGbqnb3Cb_gJjQ

출처: css-tricks.com - http://css-tricks.com/responsive-data-table-roundup/

관련자료
  1. Brad Czerniak’s Rainbow table (테이블 형식을 포기, 각 열을 색으로 구분): http://hawidu.com/2011/04/27/another-responsive-data-tables-approach/
  2. Scott Jehl’s 그래프 전환: http://jsbin.com/emexa4
  3. Scott Jehl’s 썸네일 방식: http://jsbin.com/apane6/14

조합/정리된 구현

그밖에 이러한 기법들을 한 곳에 모아서 정리한 것들도 있습니다.

  1. bootstrap 기반으로 1) 생략형, 2) 행열 교체후 가로스크롤 제공형, 3) 제목반복형을 구현+정리함: http://elvery.net/demo/responsive-tables/
  2. jquerymobile에서 제공되는 1) 제목반복형 (reflow table), 2) 선택형의 여러 적용사례 들을 구현함: http://jquerymobile.com/branches/tables/docs/tables/

강좌 내용 원본 링크

구글 문서 링크
B. 반응형 테이블
|

댓글 11개

전 chris coyier 가 제안한 방법이 가장 끌리네요.
수치가 아닌 데이터를 표현하는 방법으로는 좋은것 같습니다.
수치 등, '비교'를 해야 하는 경우는, 가로스크롤 제공형이나 선택형도 괜찮을것 같고요. ^^
zurb방식이 좋네요.엑셀을 써서그런가 ㅎㅎ
자연스럽죠. ^^
잘 봤습니다.감사합니다.
알찬돌삐님, asdfg님, 격려 감사합니다.
Reflow table에 커스텀 데이터를 사용하는 방식 /좋아요~
그래프로 보여지는 방법도 괜찮은거 같네요
브라우저 호환이 다안되는게 조금 아쉽네요 ㅜㅜ
잘 읽고 있습니다. 너무나 감사드려요^^
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
13년 전 조회 1,679
13년 전 조회 642
13년 전 조회 2,360
13년 전 조회 2,102
13년 전 조회 791
13년 전 조회 743
13년 전 조회 3,230
13년 전 조회 1,650
13년 전 조회 670
13년 전 조회 527
13년 전 조회 8,160
13년 전 조회 4,660
13년 전 조회 7,860
13년 전 조회 807
13년 전 조회 1,443
13년 전 조회 1,859
13년 전 조회 1,260
13년 전 조회 2,766
13년 전 조회 975
13년 전 조회 1,188
13년 전 조회 677
13년 전 조회 1,207
13년 전 조회 1,389
13년 전 조회 1.3만
13년 전 조회 1,114
13년 전 조회 4,645
13년 전 조회 1,623
13년 전 조회 671
13년 전 조회 959
13년 전 조회 3,771
13년 전 조회 946
13년 전 조회 4,600
13년 전 조회 690
13년 전 조회 848
13년 전 조회 1,254
13년 전 조회 8,780
13년 전 조회 1,497
13년 전 조회 2,528
13년 전 조회 1,679
13년 전 조회 1,941
13년 전 조회 2,025
13년 전 조회 1,096
13년 전 조회 1,289
13년 전 조회 1.8만
13년 전 조회 2,351
13년 전 조회 4,380
13년 전 조회 1,704
13년 전 조회 2,126
13년 전 조회 2,181
13년 전 조회 1.6만
13년 전 조회 1,104
13년 전 조회 959
13년 전 조회 745
13년 전 조회 1,639
13년 전 조회 3,222
13년 전 조회 3,457
13년 전 조회 2,141
13년 전 조회 5,678
13년 전 조회 2,836
13년 전 조회 6,043
13년 전 조회 1,652
13년 전 조회 2.1만
13년 전 조회 926
13년 전 조회 1,425
13년 전 조회 1.7만
13년 전 조회 2,805
13년 전 조회 1,047
13년 전 조회 3,761
13년 전 조회 1,210
13년 전 조회 1,364
13년 전 조회 813
13년 전 조회 2,544
13년 전 조회 1,530
13년 전 조회 680
13년 전 조회 928
13년 전 조회 7,493
13년 전 조회 2,427
13년 전 조회 959
13년 전 조회 1,332
13년 전 조회 2,902
13년 전 조회 1,052
13년 전 조회 1.9만
13년 전 조회 2,962
13년 전 조회 2,677
13년 전 조회 4,843
13년 전 조회 1,960
13년 전 조회 835
13년 전 조회 1,019
13년 전 조회 1.6만
13년 전 조회 818
13년 전 조회 2,241
13년 전 조회 1,791
13년 전 조회 1,330
13년 전 조회 1,185
13년 전 조회 1,319
13년 전 조회 2.3만
13년 전 조회 2,654
13년 전 조회 2.9만
13년 전 조회 2,223
13년 전 조회 2.3만
🐛 버그신고