본문 바로가기
JavaScript

[javascript] collapsible 테이블 만들기.

by teamnova 2022. 12. 8.

안녕하세요! 오늘은 테이블 행 클릭 시 테이블 행에 관한 상세 내용을 확인할 수 있게하는 collapsible table을 display 속성table-row 값을 사용해서 표처럼 표현하여 구현해봅시다.  display의 table-row를 사용하면 요소를 테이블의 행(row)처럼 표시할 수 있습니다.

 

우선 구현 된 모습입니다.

첫번째와 두번째 행 클릭 시 상세내용이 펼쳐져 응시일, 과목, 점수를 나타내는 내부 테이블이 보입니다. 클릭했던 행을 다시 클릭하면 접히는 것을 확인할 수 있습니다. 마치 하나의 행처럼 보이는데 그 안에 또다른 테이블이 들어가져있죠? 

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>TEST</title>
    <style>
        @charset "UTF-8";
        @import url("https://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css");

        * {
        box-sizing: border-box;
        }

        .year:after {
        content: "년";
        }

        .age:after {
        content: "세";
        }

        .fold-content h4:after{
        content: " - 상세내용";
        }

        table {
        width:60%;
        margin: auto;
        }

        table th {
        text-align: left;
        border-bottom: 1px solid #ccc;
        }

        table th, table td {
        padding: 0.4em;
        }

        table.fold-table > tbody > tr.view td {
        cursor: pointer;
        }

        /*아이콘 위치설정*/
        table.fold-table > tbody > tr.view td:first-child{
        position: relative;
        padding-left: 20px;
        }

        /*아이콘 설정*/
        table.fold-table > tbody > tr.view td:first-child:before {
        position: absolute;
        top: 50%;
        left: 5px;
        width: 9px;
        height: 16px;
        margin-top: -8px;
        font: 16px fontawesome;
        color: #999;
        content: "";
        }


        /*마우스호버*/
        table.fold-table > tbody > tr.view:hover {
        background: tomato;
        }

        /*미클릭시 안보이게 처리*/
        table.fold-table > tbody > tr.fold {
        display: none;
        }

        .fold-content > table {
        /*내부 테이블*/
        width: 100%;
        border: 2px solid #ccc;
        margin-bottom: 10px;
        }

        .fold{
        background:#eee;
        }
    </style>
</head>
<body>
    <table class="fold-table">
        <thead>
          <tr>
            <th>등록연도</th>
            <th>이름</th>
            <th>지역</th>
            <th>나이</th>
          </tr>
        </thead>
        <tbody>
          <tr class="view"><!--보여주기-->
            <td class="year">2022</td>
            <td>김철수</td>
            <td>경기도</td>
            <td class="age">20</td>
          </tr>
          <tr class="fold">
            <td colspan="4">
              <div class="fold-content">
                <h4>김철수</h4>
                <table><!--내부테이블-->
                  <thead>
                    <tr>
                      <th>응시일</th>
                      <th>과목</th>
                      <th>점수</th>
                    </tr>
                  </thead>
                  <tbody>
                    <tr>
                      <td>2022/03/21</td>
                      <td>토익</td>
                      <td>880</td>
                    </tr>
                    <tr>
                      <td>2022/06/22</td>
                      <td>HSK</td>
                      <td>270</td>
                    </tr>
                  </tbody>
                </table><!--내부테이블-->          
              </div>
            </td>
          </tr>
          <tr class="view">
            <td class="year">2021</td>
            <td>김영구</td>
            <td>강원도</td>
            <td class="age">30</td>
          </tr>
          <tr class="fold">
            <td colspan="4">
              <div class="fold-content">
                <h4>김영구</h4>
                <table><!--내부테이블-->
                  <thead>
                    <tr>
                      <th>응시일</th>
                      <th>과목</th>
                      <th>점수</th>
                    </tr>
                  </thead>
                  <tbody>
                    <tr>
                      <td>2021/01/24</td>
                      <td>토익</td>
                      <td>830</td>
                    </tr>
                    <tr>
                      <td>2022/04/25</td>
                      <td>OPIC</td>
                      <td>AH</td>
                    </tr>
                  </tbody>
                </table><!--내부테이블-->          
              </div>
            </td>
          </tr>
        </tbody>
      </table><!--외부테이블-->
<script>
    var rows = document.getElementsByClassName("view");// view 라는 classname의 모든 element들 가져오기.
    var i;

    for (i = 0; i < rows.length; i++) { //elements를 for문으로 돌려서 각행에 클릭 리스너 등록.
        rows[i].addEventListener("click", function() {

            var content = this.nextElementSibling;
            //display:table-row는 요소를 표 내의 행처럼 보이게한다.
            if (content.style.display === "table-row") {
            content.style.display = "none";
            } else {
            content.style.display = "table-row";
            }

        });//click event
    }//for문
</script>
</body>
</html>