Develope/HTML, CSS

가로, 세로 헤더 고정 테이블 - position:sticky

ccuccu 2023. 12. 15. 15:08

회사에서는 원래 테이블 헤더만 고정된 테이블을 사용했었는데,

최근 좌측 헤더 테이블도 고정 시켜 달라는 요구가 있었다.

하지만 구글에 검색해봐도 그런 형식의 테이블을 잘 사용하지 않는지 정보가 많이 없었다. ㅠㅠ

건진것은 오직 position:sticky 뿐..

 

평소 relative, absolute,static 가끔 fixed만 사용해봤던지라 처음 보는 css였다.

찾아보니 relative, absolute와 fixed 사이의 css효과라고 느껴졌다.

 

다양한 position 효과

relative 영역의 부모
absolute 영역의 자식, top과 left등으로 객체의 위치를 지정한다. 스크롤 시 위치가 변한다.
fixed relative 영역의 영향을 받지 않고 브라우저의 영역에 영향을 받는다.
top, left등으로 객체의 위치를 지정하지만 스크롤 시 위치가 변하지 않는다.
sticky relative 영역의 영향을 받으며 top과 left등으로 객체의 위치를 지정한다.
부모의 영역 내에서는 위치가 변하지 않지만, 스크롤이 부모의 영역을 벗어나면 위치가 변한다.

 

이게 무슨 소리일까? 싶겟지만 sticky와 fixed의 확연한 차이를 알고 지나가야한다.

왜냐면 내가 그냥 했다가 오류가 났기 때문에...

 

테이블 퍼블리싱

테이블을 작성할 때 하나의 테이블 같지만 우린 네개의 테이블로 영역을 나누어 코드를 작성하면 된다.

 

먼저 위 사진처럼 한 객체 안에 상단 헤더 테이블과 하단 컨텐츠 테이블로 나눠준다.

 

후에 이렇게 상단에 두개, 하단에 두개의 테이블로 나눠 총 4개의 영역을 잡는다.

 

<div class="total_table_wrap">
	<!-- 상단 테이블 헤더 -->
	<div class="table_thead">
    	<div class="left_table">
        	<table></table>
        </div>
        <div class="right_table">
        	<table></table>
        </div>
    </div>
    
    <!-- 하단 테이블 콘텐츠| 상,하 스크롤 될 영역 -->
    <div class="table_tbody">
    	<div class="left_table">
        	<table></table>
        </div>
        <!-- 좌,우 스크롤 될 영역 -->
        <div class="right_table">
        	<table></table>
        </div>
    </div>
</div>

위와같이 헤더와 바디 div로 나누고 헤더와 바디 div안에 각각 왼쪽, 오른쪽 테이블로 나누어 작성하면 된다.

 

그 후 상하 스크롤 시 고정될 table_thead와 좌우 스크롤 시 고정될  left_table에 position:sticky를 준다.

 

그러면 짜잔! 하고 완성이 될 것 같았지만!!! 

stkcky의 속성 부모의 영역 내에서는 위치가 변하지 않지만, 스크롤이 부모의 영역을 벗어나면 위치가 변한다.

로 인해 테이블이 부모 영역을 벗어나면 left_table의 위치가 같이 움직였다..

 

해당 영역은 도저히 css로 width값을 잡기 힘들어서 깔끔하게 스크립트 사용~

document.addEventListener('DOMContentLoaded', function() {
    // 상하, 좌우 고정 스크롤 테이블
    let leftTableWidth = document.querySelector('.left_table table').offsetWidth;
    let rightTableWidth = document.querySelector('.right_table table').offsetWidth;
    let totalTableWidth = leftTableWidth + rightTableWidth;

    // 각 요소에 대해 width값 설정
    let elements = document.querySelectorAll('.table_thead, .table_tbody, .total_table_wrap');
    elements.forEach(function(element) {
        element.style.width = totalTableWidth + 'px';
    });

    // right_table 위치 및 최소 너비 설정
    let rightTables = document.querySelectorAll('.right_table');
    rightTables.forEach(function(element) {
        element.style.left = leftTableWidth + 'px';
        element.style.minWidth = 'calc(50% - ' + leftTableWidth + 'px)';
    });
});

 

보면 코드에 right_table 위치를 left를 사용하여 고정시키는데 우리 회사에서는 left th테이블이 값에 따라 수시로 바뀔 예정이라 스크립트로 right_table 위치를 잡아줬다.

 

하단은 완성본~

See the Pen 가로 세로 고정 테이블 by SIONS2 (@SIONS2) on CodePen.