JavaScript로 slideDown, slideUp 구현해보기

2025. 2. 21. 16:23·🐣codeLab

jQuery로 `slideDown()`, `slideUp()` 으로 편하게 작업했었는데 이번에는 자바스크립트로 스크립트를 짜보았다.

 

`accSlide()` : 해당 버튼 클릭 시 자신만 닫힘

`accOtherSlide()` : 해당 버튼 클릭 시 다른 버튼 닫힘

 

<div class="wrap">
    <h2>해당 버튼만 toggle</h2>
    <div class="acc">
        <button type="button" class="acc-tit">버튼1</button>
        <div class="acc-cont">
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
        </dlv>
    </div>
    <div class="acc">
        <button type="button" class="acc-tit">버튼2</button>
        <div class="acc-cont">
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
             Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
              Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
        </dlv>
    </div>
</div>

<div class="wrap-other">
    <h2>버튼 클릭 시 열려있는 아코디언 닫힘</h2>
    <div class="acc">
        <button type="button" class="acc-tit">버튼1</button>
        <div class="acc-cont">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?</dlv>
    </div>
    <div class="acc">
        <button type="button" class="acc-tit">버튼2</button>
        <div class="acc-cont">
            Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
             Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
              Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti laudantium consequatur cumque repellendus, sit ducimus iste doloremque accusantium autem. Itaque, voluptatum. Dolorum ratione laborum aliquid ab ullam aut nobis eaque?
        </dlv>
    </div>
</div>
.acc-tit {display:block; width:100%;appearance:none;margin-top:10px;}
.acc-tit.active {color:red;}
.acc-cont {max-height:0; overflow:hidden; transition:max-height 0.4s ease;}
accSlide();
 function accSlide() {
 	const accBtn = document.querySelectorAll('.wrap .acc-tit');
 
     accBtn.forEach(button => {
     	button.addEventListener('click', function() {
        	// 클릭된 버튼의 다음 요소 선택
            const cont = this.nextElementSibling; // acc-cont
            if(cont.style.maxHeight) {
            	// 슬라이드 업
                cont.style.maxHeight = null;
            } else {
            	// 슬라이드 다운
                cont.style.maxHeight = cont.scrollHeight + 'px';
            }
            // 버튼의 활성화
            this.classList.toggle('active');
        })
     })
 }
 
accOtherSlide();
 function accOtherSlide() {
 	const accBtn2 = document.querySelectorAll('.wrap-other .acc-tit');
    
     accBtn2.forEach(button => {
     	button.addEventListener('click', function() {
            const cont2 = this.nextElementSibling; // acc-cont
            
            // 다른 열린 아코디언 항목 닫기
            accBtn2.forEach(otherButton => {
            	if(otherButton !== this) {
                	const otherCont = otherButton.nextElementSibling;
                	otherCont.style.maxHeight = null;
                    otherButton.classList.remove('active');
                }
            });
            
            // 클릭된 아코디언 항목 토글
            if(cont.style.maxHeight) {
                cont2.style.maxHeight = null;
                this.classList.remove('active');
            } else {
                cont2.style.maxHeight = cont2.scrollHeight + 'px';
                this.classList.add('active');
            }
        })
     })
 }

 

저작자표시 비영리 동일조건 (새창열림)
'🐣codeLab' 카테고리의 다른 글
  • [GSAP] gsap 정리
  • column-count사용하여 masonry 나타내기
  • 모바일 브라우저에서 100vh 오류(직접해보기)
  • 3Depth(level) 만들기
jmjm
jmjm
  • jmjm
    /* jmjmjm */
    jmjm
  • 전체
    오늘
    어제
    • 분류 전체보기 (128)
      • 👩🏻‍💻STUDY (84)
        • HTML (9)
        • CSS (25)
        • SASS (4)
        • JavaScript (15)
        • jQuery (9)
        • Publishing (8)
        • Git (11)
        • React (1)
        • Vue (0)
        • 웹접근성 (1)
        • Gulp (1)
      • 🐣codeLab (17)
      • 🌈etc (9)
      • 🔥 TIL (16)
      • 🥰 일상 (2)
      • 🌟읽어보기 (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CSS 선택자
    자바스크립트 slidedown
    js 아코디언
    자바스크립트 컬렉션
    아코디언메뉴
    javascript slideup
    css flex
    자바스크립트 slideup
    sticky 활용
    html collection
    HTML Form
    sticky jsfiddle
    vscode 단축키
    형제인접자 안되는 이유
    sticky codepen
    sass compiler
    javascript accordion
    sass
    javascript htmlcollection nodelist
    웹접근성
    javascript htmlcollection
    접근성 주의사항
    javascript 아코디언
    javascript 컬렉션
    javascript nodelist
    css 형제인접자 안돼요
    javascript slidedown
    형제인접자 display none
    css 가상선택자
    형제인접자
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jmjm
JavaScript로 slideDown, slideUp 구현해보기
상단으로

티스토리툴바