Computer >> 컴퓨터 >  >> 프로그래밍 >> CSS

CSS와 JavaScript로 확장형 그리드(Expanding Grid) 만드는 방법

CSS와 JavaScript를 활용하면 클릭 한 번으로 콘텐츠가 펼쳐지는 확장형 그리드(Expanding Grid)를 간단하게 구현할 수 있습니다. 이 글에서는 세 개의 컬럼으로 구성된 그리드를 만들고, 각 컬럼을 클릭하면 해당하는 상세 내용이 아래에 표시되는 인터랙티브한 UI를 예제 코드와 함께 살펴보겠습니다.

동작 원리

이 예제의 핵심 동작 방식은 다음과 같습니다.

  • 화면에는 좌측·중앙·우측으로 배치된 세 개의 컬럼이 표시됩니다.
  • 컬럼을 클릭하면 해당 컬럼과 연결된 숨겨진 탭 영역이 아래에 펼쳐집니다.
  • 탭 우측 상단의 닫기 버튼(×)을 누르면 탭이 다시 사라집니다.
  • 다른 컬럼을 클릭하면 기존에 열려 있던 탭은 자동으로 닫히고 새 탭만 열립니다.

전체 예제 코드

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
    body {
        padding: 1%;
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    }
    * {
        box-sizing: border-box;
    }
    .left, .right, .center {
        float: left;
        width: 33%;
        color: white;
        padding: 10px;
        height: 200px;
        text-align: center;
    }
    .left {
        background-color: tomato;
    }
    .right {
        background-color: teal;
    }
    .center {
        background-color: rgb(166, 71, 255);
    }
    .container:after {
        clear: both;
    }
    .closebtn {
        float: right;
        color: white;
        font-size: 35px;
        cursor: pointer;
    }
    .closebtn:hover {
        transform: scale(1.5);
    }
    .containerTab {
        padding: 20px;
        width: 99%;
        color: white;
    }
</style>
</head>
<body>
<h1 style="text-align: center;">Three Column grid example</h1>
<div class="container">
<div class="left" onclick="openTab('tab1');">
<h1>Some text on the left</h1>
</div>
<div class="center" onclick="openTab('tab2');">
<h1>Some text in center</h1>
</div>
<div class="right" onclick="openTab('tab3');">
<h1>Some text on the right</h1>
</div>
</div>
<div id="tab1" class="containerTab" style="display:none;background:tomato">
<span onclick="this.parentElement.style.display='none'" class="closebtn">×</span>
<h2>Tab 1</h2>
<p>
Lorem ipsum dolor sit amet, te quo doctus abhorreant, et pri deleniti intellegat, te sanctus inermis ullamcorper nam. Ius error diceret deseruisse ad
</p>
</div>
<div id="tab2" class="containerTab" style="display:none;background:rgb(166, 71, 255)">
<span onclick="this.parentElement.style.display='none'" class="closebtn">×</span>
<h2>Tab 2</h2>
<p>
Lorem ipsum dolor sit amet, te quo doctus abhorreant, et pri deleniti intellegat, te sanctus inermis ullamcorper nam. Ius error diceret deseruisse ad
</p>
</div>
<div id="tab3" class="containerTab" style="display:none;background:teal">
<span onclick="this.parentElement.style.display='none'" class="closebtn">×</span>
<h2>Tab 3</h2>
<p>
Lorem ipsum dolor sit amet, te quo doctus abhorreant, et pri deleniti intellegat, te sanctus inermis ullamcorper nam. Ius error diceret deseruisse ad
</p>
</div>
<script>
    function openTab(tabName) {
        var i, x;
        x = document.querySelectorAll(".containerTab");
        Array.from(x).forEach(item => {
            item.style.display = "none";
        });
        document.getElementById(tabName).style.display = "block";
    }
</script>
</body>
</html>

코드 상세 설명

1. CSS 스타일링

.left, .center, .right 클래스에 float: leftwidth: 33%를 적용해 세 개의 컬럼을 나란히 배치했습니다. 각 컬럼은 서로 다른 배경색(토마토, 보라, 청록)으로 구분되며, 높이는 200px로 고정되어 있습니다.

.closebtn 클래스는 탭의 닫기 버튼 스타일을 담당합니다. 마우스 포인터를 올리면 transform: scale(1.5) 효과로 버튼이 부드럽게 커지는 호버 애니메이션이 적용되어 있습니다.

2. HTML 구조

세 개의 컬럼 div에는 각각 onclick="openTab('tab1')" 형태로 클릭 이벤트가 연결되어 있습니다. 아래쪽에는 tab1, tab2, tab3라는 ID를 가진 탭 컨테이너가 배치되어 있으며, 기본적으로 display: none으로 숨겨져 있다가 클릭 시 화면에 나타납니다. 각 탭 안에는 닫기 버튼 역할을 하는 <span> 요소가 있어, 클릭 시 부모 요소를 숨김 처리합니다.

3. JavaScript 로직

openTab() 함수가 이 예제의 핵심입니다. 먼저 querySelectorAll(".containerTab")으로 모든 탭 요소를 선택한 뒤 forEach를 사용해 전부 display: none 처리합니다. 이후 클릭된 컬럼에 해당하는 탭만 display: block으로 변경하여 화면에 표시합니다. 덕분에 어떤 컬럼을 클릭하더라도 항상 하나의 탭만 열려 있게 되어 깔끔한 사용자 경험을 제공합니다.

실행 결과

위 코드를 실행하면 다음과 같은 초기 화면이 출력됩니다.

CSS와 JavaScript로 확장형 그리드(Expanding Grid) 만드는 방법

컬럼 중 하나를 클릭하면 해당 탭이 아래에 펼쳐집니다.

CSS와 JavaScript로 확장형 그리드(Expanding Grid) 만드는 방법