Bad code
<button display="flex" role="button">
<svg role="img" viewBox="0 0 13 13" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" height="15px" width="15px" fill="#000" name="close">
<title>Close dialog</title>
<path d="…"> </path>
</svg>
</button>Issues and how to fix them
- Either turn the
<svg>into a semantic element (role="img") or exclude it from the accessibility tree (aria-hidden="true"). Doing both makes no sense. - The button has no accessible name (a text alternative). The
titleelement in thesvgwould serve as the accessible name, butaria-hidden="true"makes the whole SVG inaccessible to assistive technology. - Even without
aria-hidden="true", some screen reader/browser combinations might not recognise the<title>element. Label the<svg>usingaria-labelledbyoraria-label. - The
role=buttonattribute and value for the button is redundant. Its implicit default role is “button”. - There's no
displayattribute. If you need custom attributes, use thedata-prefix. - The
nameattribute is not allowed on<svg> - The value of the
widthandheightattributes should be a valid non-negative integer. - Add a
type="button"attribute and value to prevent the button from submitting a form, if there is one.
Good code
<button type="button" data-display="flex">
<svg role="img" viewBox="0 0 13 13" xmlns="http://www.w3.org/2000/svg" height="15" width="15" fill="#000" aria-labelledby="title">
<title id="title">Close</title>
<path d="…"> </path>
</svg>
</button>Demo of Voice Over on macOS
Voice Over doesn't recognize the title element nested in a svg nested in a button.
Code on CodePen.