Featured image of post <details> 태그로 쉽게 구현하는 아코디언 메뉴 (CSS/jQuery)

<details> 태그로 쉽게 구현하는 아코디언 메뉴 (CSS/jQuery)

HTML5 <details> 태그로 아코디언 메뉴를 쉽게 만들고, jQuery와 CSS로 부드러운 애니메이션과 스타일을 적용하는 방법을 소개합니다.

아코디언 메뉴, 쉽게 만들고 싶지 않으신가요?

웹사이트를 만들다 보면 자주 필요한 아코디언 메뉴! 사실 복잡한 스크립트 없이도 충분히 구현할 수 있습니다.
HTML5의 <details> 태그를 이용하면 기본적인 열기/닫기 기능은 아주 쉽게 만들 수 있고, 필요하다면 jQuery를 활용하여 부드러운 애니메이션이나 디테일한 제어도 추가할 수 있습니다.

이 글에서는
기본 아코디언 → 문제점 살펴보기 → jQuery로 개선 → CSS로 스타일링 → jQuery 없이 CSS만으로 개선
이런 흐름으로 하나하나 차근차근 설명해 드리겠습니다.


빠르게 만드는 기본형

먼저 HTML만으로 아주 간단한 아코디언 메뉴를 만들어봅시다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<div class="accordion_menu">
    <details>
        <summary>메뉴 1</summary>
        <p>메뉴 1의 내용입니다.</p>
    </details>
    <details>
        <summary>메뉴 2</summary>
        <p>메뉴 2의 내용입니다.</p>
    </details>
    <details>
        <summary>메뉴 3</summary>
        <p>메뉴 3의 내용입니다.</p>
    </details>
</div>

이렇게만 작성해도 클릭 시 메뉴가 열리고 닫히는 기본적인 아코디언 기능을 사용할 수 있습니다.


<details> 태그의 한계점

하지만 기본 <details> 태그에는 이런 한계가 있습니다.

  • 여러 메뉴가 동시에 열립니다.
  • 슬라이드처럼 부드럽게 열리거나 닫히지 않습니다.
  • 브라우저마다 기본 아이콘이 다르고, 커스터마이징이 어렵습니다.

사용자가 더 편리하고 쾌적하게 메뉴를 이용할 수 있도록 개선이 필요합니다.


업그레이드 1 : jQuery로 하나만 열리게 만들기

클릭한 메뉴 하나만 열리고, 나머지는 자동으로 닫히게 만들어볼까요?

1
2
3
4
5
// 하나만 열리도록 제어
$('.accordion_menu summary').on('click', function() {
    const $details = $(this).parent(); // 현재 클릭한 summary의 부모 details 찾기
    $details.siblings('details').removeAttr('open'); // 다른 열린 메뉴 닫기
});

사용자가 새로운 메뉴를 클릭하면, 이전에 열려 있던 메뉴는 자동으로 닫히게 됩니다.
이 스크립트를 사용할 경우, [open] 속성을 활용한 스타일 적용 방법을 참고해주세요.


업그레이드 2 : 슬라이드 애니메이션 추가하기

이번에는 메뉴가 부드럽게 열리고 닫히는 슬라이드 애니메이션을 추가해봅시다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 슬라이드 애니메이션 추가
$('.accordion_menu details').attr('open', true).each(function() {
    const $summary = $(this).find('summary');
    $summary.nextAll().wrapAll('<div class="con"></div>').parent().hide(); // 내용을 감싸고 숨김
    // summary 클릭 시 슬라이드 효과 적용
    $summary.on('click', function(e) {
        e.preventDefault(); // 기본 이벤트 막기
        $(this).next('.con').slideToggle(); // 슬라이드 전환
        $(this).parent().toggleClass('open'); // open 클래스 토글
    });
});

클릭하면 slideToggle() 기능으로 자연스럽게 메뉴가 펼쳐지고 접히는 효과를 볼 수 있습니다.


업그레이드 3 : 슬라이드 애니메이션과 하나만 열리는 아코디언 메뉴

이번에는 메뉴가 부드럽게 열리고 닫히면서, 한 번에 하나의 메뉴만 열리도록 기능을 개선해봅시다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 아코디언 메뉴 + 슬라이드 효과
$('.accordion_menu details').attr('open', true).each(function() {
    const $summary = $(this).find('summary');
    $summary.nextAll().wrapAll('<div class="con"></div>').parent().hide(); // 내용을 감싸고 숨김
    $summary.on('click', function(e) { 
        e.preventDefault(); // 기본 동작 방지
        $(this).next('.con').slideToggle() // 내용 슬라이드 토글
            .parent().siblings().find('.con').slideUp(); // 다른 내용은 슬라이드 업
        $(this).parent().toggleClass('open') // 'open' 클래스 토글
            .siblings().removeClass('open'); // 다른 항목의 'open' 클래스 제거
    });
});

이 코드로 구현하면, 사용자가 하나의 메뉴를 클릭할 때마다 그 메뉴만 부드럽게 열리고, 이미 열린 다른 메뉴는 자동으로 닫히게 됩니다.


아코디언 메뉴 스타일링 다듬기

이제 스타일을 다듬어 더 깔끔한 UI로 만들어봅시다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
.accordion_menu { 
    width: 500px; 
    margin: 0 auto; 
    padding-bottom: 10px; 
    background-color: #fff; 
    border: 1px solid #f8f8f8; 
    border-radius: 6px; 
    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); 
}

.accordion_menu details { 
    display: block; 
    padding: 10px;
} 

.accordion_menu details summary { 
    position: relative; 
    padding: 10px 50px 10px 20px; 
    background-color: #f5f5f5; 
    border-radius: 6px; 
    font-size: 16px; 
    font-weight: 500; 
    color: #333; 
    cursor: pointer; 
    list-style-type: none; 
} 

/* 기본 화살표 아이콘 숨김 */
.accordion_menu details > summary::-webkit-details-marker {
    display: none; 
}

.accordion_menu details summary::before,
.accordion_menu details summary::after { 
    content: ''; 
    position: absolute; 
    top: 50%; 
    right: 20px; 
    width: 10px; 
    height: 2px; 
    background: #333; 
    transform: translate(0, -50%); 
    transition: all 0.3s;
} 

/* 닫힌 상태 화살표 */
.accordion_menu details summary::after {
    transform: translate(0, -50%) rotate(90deg); 
}

/* 열린 상태 화살표 */
.accordion_menu details.open summary::after {
    transform: translate(0, -50%) rotate(0);
}

.accordion_menu details p { 
    margin-top: 10px; 
    font-size: 14px; 
    color: #333; 
} 

메뉴가 열릴 때 화살표가 자연스럽게 회전하는 모습을 볼 수 있습니다.


jQuery 없이 CSS만으로 열림/닫힘 상태 표현하기

jQuery 없이, 오직 HTML과 CSS만으로 열림/닫힘 상태를 제어하는 방법도 가능합니다.

[open] 속성 활용하기

details 요소는 열려 있을 때 자동으로 open 속성이 붙습니다.
이걸 CSS에서 활용하면 상태에 따라 다른 스타일을 줄 수 있습니다.

1
2
3
.accordion_menu details[open] summary::after {
    transform: translateY(-50%) rotate(0deg);
}
  • 기본 상태에서는 after 가상 요소를 90도 회전시켜 플러스(+) 모양을 표시합니다.
  • 메뉴가 열리면 ([open] 속성 추가) after 요소가 0도로 회전하며 마이너스(-) 모양으로 바뀝니다.

추가로 알아두면 좋은 점

  • [open] 속성은 사용자가 메뉴를 열거나 닫을 때 브라우저가 자동으로 추가하거나 제거합니다.
  • 별도 스크립트 없이도 열린 상태를 감지할 수 있어 매우 편리합니다.

결론

HTML과 CSS, jQuery를 적절히 조합하면 누구나 쉽게, 그리고 멋지게 아코디언 메뉴를 완성할 수 있습니다.
궁금한 점이나 추가하고 싶은 기능이 있다면 언제든 댓글로 편하게 남겨주세요! 🙌
최대한 빠르게 답변드리겠습니다.


comments powered by Disqus
Hugo로 만듦
JimmyStack 테마 사용 중