Programming language/Javasript
[Javascript] 한 페이지안에서 탭을 이용해 내용바꾸기
pogles
2023. 1. 16. 11:52
싱글페이지 애플리케이션(SPA) 를 만드는데 유용한 기능으로 한페이지 내에서 여러 탭키를 누르면 내용들이 바뀌는 효과를 보여줄 수 있습니다.
++ 사용할 메서드
- classList.add
- classList.remove
- data- (target.dataset) 활용
- addEventListener
++ HTML5 에서 추가된 태그 (semantic tag)
<article></article> | <session></session> |
- HTML 5 에서 추가된 태그 - 특정한 영역 그룹화 - 다른영역에서도 쓰일 수 있는 영역에 쓰임 |
- HTML 5 에서 추가된 태그 - 특정한 영역 그룹화 |
블로그 및 SNS 포스팅, 뉴스 기사영역, 신문 논평 등 |
[HTML]
<div class="about-center section-center">
<article class="about">
<!-- 버튼 컨테이너 -->
<div class="btn-container">
<button class="tab-btn active" data-id="연혁">연혁<button>
<button class="tab-btn" data-id="사업구조">사업구조<button>
<button class="tab-btn" data-id="투자계획">투자계획<button>
</div>
</article>
<article class="about-content">
<div class="content active id="연혁">
<h3>연혁</h3>
<p>우리 회사는 어쩌구저쩌구</p>
</div>
<div class="content id="사업구조">
<h3>사업구조</h3>
<p>사업구조에 대해서 어쩌구저쩌구</p>
</div>
<div class="content active id="투자계획">
<h3>투자계획</h3>
<p>투자계획에 있어서 어쩌구저쩌구</p>
</div>
</article>
</div>
[CSS]
- 기본적으로 tab 과 content 는 display:none 이지만 classList 를 통해 active 를 추가해주면 보이게 설정
/* hide content */
.content {
display: none;
}
.tab-btn.active {
background: var(--clr-white);
}
.content.active {
display: block;
}
[JS]
- button 에 추가한 data-id (target.dataset) 을 가지고 data-id 와 동일한 id 를 가지고 있는 내용물 활성화
const btns = document.querySelectorAll(".tab-btn"); // html collections
const about = document.querySeletor(".about");
const aricles = document.querySeletor(".content");
function onClickAbout(event) {
const id = event.target.dataset.id; // hmtl 에서 추가한 data-id
if (id) {
// 해당버튼 이외의 다른 버튼들 비활성화 시키기
btns.forEach(function (btn) {
btn.classList.remove("active"); // 모두 없애고
event.target.classList.add("active"); // 해당 버튼 추가
});
// 다른 버튼의 내용물 비활성화 시키기
article.forEach(function(article) {
article.classList.remove("active"); // 모두 없애고
});
const activeArticle = document.getElementById(id);
activeArticle.classList.add("active"); // 해당 버튼의 내용물 추가
}
}
about.addEventListener("click",onClickAbout);
느낀점
semantic tag 를 사용하는 것이 다른사람이 보기에 의미전달에 더 유리하기에 잘 활용해야겠다는 생각이 들었다.
나는 처음에 tab 버튼과 content 컨테이너가 같이 하나로 묶여있는 구조로 생각하고 있었다. 하지만 실제 구현했을 때
tab 버튼은 tab 버튼끼리 컨테이너화 시켰고 content 는 content 끼리 컨테이너화 시켜 코드를 구성하였다.
tab 키를 눌러 화면에 활성화 시킬 때 classList 에 active 라는 클래스를 추가하는 것으로 구성되어있음을 알게되었다.