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: left와 width: 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으로 변경하여 화면에 표시합니다. 덕분에 어떤 컬럼을 클릭하더라도 항상 하나의 탭만 열려 있게 되어 깔끔한 사용자 경험을 제공합니다.
실행 결과
위 코드를 실행하면 다음과 같은 초기 화면이 출력됩니다.

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