table thead 고정과 tbody 스크롤

 

우선 소스코드 다운로드는 상단에서

 

 

참고 1) thead의 td와 th에 position:sticky;를 주는 방법 

velog.io/@drawyourmind/table-thead-%EA%B3%A0%EC%A0%95%EA%B3%BC-tbody-%EC%8A%A4%ED%81%AC%EB%A1%A4

https://scrap.kakaocdn.net/dn/cumhLt/hyJTIMZgky/vk6IR8GVwfeZOQ8JMUKX31/img.png?width=1304&height=598&face=0_0_1304_598,https://scrap.kakaocdn.net/dn/6Oa8a/hyJSjBitCW/IFZ918w0NtXkExpvglSUk0/img.png?width=240&height=261&face=0_0_240_261");"> 

장점 : CSS로만 해결 가능. 간단함
단점 : tr이 한줄이 아니라 2개 이상 될 땐 css로 일일히 설정해야한다. / IE 미지원

 

참고2) thead에 display:table; // thead의 tr에 display:table-row; // tbody에 display:block; height:고정값; overflow-y:auto; // tbody의 tr에 display:table;

stackoverflow.com/questions/62934011/fix-table-thead-in-ie11-while-maintaining-width

장점 : CSS로만 해결 가능. IE 지원
단점 : 보기만 해도 현기증나는 복잡함 / colgroup 무효로 인한 width 재노가다 작업 / 만일 colspan이나 rowspan이 발생한다면..?ㅎㅠㅠ

 

 

img.png

그리하여 만든 새로운 방법은 자바스크립트를 사용하여 thead를 자동으로 추가하고,
그 추가된 thead를 담고 있는 새로운 table은 position이 absolute이며
부모엘리먼트에서 스크롤시 그만큼 스크롤 되게끔 만들거다.
스크롤 할 때 새로 생성된 table은 top으로 움직여도 되고 transform으로 움직여도 되지만 브라우저 성능을 위해서 transform으로 움직이게 할꺼임
물론 난 쫌 친절하니까 top으로 움직이는것도 써놓긴 했음 (주석처리해놓음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 1번 테이블 -->
<div class="부모엘리먼트">
    <table class="티헤드고정시킬테이블 테이블공통스타일">
        <thead></thead>
        <tbody></tbody>
    </table>
</div>
 
<!-- 2번 테이블 -->
<div class="부모엘리먼트">
    <table class="테이블공통스타일">
        <thead></thead>
        <tbody></tbody>
    </table>
</div>
cs

1번테이블과 2번테이블의 차이점은 "티헤드고정시킬테이블"이라는 스타일을 달아주면 자동적으로 스크립트에서 해당 테이블의 thead를 복사 생성하여 부모 엘리먼트에 붙여줄거다.

장점 : 후처리 스타일 노가다 작업을 할 필요가 없다! 우리가 이미 정적으로 만들어놓은것과 완벽하게 동일한게 또 추가되었을 뿐이니까!, 그리고 한 페이지 안에서 여러개의 테이블에 중복 적용 가능하다! 이 모든걸 클래스 하나만 추가한다면 ㅇㅇ

단점 : 스크립트 쓰기 귀찮지만 이정도야 스크립트라고 하기도 민망하지 

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<div class="myDiv">
    <table class="myTable makeFixed">
        <colgroup>
            <col style="width:10%;">
            <col style="width:20%;">
            <col style="width:30%;">
            <col style="width:40%;">
        </colgroup>
        <thead>
            <tr>
                <th>A</th> <th>B</th> <th>C</th> <th>D</th>
            </tr>
        </thead>
        <tbody>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
        </tbody>
    </table><!--myTable -->
</div><!-- myDiv -->
 
<div class="myDiv">
    <table class="myTable makeFixed">
        <colgroup>
            <col style="width:10%;">
            <col style="width:20%;">
            <col style="width:30%;">
            <col style="width:40%;">
        </colgroup>
        <thead>
            <tr>
                <th>A</th> <th>B</th> <th>C</th> <th>D</th>
            </tr>
        </thead>
        <tbody>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
        </tbody>
    </table><!--myTable -->
</div><!-- myDiv -->
 
<div class="myDiv">
    <table class="myTable">
        <colgroup>
            <col style="width:10%;">
            <col style="width:20%;">
            <col style="width:30%;">
            <col style="width:40%;">
        </colgroup>
        <thead>
            <tr>
                <th>A</th> <th>B</th> <th>C</th> <th>D</th>
            </tr>
        </thead>
        <tbody>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
            <tr> <td>001</td> <td>002</td> <td>003</td> <td>004</td> </tr>
        </tbody>
    </table><!--myTable -->
</div><!-- myDiv -->
cs

 

CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*{margin:0;padding:0;box-sizing:border-box;}
html,body{
    background:#000;
}
 
table{table-layout:fixed; border-collapse:separate;border-spacing:0;width:100%;text-align:center;}
thead tr{background:#ccc;color:#666;}
th,td{padding:1rem;border:1px solid #000;}
 
.myDiv{
    position:relative; overflow-y:auto;
    margin:10rem auto;
    width: 80%; height:200px;
    background:#fff;}
 
table.fixed{
    position:absolute; z-index:10;
    top:0; left:0;
    width:100%;}
table.fixed thead tr{color:red;}
cs

 

JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const makeFixed = document.getElementsByClassName('makeFixed');
let makeTable;
let thisColG, thisThead;
 
/* 동적으로 테이블 추가 */
for(let tbl of makeFixed){
    makeTable = document.createElement('TABLE');
    makeTable.setAttribute('class','fixed');
    thisColG = tbl.getElementsByTagName('COLGROUP')[0].cloneNode(true);
    thisThead = tbl.getElementsByTagName('THEAD')[0].cloneNode(true);
    makeTable.appendChild(thisColG);
    makeTable.appendChild(thisThead);
    tbl.parentElement.appendChild(makeTable);
}
 
/* 스크롤시 fixed 테이블은 상단에 계속 고정됨 */
const myDiv = document.getElementsByClassName('myDiv');
let thisFixed, nowScTop;
for(divs of myDiv){divs.addEventListener('scroll',theadFixed)}//
 
function theadFixed(){
    thisFixed = this.getElementsByClassName('fixed')[0];
    nowScTop = this.scrollTop;
    thisFixed.style.transform = `translateY(${nowScTop}px)`;
    // thisFixed.style.top = `${nowScTop}px`;
}//theadFixed
cs

 

출처: https://aosceno.tistory.com/521 [창고:티스토리]

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기

HTML/CSS/기타

번호 제목 글쓴이 날짜 조회수
46 JS 글자수 체크(공백포함, 제외) 및 언어 옵션 설정 관리자 09-02 1,318
45 web chart - 실시간 차트 관리자 07-25 1,349
44 비동기 프로그래밍 관리자 07-25 1,309
43 table thead 고정과 tbody 스크롤 관리자 07-23 1,362
42 datepicker 사용하여 공휴일 직접 지정하기 관리자 06-11 1,427
41 Dropzone - 이미지 & 파일 업로드 (드래그 앤 드롭) 라이브러리 관리자 03-06 1,585
40 JSPDF 사용법(Javascript pdf) 관리자 03-04 1,863
39 FullCalendar(풀캘린더) 어거지 사용법 관리자 01-25 1,775
38 JQUERY - id가 여러개인데 한번에 찾고 싶을때! ${} 관리자 12-28 1,612
37 [CSS] 가로 스크롤 구현하기 관리자 12-27 1,747
36 JCROP을 이용한 업로드한 크롭( CROP ) 하기 관리자 12-27 1,712
35 제이쿼리 - 모달 다이아로그 및 여러 알림창들 관리자 12-21 1,438
34 Javascript/jQuery 이미지 회전 돋보기 관리자 11-07 1,823
33 Resolving the Issue of Fakepath in JavaScript 관리자 10-26 1,486
32 div 및 요소 화면 중앙에 위치시키기 관리자 10-21 1,512
31 [Jquery] 체크박스 전체 체크 , 해제 하는 방법 관리자 10-19 1,525
30 display 스타일 속성 사용하여 행 숨기기/보이기 관리자 09-16 1,930
29 자주 사용하는 비주얼 스튜디오 코드(Visual Studio Code, VSC, vscode) 단축키 정리 관리자 09-14 2,006
28 div 2개 나란히 정렬하는 방법 관리자 09-09 1,728
27 HTML, CSS - 헤더컬럼 고정형 table 구성하기 관리자 09-06 1,561