본문 바로가기
Javascript/배경 & 실무 지식

[Javascript] Treeview 트리뷰

by BeomBe 2023. 11. 27.
반응형

작업을 하다 보면 메인메뉴 또는 사이드 메뉴를 꾸며야하는 경우가 있다.

물론 기존에 만들어진 Plugin이나 module들을 받아서 적용시키면 간편하게 구현할 수 있겠지만

이 포스트에서는 간단히 Treeview를 만드는 코드를 보여주려고 한다.

 

구현할 때 고려해야할 점은 두가지다.

1. 클릭이벤트 캐치

2. toggle() 메소드 사용

 

 

아래 코드를 참고하기를 바란다.

 

1. HTML

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="treeview.css">
</head>
<body>

<h2>Tree View</h2>
<p>Simple TreeView</p>
<p>Click on the arrow(s) to open or close the tree branches.</p>

<ul id="side-navigation">
  <li><span class="group">Continent</span>
    <ul class="nested">
      <li>Europe</li>
      <li>Africa</li>
      <li><span class="group">Asia</span>
        <ul class="nested">
          <li>Western Asia</li>
          <li>Southeast Asia</li>
          <li><span class="group">Eastern Tea</span>
            <ul class="nested">
              <li>South Korea</li>
              <li>Japan</li>
              <li>China</li>
            </ul>
          </li>
        </ul>
      </li>  
    </ul>
  </li>
</ul>
<script src="./treeview.js"></script>
</body>
</html>

 

2. JS

var toggler = document.getElementsByClassName("group");
var i;

for (i = 0; i < toggler.length; i++) {
  toggler[i].addEventListener("click", function () {
    this.parentElement.querySelector(".nested").classList.toggle("active");
    this.classList.toggle("group-down");
  });
}

 

3. CSS

ul, #side-navigation {
  list-style-type: none;
}

#side-navigation {
  margin: 0;
  padding: 0;
}

.group {
  cursor: pointer;
  -webkit-user-select: none; /* Safari 3.1+ */
  -moz-user-select: none; /* Firefox 2+ */
  -ms-user-select: none; /* IE 10+ */
  user-select: none;
}

.group::after {
  content: "\25B6";
  color: black;
  display: inline-block;
  margin-left: 10px;
  -ms-transform: rotate(90deg); /* IE 9 */
  -webkit-transform: rotate(90deg); /* Safari */
  transform: rotate(90deg);
}

.group-down::after {
  -ms-transform: rotate(-90deg); /* IE 9 */
  -webkit-transform: rotate(-90deg); /* Safari */
  transform: rotate(-90deg); 
}

.nested {
  display: none;
}

.active {
  display: block;
}
반응형