HTML details summary만으로 FAQ 아코디언을 만들 수 있다는 사실에 놀라는 여성 개발자 캐릭터 일러스트

HTML details summary로 FAQ 아코디언 만들기

HTML details summary로만 FAQ 아코디언 만들기가 가능하다고?

FAQ 아코디언 만들기는 JavaScript와 CSS로 직접 구현해야 되는 줄로만 알았는데 HTML details summary 태그만 가지고도 만들 수 있다는 사실을 알게 되었습니다. 별도의 JavaScript 없이도 완벽한 아코디언 UI를 구현할 수 있어 개발 시간을 크게 단축할 수 있습니다.

하지만 실무에서는 JavaScript/CSS로 직접 구현한 경우가 더 많이 보입니다.

일단 HTML details summary 태그가 무엇인지 알아보고, 간단한 예제를 통해서 배워보고, 왜 JavaScript/CSS로 직접 구현하는 방식이 더 많이 사용되는지 알아보겠습니다.

HTML details summary만으로 FAQ 아코디언을 만들 수 있다는 사실에 놀라는 여성 개발자 캐릭터 일러스트
HTML details summary로만 FAQ 아코디언을 만들 수 있다고?

HTML details summary는 무엇이며, 언제 생겼나요?

HTML details summary는 웹 콘텐츠의 일부를 접거나 펼치는 기능을 제공하기 위해 만들어졌습니다.는 웹 콘텐츠의 일부를 접거나 펼치는 기능을 제공하기 위해 만들어졌습니다.

HTML5에 새롭게 도입된 태그로, 2011년에 표준으로 제안되었습니다. 모든 주요 브라우저에서 안정적으로 지원된 시점은 2020년 1월부터는 모든 주요 브라우저에서 안정적으로 지원됩니다. 즉, 이제는 마음 놓고 실무에 사용해도 괜찮다는 의미입니다.

기본 사용법과 예제, 브라우저별 호환성 정보는 아래 링크에 아주 잘 나와있습니다.
https://developer.mozilla.org/ko/docs/Web/HTML/Reference/Elements/details

HTML details summary로 FAQ 아코디언 만들기 예제

가장 기본적인 아코디언

<details>
  <summary>심플 코딩 연구소는 어떤 블로그인가요?</summary>
  <p>좋은 블로그입니다.</p>
</details>

<details>
  <summary>좋은 블로그인데 방문자가 왜 이렇게 없나요?</summary>
  <p>그러게 말입니다.</p>
</details>

특정 항목을 처음부터 열어두기

<details open>
  <summary>처음부터 열려있는 FAQ</summary>
  <p>이 아코디언은 페이지 로드 시 자동으로 열린 상태로 표시됩니다.</p>
</details>
<details>
  <summary>닫혀있는 FAQ</summary>
  <p>이 아코디언은 페이지 로드 시 자동으로 열린 상태로 표시됩니다.</p>
</details>

한 번에 하나만 열리게 만들기

<details name="abc">
  <summary>1번 FAQ</summary>
  <p>1번 답</p>
</details>
<details name="abc">
  <summary>2번 FAQ</summary>
  <p>2번 답</p>
</details>

아쉽게도 순수 HTML만으로는 ‘하나를 열면 다른 하나는 닫히는’ 전통적인 아코디언 동작을 완벽하게 구현할 수 없습니다. name 속성을 사용하면 비슷한 동작을 흉내 낼 수는 있지만, 일부 구형 브라우저에서는 지원하지 않는 등 한계가 명확합니다.

제가 근무하는 회사의 내부망처럼 크롬 브라우저 버전이 고정된 환경에서는 name 속성이 아예 동작하지 않는 것을 직접 확인했습니다. 이런 호환성 문제가 바로 실무에서 이 방식이 널리 쓰이지 못하는 이유 중 하나입니다.

따라서 이 기능이 꼭 필요하다면, 아래처럼 아주 약간의 JavaScript를 추가하는 것이 가장 확실하고 안정적인 방법입니다.

<div class="faq-accordion">
  <details>
    <summary>1번 질문</summary>
    <p>1번 답변입니다.</p>
  </details>
  <details>
    <summary>2번 질문</summary>
    <p>2번 답변입니다.</p>
  </details>
</div>

<script>
  const details = document.querySelectorAll('.faq-accordion details');
  details.forEach(targetDetail => {
    targetDetail.addEventListener('click', () => {
      details.forEach(detail => {
        if (detail !== targetDetail) {
          detail.removeAttribute('open');
        }
      });
    });
  });
</script>

위 3개 예제 정도만 알면 HTML details summary 기본 사용법은 끝이라고 볼 수 있습니다.

JavaScript/CSS로 아코디언 만들기 예제

글이 너무 길어질 것 같아서 예제 소스는 아래 링크로 대신합니다.

https://www.w3schools.com/howto/howto_js_collapsible.asp

HTML details summary 태그만 가지고 만드는 것보다는 훨씬 복잡하구나라는 것만 알아두시면 됩니다. 그마저도 위의 한 개가 열리면 나머지는 닫히는 아코디언 예제는 빠진 상태입니다.

HTML details summary 아코디언 vs JavaScript/CSS 아코디언

일단 실무에서는 아코디언이 포함되어 있는 라이브러리나 프레임워크를 쓴 경우가 제일 많을 것입니다.

직접 구현하는 경우도 있는데 이럴 때는 JavaScript/CSS로 직접 구현한 아코디언이 더 많이 보입니다. HTML 태그만 사용한 아코디언이 훨씬 간편한데 왜 JavaScript/CSS로 직접 구현한 아코디언이 훨씬 많이 보일까요?

  • 브라우저 종류별로 모양이나 동작이 차이가 있을 수 있다. (CSS와 Javascript를 이용해 어느 정도 해결이 가능하지만 그렇게 되면 이 방법의 장점인 간편함이 많이 사라짐)
  • 디자인 변경이 JavaScript/CSS로 직접 구현하는 거에 비해 자유롭지 못함

전체적으로 두 가지 방법의 차이점을 아래의 표에서 살펴보겠습니다. HTML 태그로만 구현했을 때 단점이 크지만 성능이나 SEO 같은 장점도 가지고 있습니다.

구분HTML details summary 아코디언JavaScript/CSS 아코디언
개발 복잡도매우 간단 (HTML만 작성)복잡 (HTML, CSS, JS 모두 필요)
로딩 속도빠름 (추가 스크립트 없음)느림 (라이브러리 로딩 필요)
브라우저 지원모든 주요 브라우저 지원구현에 따라 다름
접근성기본적으로 우수별도 구현 필요
SEO매우 우수 (검색엔진이 모든 콘텐츠 읽음)제한적 (동적 콘텐츠는 읽기 어려움)
커스터마이징CSS로 제한적자유롭게 가능
애니메이션기본적으로 제한적자유롭게 구현 가능
유지보수쉬움복잡함

선택 기준

  • 빠르게 만들고, SEO와 웹 접근성이 중요하다면? -> 단연코 <details> 태그를 추천합니다. (블로그, 간단한 정보 페이지 등)
  • 화려한 애니메이션과 복잡한 상호작용이 필요하다면? -> JavaScript 기반 라이브러리나 직접 구현이 더 적합합니다. (브랜드 웹사이트, 웹 애플리케이션 등)

부록: HTML details summary의 못생긴 기본 디자인 CSS로 꾸미기

사실 기본 디자인을 그대로 쓰기는 힘듭니다. 가볍게 딱 3가지 작업만 해서 볼만하게 꾸며보겠습니다.

1. 기본 화살표 제거하기

summary {
  list-style: none; /* Firefox */
}
summary::-webkit-details-marker {
  display: none; /* Chrome, Safari */
}

2. 커스텀 아이콘(🔽, 🔼) 추가하기

summary {
  position: relative;
  padding-left: 1.5rem; /* 아이콘을 위한 공간 확보 */
  cursor: pointer;
}

summary::before {
  content: '▶️'; /* 닫혔을 때 아이콘 */
  position: absolute;
  left: 0;
  font-size: 1.2rem;
  line-height: 1;
}

details[open] > summary::before {
  content: '🔽'; /* 열렸을 때 아이콘 */
}

3. 부드러운 애니메이션과 디자인 적용하기

details {
  border: 1px solid #e0e0e0;
  border-radius: 4px;
  margin-bottom: 8px;
}

summary {
  padding: 2rem;
  font-weight: bold;
  background-color: #f7f7f7;
}

details[open] > summary {
  border-bottom: 1px solid #e0e0e0;
}

details > p {
  padding: 1rem;
  background-color: #ffffff;
  /* 부드러운 애니메이션을 위한 준비 (max-height) */
  overflow: hidden;
  transition: max-height 0.3s ease-out;
}

완성된 결과물을 비교

HTML details summary 기본 디자인과 CSS로 꾸민 아코디언 디자인 비교
HTML details summary 기본 디자인과 CSS로 꾸민 아코디언 디자인 비교

결론

HTML details summary에 대해서 자세하게 알아봤습니다. 결론은 두 가지 방법 다 장단점이 다르니 상황에 맞게 써야 한다가 되겠네요.

그래도 FAQ 아코디언 만들기 같은 경우 무조건 복잡한 JavaScript/CSS 직접 구현으로만 되는 줄 알았는데 HTML 태그 만으로도 구현이 가능하다는 사실을 알게 되어서 좋았습니다.

또한 HTML의 기본 기능을 최대한 활용하는 것만으로도 더 나은 웹을 만들 수 있다는 점도 잊지 말아야 하겠네요.

Similar Posts

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다