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/기타

번호 제목 글쓴이 날짜 조회수
10 JQuery 노드찾기 관리자 11-12 1,064
9 Jquery 또는 플러그인없이 마우스 오버 확대 관리자 07-05 1,559
8 구글 번역 기능 붙이기 관리자 06-10 9,287
7 [jQuery] 웹사이트에 사용가능한 슬라이더(Slider) 관리자 06-09 2,377
6 Datepicker + 년월만 선택하기 관리자 06-06 7,014
5 JCROP을 이용한 이미지 자르기 관리자 05-18 1,257
4 jquery-file-upload 관리자 05-18 2,054
3 [스크립트] printjs 관리자 12-09 1,384
2 [스크립트] eventSwipe. HTML에서 swipe 이벤트를 사용할 수 있도록 해줍니다. 관리자 11-01 1,489
1 [QR] 구글 API로 QR 코드 생성 / Wi-fi 접속 QR 코드 생성 관리자 10-21 4,149