일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- docker-compose
- MySQL
- pagination
- staging area
- vue
- ruby
- ubuntu
- controller
- cron
- docker
- laravel
- Python
- centOS7
- AWS
- props
- working directory
- Ruby On Rails
- dockerfile
- SQL
- php
- NGINX
- Wordpress
- imagemagick
- Git
- javascript
- Selenium
- linux
- react
- codeigniter4
- ec2
- Today
- Total
내가 한 노력들
[ CSS + JS ] 좌우 스크롤이 가능한 테이블 만들기 (컬럼 고정) 본문
반응형 웹에서 테이블 구조를 사용하는 경우에, 모바일 화면에서는 테이블의 구조가 무너지는 경험을 자주 했기 때문에 해결을 위해 브라우저의 폭이 줄어들었을 경우에는 좌우의 스크롤을 통해서 테이블을 확인할 수 있도록 구현할 수 있습니다.
구현 방법은, 테이블을 두 개를 만들어서 하나의 테이블은 고정된 컬럼을 보여주기 위함 하나의 테이블은 스크롤을 통해서 보여질 테이블로써 사용합니다.
실제동작 확인
See the Pen Untitled by JONGIN CHOI (@jongin1004) on CodePen.
간단히 코드 설명
JS
const table_container = document.querySelector('#table-scroll');
const table = document.querySelector('.table');
const table_clone = table.cloneNode(true);
table_clone.classList.add('clone');
table_container.appendChild(table_clone);
위에서도 설명했듯이, 두 개의 테이블이 필요하기 때문에 cloneNode를 이용해 같은 테이블을 복제하고 테이블을 감싸고 있는 요소에 추가하는 코드입니다.
복제한 테이블은 고정된 컬럼 설정이라던가, visibility 처리등의 CSS를 적용하기 위해서 clone 이라는 class를 추가합니다.
CSS
.table-scroll {
position:relative;
max-width: 600px;
margin:auto;
overflow:hidden;
border-right:1px solid #707070;
}
.table-wrap {
width: 100%;
overflow: auto;
}
.clone {
position:absolute;
top:0;
left:0;
pointer-events:none;
}
.clone th, .clone td {
visibility:hidden;
}
.clone .fixed-side {
visibility:visible;
}
핵심적인 CSS만 설명하자면, 우선 테이블을 감싸고 있는 div의 최대 width를 정해둬서 테이블이 브라우저의 폭보다 커져서 레이아웃을 벗어나느 것을 막습니다.
overflow를 hidden으로 함으로써 벗어나는 테이블의 크기는 보이지 않도록 합니다.
table-wrap에서는 overflow를 auto로 하는데, auto로 하게되면 자동적으로 벗어나는 부분은 스크롤로 볼 수 있도록 만들어 줍니다.
clone 테이블은 기존 테이블을 감싸는 div를 기준으로 절대적인 위치에 고정시킵니다. 그래야지 clone의 컬럼은 고정되어 있고 기존의 테이블은 스크롤로써 볼 수 있게 됩니다.
clone테이블은 맨 첫 고정할 컬럼을 제외하고는 사용하지 않을꺼기 때문에 전체적인 th와 td의 visibility를 hidden으로하고, fidxed-side만 visible로 합니다.
구현했을 때, border 줄이 고정되어 남아있다던가, 배경색이 남아있는 경우
.clone td, .clone th {
border-color:transparent;
background:transparent;
}
transparent를 이용해서 투명하게 만들어주면 해결이 됩니다.
'IT 공부 > Javascript' 카테고리의 다른 글
[ Javascript ] Select / Option에서 현재 선택된 Option 값 (0) | 2022.06.22 |
---|---|
[ Javascript ] input : file에서 버튼만 보이게 하고 싶은 경우 (0) | 2022.03.23 |
[ JavaScript ] NodeList의 각 요소들에 addEventListener 적용하기 (0) | 2022.03.06 |
[ JavaScript ] input 타입 (text, checkbox, select, ... 등 ) value값을 얻고, 속성 추가하기 (0) | 2022.02.16 |
[ React ] CRUD - Delete 구현 (0) | 2022.01.16 |