콘텐츠를 <details>로 감싸고 맨 앞에 <summary>를 두세요. summary는 계속 보이고, 나머지는 독자가 클릭할 때까지 숨겨져요.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>details</title>
</head>
<body style="font-family: system-ui, sans-serif;">
<details>
<summary>What is included in the free plan?</summary>
<p>Five projects, community support and all the beginner courses.</p>
</details>
</body>
</html>
질문을 클릭하면 열리고, 다시 클릭하면 닫혀요. 브라우저가 삼각형 표시를 붙이고, summary가 포커스를 받게 하고, Enter나 Space로 열고 닫게 하고, 펼쳐졌는지 접혔는지 스크린 리더에 알려 줘요. JavaScript는 전혀 쓰이지 않아요.
<summary>를 빼면 브라우저가 대신 기본 라벨(영어에서는 "Details")을 보여 줘요.
처음부터 열어 두기
불리언 open 속성은 처음부터 콘텐츠를 보여 줘요. 독자가 열고 닫을 때 브라우저가 open을 추가하고 제거하니, 스타일을 입히는 고리로도 써요.
<summary> 안에 링크, 버튼, 폼 필드는 피하세요. summary 자체가 이미 컨트롤이라서, 그 안의 컨트롤은 놓치거나 실수로 누르기 쉽고, 스크린 리더도 중첩된 컨트롤을 제대로 알려 주지 못해요. 인터랙티브 콘텐츠는 대신 <details> 본문에 넣으세요.
자주 하는 실수
<div>와 JavaScript로 토글을 만듦.<details>는 이미 클릭, 키, 스크린 리더 상태를 처리해요. 직접 만든 토글이 꼭 필요하다면 aria-expanded와 함께 button을 쓰세요.
<summary>를 맨 앞이 아닌 곳에 둠. 반드시 <details>의 첫 번째 자식이어야 해요.
대체 표시 없이 표시를 숨김. 위의 더하기 기호처럼 summary가 열린다는 신호를 독자에게 주세요.
display로 콘텐츠를 숨김. 대신 open을 토글하세요. 콘텐츠를 강제로 보이거나 숨기는 CSS는 브라우저의 상태와 충돌해요.
사람들이 비교하는 콘텐츠에 배타적 묶음을 씀. 한 번에 하나만 여는 게 맞을 때만 name을 쓰세요.
자주 묻는 질문
HTML에서 details와 summary는 무슨 일을 하나요?
<details>는 열고 닫을 수 있는 섹션인 공개(disclosure) 위젯을 만들어요. 첫 번째 자식인 <summary>는 항상 보이는 라벨이고, 클릭하면(또는 포커스가 있을 때 Enter나 Space를 누르면) <details> 안의 나머지 전부가 보이거나 숨겨져요.
details 요소를 처음부터 열린 상태로 하려면 어떻게 하나요?
불리언 open 속성을 추가하세요. <details open>처럼요. 사용자가 열고 닫을 때 브라우저가 이 속성을 추가하고 제거하기 때문에, CSS로 details[open]을 꾸밀 수 있어요.
하나만 열리는 아코디언은 어떻게 만드나요?
묶음의 모든 <details>에 name="faq"처럼 같은 name 속성을 주세요. 하나를 열면 같은 묶음의 나머지가 닫혀요. JavaScript는 필요 없어요.
details summary의 화살표를 없애거나 바꾸려면 어떻게 하나요?
summary에 list-style: none을 주고, Safari를 위해 summary::-webkit-details-marker { display: none; }을 추가하세요. 그다음 summary::after 등으로 표시를 직접 그리고, details[open] summary::after로 바꾸세요.
details 요소가 열리는 걸 감지할 수 있나요?
네. <details> 요소에서 toggle 이벤트를 듣고 open 속성을 읽으세요. JavaScript에서 details.open = true로 설정하면 열려요.