UNPKG

17 kBHTMLView Raw
1<!doctype html>
2<html lang="en">
3 <head>
4 ${require('./_head.html')
5 title="Dropdowns"
6 description="Dropdown menus and custom selects without JavaScript."
7 canonical="dropdowns.html"
8 }
9 </head>
10
11 <body>
12 ${require('./_nav.html')}
13
14 <main class="container" id="docs">
15 ${require('./_sidebar.html') active="dropdowns-link"}
16
17 <div role="document">
18 <section id="dropdown">
19 <hgroup>
20 <h1>Dropdowns</h1>
21 <h2>Dropdown menus and custom selects without JavaScript.</h2>
22 </hgroup>
23 <p>Dropdowns are built with <code>&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;</code> as a wrapper and <code>&lt;<b>summary</b>&gt;</code> and <code>&lt;<b>ul</b>&gt;</code> as direct children.</p>
24 <p>For style consistency with the form elements, dropdowns are styled like a <a href="forms.html">&lt;select&gt;</a> by default.</p>
25 <article aria-label="Dropdowns as Selects">
26 <details role="list">
27 <summary aria-haspopup="listbox">Dropdown</summary>
28 <ul role="listbox">
29 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
30 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
31 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
32 </ul>
33 </details>
34 <select required>
35 <option value="" disabled selected>Select</option>
36 <option>Option</option>
37 <option>Another option</option>
38 <option>Something else here</option>
39 </select>
40 <footer class="code">
41
42<pre><code><em>&lt;!-- Dropdown --&gt;</em>
43&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
44 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u>&gt;Dropdown&lt;/<b>summary</b>&gt;
45 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
46 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
47 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
48 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
49 &lt;/<b>ul</b>&gt;
50&lt;/<b>details</b>&gt;
51
52<em>&lt;!-- Select --&gt;</em>
53&lt;<b>select</b></u>&gt;
54 &lt;<b>option</b> <i>value</i>=<u>""</u> <i>disabled selected</i>&gt;Select&lt;/<b>option</b>&gt;
55 &lt;<b>option</b>&gt;…&lt;/<b>option</b>&gt;
56&lt;/<b>select</b>&gt;
57</code></pre>
58
59 </footer>
60 </article>
61 <p><code>&lt;<b>summary</b> <i>role</i>=<u>"button"</u>&gt;</code> transforms the dropdown into a button.</p>
62 <article aria-label="Dropdowns as Buttons">
63 <details role="list">
64 <summary aria-haspopup="listbox" role="button">Dropdown as a button 1</summary>
65 <ul role="listbox">
66 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
67 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
68 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
69 </ul>
70 </details>
71 <details role="list">
72 <summary aria-haspopup="listbox" role="button" class="secondary">Dropdown as a button 2</summary>
73 <ul role="listbox">
74 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
75 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
76 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
77 </ul>
78 </details>
79 <details role="list">
80 <summary aria-haspopup="listbox" role="button" class="contrast">Dropdown as a button 3</summary>
81 <ul role="listbox">
82 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
83 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
84 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
85 </ul>
86 </details>
87 <footer class="code">
88
89<pre><code><em>&lt;!-- Primary --&gt;</em>
90&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
91 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u> <i>role</i>=<u>"button"</u>&gt;
92 Dropdown as a button 1
93 &lt;/<b>summary</b>&gt;
94 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
95 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
96 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
97 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
98 &lt;/<b>ul</b>&gt;
99&lt;/<b>details</b>&gt;
100
101<em>&lt;!-- Secondary --&gt;</em>
102&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
103 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u> <i>role</i>=<u>"button"</u> <i>class</i>=<u>"secondary"</u>&gt;
104 Dropdown as a button 2
105 &lt;/<b>summary</b>&gt;
106 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
107 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
108 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
109 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
110 &lt;/<b>ul</b>&gt;
111&lt;/<b>details</b>&gt;
112
113<em>&lt;!-- Contrast --&gt;</em>
114&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
115 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u> <i>role</i>=<u>"button"</u> <i>class</i>=<u>"contrast"</u>&gt;
116 Dropdown as a button 3
117 &lt;/<b>summary</b>&gt;
118 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
119 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
120 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
121 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
122 &lt;/<b>ul</b>&gt;
123&lt;/<b>details</b>&gt;
124</code></pre>
125
126 </footer>
127 </article>
128 <p>Dropdowns can be used as custom selects with <code>&lt;<b>input</b> <i>type</i>=<u>"radio"</u>&gt;</code> or <code>&lt;<b>input</b> <i>type</i>=<u>"checkbox"</u>&gt;</code></p>
129 <article aria-label="Dropdowns with radio buttons or checkboxes">
130 <details role="list">
131 <summary aria-haspopup="listbox">Select single element</summary>
132 <ul role="listbox">
133 <li>
134 <label for="small">
135 <input type="radio" id="small" name="size" value="small" />
136 Small
137 </label>
138 </li>
139 <li>
140 <label for="medium">
141 <input type="radio" id="medium" name="size" value="medium" />
142 Medium
143 </label>
144 </li>
145 <li>
146 <label for="large">
147 <input type="radio" id="large" name="size" value="large" />
148 Large
149 </label>
150 </li>
151 </ul>
152 </details>
153 <details role="list">
154 <summary aria-haspopup="listbox">Select multiple elements</summary>
155 <ul role="listbox">
156 <li>
157 <label>
158 <input type="checkbox" />
159 Banana
160 </label>
161 </li>
162 <li>
163 <label>
164 <input type="checkbox" />
165 Watermelon
166 </label>
167 </li>
168 <li>
169 <label>
170 <input type="checkbox" />
171 Apple
172 </label>
173 </li>
174 </ul>
175 </details>
176 <footer class="code">
177
178<pre><code><em>&lt;!-- With radio buttons --&gt;</em>
179&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
180 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u>&gt;Dropdown&lt;/<b>summary</b>&gt;
181 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
182 &lt;<b>li</b>&gt;
183 &lt;<b>label</b> <i>for</i>=<u>"small"</u>&gt;
184 &lt;<b>input</b> <i>type</i>=<u>"radio"</u> <i>id</i>=<u>"small"</u> <i>name</i>=<u>"size"</u> <i>value</i>=<u>"small"</u>&gt;
185 Small
186 &lt;/<b>label</b>&gt;
187 &lt;/<b>li</b>&gt;
188 &lt;<b>li</b>&gt;
189 &lt;<b>label</b> <i>for</i>=<u>"medium"</u>&gt;
190 &lt;<b>input</b> <i>type</i>=<u>"radio"</u> <i>id</i>=<u>"medium"</u> <i>name</i>=<u>"size"</u> <i>value</i>=<u>"medium"</u>&gt;
191 Medium
192 &lt;/<b>label</b>&gt;
193 &lt;/<b>li</b>&gt;
194 &lt;<b>li</b>&gt;
195 &lt;<b>label</b> <i>for</i>=<u>"large"</u>&gt;
196 &lt;<b>input</b> <i>type</i>=<u>"radio"</u> <i>id</i>=<u>"large"</u> <i>name</i>=<u>"size"</u> <i>value</i>=<u>"large"</u>&gt;
197 Large
198 &lt;/<b>label</b>&gt;
199 &lt;/<b>li</b>&gt;
200 &lt;/<b>ul</b>&gt;
201&lt;/<b>details</b>&gt;
202
203<em>&lt;!-- With checkboxes --&gt;</em>
204&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
205 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u>&gt;Dropdown&lt;/<b>summary</b>&gt;
206 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
207 &lt;<b>li</b>&gt;
208 &lt;<b>label</b>&gt;
209 &lt;<b>input</b> <i>type</i>=<u>"checkbox"</u>&gt;
210 Banana
211 &lt;/<b>label</b>&gt;
212 &lt;/<b>li</b>&gt;
213 &lt;<b>li</b>&gt;
214 &lt;<b>label</b>&gt;
215 &lt;<b>input</b> <i>type</i>=<u>"checkbox"</u>&gt;
216 Watermelon
217 &lt;/<b>label</b>&gt;
218 &lt;/<b>li</b>&gt;
219 &lt;<b>li</b>&gt;
220 &lt;<b>label</b>&gt;
221 &lt;<b>input</b> <i>type</i>=<u>"checkbox"</u>&gt;
222 Apple
223 &lt;/<b>label</b>&gt;
224 &lt;/<b>li</b>&gt;
225 &lt;/<b>ul</b>&gt;
226&lt;/<b>details</b>&gt;
227
228 </footer>
229 </article>
230 <p>Dropdowns can be used inside a <a href="navs.html">&lt;nav&gt;</a> with a nested <code>&lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;</code></p>
231 <p>Example with a dropdown as a link:</p>
232 <article aria-label="Dropdowns inside a nav">
233 <nav>
234 <ul>
235 <li><strong>Brand</strong></li>
236 </ul>
237 <ul>
238 <li><a href="#" onclick="event.preventDefault()">Link</a></li>
239 <li>
240 <details role="list" dir="rtl">
241 <summary aria-haspopup="listbox" role="link">Dropdown</summary>
242 <ul role="listbox">
243 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
244 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
245 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
246 </ul>
247 </details>
248 </li>
249 </ul>
250 </nav>
251 <footer class="code">
252
253<pre><code>&lt;<b>nav</b>&gt;
254 &lt;<b>ul</b>&gt;
255 &lt;<b>li</b>&gt;&lt;<b>strong</b>&gt;Brand&lt;/<b>strong</b>&gt;&lt;/<b>li</b>&gt;
256 &lt;/<b>ul</b>&gt;
257 &lt;<b>ul</b>&gt;
258 &lt;<b>li</b>&gt;&lt;<b>a</b> <i>href</i>=<u>"#"</u>&gt;Link&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
259 &lt;<b>li</b>&gt;
260 &lt;<b>details</b> <i>role</i>=<u>"list"</u> <i>dir</i>=<u>"rtl"</u>&gt;
261 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u> <i>role</i>=<u>"link"</u>&gt;Dropdown&lt;/<b>summary</b>&gt;
262 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
263 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
264 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
265 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
266 &lt;/<b>ul</b>&gt;
267 &lt;/<b>details</b>&gt;
268 &lt;/<b>li</b>&gt;
269 &lt;/<b>ul</b>&gt;
270&lt;/<b>nav</b>&gt;</code></pre>
271
272 </footer>
273 </article>
274 <p>Example with a default dropdown and a dropdown as a button:</p>
275 <article aria-label="Dropdowns inside a nav">
276 <nav>
277 <ul>
278 <li>
279 <details role="list">
280 <summary aria-haspopup="listbox">Dropdown</summary>
281 <ul role="listbox">
282 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
283 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
284 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
285 </ul>
286 </details>
287 </li>
288 <li>
289 <details role="list">
290 <summary aria-haspopup="listbox" role="button">Dropdown</summary>
291 <ul role="listbox">
292 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
293 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
294 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
295 </ul>
296 </details>
297 </li>
298 </ul>
299 </nav>
300 <footer class="code">
301
302<pre><code>&lt;<b>nav</b>&gt;
303 &lt;<b>ul</b>&gt;
304 &lt;<b>li</b>&gt;
305 &lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
306 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u>&gt;Dropdown&lt;/<b>summary</b>&gt;
307 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
308 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
309 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
310 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
311 &lt;/<b>ul</b>&gt;
312 &lt;/<b>details</b>&gt;
313 &lt;/<b>li</b>&gt;
314 &lt;<b>li</b>&gt;
315 &lt;<b>details</b> <i>role</i>=<u>"list"</u>&gt;
316 &lt;<b>summary</b> <i>aria-haspopup</i>=<u>"listbox"</u> <i>role</i>=<u>"button"</u>&gt;Dropdown&lt;/<b>summary</b>&gt;
317 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
318 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
319 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
320 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
321 &lt;/<b>ul</b>&gt;
322 &lt;/<b>details</b>&gt;
323 &lt;/<b>li</b>&gt;
324 &lt;/<b>ul</b>&gt;
325&lt;/<b>nav</b>&gt;</code></pre>
326
327 </footer>
328 </article>
329 <p>You can also use <code>&lt;<b>li</b> <i>role</i>=<u>"list"</u>&gt;</code> as a nested wrapper to render a list as a dropdown.</p>
330 <p>ℹ️&nbsp;This syntax is experimental. In this version, the dropdown menu is triggered on hover.</p>
331 <article aria-label="Dropdowns inside a nav">
332 <nav>
333 <ul>
334 <li><strong>Brand</strong></li>
335 </ul>
336 <ul>
337 <li><a href="#" onclick="event.preventDefault()">Link</a></li>
338 <li><a href="#" onclick="event.preventDefault()">Link</a></li>
339 <li role="list" dir="rtl">
340 <a href="#" onclick="event.preventDefault()" aria-haspopup="listbox">Dropdown</a>
341 <ul role="listbox">
342 <li><a href="#" onclick="event.preventDefault()">Action</a></li>
343 <li><a href="#" onclick="event.preventDefault()">Another action</a></li>
344 <li><a href="#" onclick="event.preventDefault()">Something else here</a></li>
345 </ul>
346 </li>
347 </ul>
348 </nav>
349 <footer class="code">
350
351<pre><code>&lt;<b>nav</b>&gt;
352 &lt;<b>ul</b>&gt;
353 &lt;<b>li</b>&gt;&lt;<b>strong</b>&gt;Brand&lt;/<b>strong</b>&gt;&lt;/<b>li</b>&gt;
354 &lt;/<b>ul</b>&gt;
355 &lt;<b>ul</b>&gt;
356 &lt;<b>li</b>&gt;&lt;<b>a</b> <i>href</i>=<u>"#"</u>&gt;Link&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
357 &lt;<b>li</b>&gt;&lt;<b>a</b> <i>href</i>=<u>"#"</u>&gt;Link&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
358 &lt;<b>li</b> <i>role</i>=<u>"list"</u> <i>dir</i>=<u>"rtl"</u>&gt;
359 &lt;<b>a</b> <i>href</i>=<u>"#"</u> <i>aria-haspopup</i>=<u>"listbox"</u>&gt;Dropdown&lt;/<b>a</b>&gt;
360 &lt;<b>ul</b> <i>role</i>=<u>"listbox"</u>&gt;
361 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
362 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Another action&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
363 &lt;<b>li</b>&gt;&lt;<b>a</b>&gt;Something else here&lt;/<b>a</b>&gt;&lt;/<b>li</b>&gt;
364 &lt;/<b>ul</b>&gt;
365 &lt;/<b>li</b>&gt;
366 &lt;/<b>ul</b>&gt;
367&lt;/<b>nav</b>&gt;</code></pre>
368
369 </footer>
370 </article>
371 </section>
372
373 ${require('./_footer.html')}
374
375 </div>
376 </main>
377 <script src="js/commons.min.js"></script>
378 </body>
379</html>