Since <summary>
has display: list-style
, customising the disclosure marker can be done by setting the list-style-type
property:
details > summary {
list-style-type: '▶️';
}
details[open] > summary {
list-style-type: '🔽';
}
details {
border: 1px solid gray;
border-radius: 0.2rem;
padding: 0.5rem;
}
details[open] > summary {
margin-bottom: 0.5rem;
}
<details>
<summary>An example</summary>
With some example text shown when expanded.
</details>
Unfortunately some current-generation browsers (ahem, Safari …) still don’t support this. One workaround is to set list-style: none
, and then provide a custom content
via the ::marker
pseudo-element. This can still be used to provide further customisations. Except … well, Safari also doesn’t support ::marker
, it only supports the non-standard ::-webkit-details-marker
. And it doesn’t support setting custom contents within it. So instead we need to hide the element and set the actual icon via ::before
:
details > summary {
list-style-type: none;
}
details > summary::-webkit-details-marker {
display: none;
}
details > summary::before {
content: '▶️';
}
details[open] > summary::before {
content: '🔽';
}
details {
border: 1px solid gray;
border-radius: 0.2rem;
padding: 0.5rem;
}
details[open] > summary {
margin-bottom: 0.5rem;
}
<details>
<summary>An example</summary>
With some example text shown when expanded.
</details>