기초공사 (html,css,javascript)

아코디언 만들기 본문

javascript

아코디언 만들기

에스프레소라떼 2023. 1. 11. 22:37

//html

<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>CodePen - javascript_06_accordion_FINAL</title>
  <link rel="stylesheet" href="style.css">
 
</head>
<body>
<!-- partial:index.partial.html -->
<div class="container">
  <button id="btn-collapse">Collapse All</button>
  <h2>FAQ</h2>
  <section id="faq">
    <!-- 제목을 클릭하면 그제목 부모에게 가서 active를 넣어주고  부모에게 active가 있따면 패널의 바디가 나오게
    Collapse All 버튼을 누르면 접히게..오늘의 할일-->
    <div class="panel-question active">
      <div class="panel-heading">
        + Lorem ipsum dolor sit?
      </div>
      <div class="panel-body" id="thisone">
        <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ad aliquid voluptate fugit quaerat non molestiae quo magni soluta minima corporis! Soluta, ipsa et.</p>
        <p>Quos quibusdam, nesciunt totam ullam quasi neque!</p>
      </div>
    </div>
   
    <div class="panel-question">
      <div class="panel-heading">
        + Lorem ipsum dolor sit?
      </div>
      <div class="panel-body">
        <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ad aliquid voluptate fugit quaerat non molestiae quo magni soluta minima corporis! Soluta, ipsa et.</p>
        <p>Quos quibusdam, nesciunt totam ullam quasi neque!</p>
      </div>
    </div>
   
    <div class="panel-question">
      <div class="panel-heading">
        + Lorem ipsum dolor sit?j
      </div>
      <div class="panel-body">
        <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ad aliquid voluptate fugit quaerat non molestiae quo magni soluta minima corporis! Soluta, ipsa et.</p>
        <p>Quos quibusdam, nesciunt totam ullam quasi neque!</p>
      </div>
    </div>
  </section>
</div>
<!-- partial -->
<script src = script.js></script>
 

</body>
</html>
 
//css
html, body {
  font-family: Helvetica, Arial, sans-serif;
  margin: 0;
  background-color: #f0f0f0;
}

.container {
  width: 90%;
  margin: 0 auto;
}

.panel-question {
  margin-bottom: 20px;
  background-color: #fff;
}

.panel-heading {
  font-weight: bold;
  padding: 5px;
  background-color: #333;
  color: #fff;
  cursor: pointer;
}

.panel-body {
  padding: 15px;
}

#btn-collapse {
  margin-bottom: 10px;
  background-color: #999;
  border: none;
  color: #fff;
  cursor: pointer;
  padding: 5px;
  float: right;
}
 
//js
 
var btnCollapse = document.getElementById('btn-collapse'),//아이디 btn-collapse

   heading = document.getElementsByClassName('panel-heading'), //클랫스명 panel-heading
   question = document.getElementsByClassName('panel-question'), //클래스명 panel-question
   answer = document.getElementsByClassName('panel-body'); //클래스명 panel-body

   /*console.log( heading); 
   배열로 들어올것이다(heading이 여러개있어서). 
   배열마다 해야할일을 써야한다. 자바스크립트에서는 여러개 즉 배열로 할일을 하려면
   반복문을 써야한다. for(시작;조건;증감)
   */
   //제목을 클릭하면 할일 heading[0],heading[1],..이렇게 들어올거다. 안에 숫자를 변수로
   for(var i =0; i < heading.length; i++){//해딩들 마다 할일
      heading[i].addEventListener('click', function(ev){
         //question에 있는 active를다 지우고. question도 배열이다.3개나 있다.
         //question.classList.remove('active'); 이렇게쓰면 안된다.question도 배열이기때문에
         for(var j = 0; j < question.length; j++){
            question[j].classList.remove('active');
            ev.target.parentNode.classList.add('active');
            activateBody();
         }//question 마다 할일
      });
   }
   /*사용자가 어느 heading을 클릭했는지알아야함 target이라고 함
   클릭한 target을 물고들어와야함 function(ev) 괄화안에 매객변수를 넣어야함.ev
   그리고, ev.target.classList.add('active');라고 하면 안됨. 이건heading 클릭했을때
   할일이 됨, heading의 부모에서 active를 넣어야함
    ev.target.parentNode.classList.add('active');
   */

   function activateBody(){
      //panel-body 모두 안보이도록(접으래)answer, display:none;
      //배열들 answer마다 할일.안보이게
      for(var x = 0; x < answer.length; x++){
         answer[x].style.display = 'none';

      //클래스명 active가 있는 panel-question안 자식중 panel-body 나타나도록
      //.panel-question.active .panel-body
      var activePanel = document.querySelector('.panel-question.active .panel-body');
         activePanel.style.display = 'block';
      }
   }
   activateBody(); //열자마자도 접히게 하기위해 밑에 썼다.

   //collapse all 버튼을 클릭하면 모든 answer 안보이도록한다.
   btnCollapse.addEventListener('click', function(){
      for(var i = 0; i < answer.length; i++){
         answer[i].style.display = 'none';
      }
   });

'javascript' 카테고리의 다른 글

객체만들기  (0) 2023.07.20
콤보박스에서 출력하기 - selectIndex  (0) 2023.05.09
과제_달력만들기  (0) 2023.03.15
아코디언 만들기-정리-js  (0) 2023.01.15
IntersectionObserver Entry  (0) 2022.06.27