Using icon fonts is generally discouraged due to rendering inconsistencies, accessibility issues, and semantic limitations. This article outlines a streamlined workflow for creating and implementing accessible SVG icons, leveraging the power of SVG sprites.
While SVGs might seem complex, this approach simplifies the process. We'll utilize readily available icons and automate sprite generation for efficient management.
Key Advantages:
<title></title>
and <desc></desc>
tags.Workflow Overview:
spritesh
(installable via npm: npm install spritesh -g
) to generate an SVG sprite from your individual icon files. This consolidates all icons into a single file for efficient loading. A sample command: spritesh --input assets/images/icons --output _includes/sprite.svg --viewbox "0 0 16 16" --prefix icon-
{% include sprite.svg %}
in Jekyll).<use></use>
tag to reference icons from the sprite. This component should allow for easy customization of classes, viewBox
, and accessibility attributes.<title></title>
and <desc></desc>
tags to provide context for screen readers, enhancing accessibility. These descriptions should be context-specific, dynamically added based on the icon's usage.Example Icon Component (Jekyll):
{% capture id %}{% increment uniqueid %}{% endcapture %} <svg viewBox="0 0 16 16" role="img" class="icon icon-{{ include.icon }}" aria-labelledby="{% if include.title %}title-{{ id }}{% endif %}{% if include.desc %} desc-{{ id }}{% endif %}"> {% if include.title %} <title id="title-{{ id }}">{{ include.title }}</title> {% endif %} {% if include.desc %} <desc id="desc-{{ id }}">{{ include.desc }}</desc> {% endif %} <use xlink:href="#icon-{{ include.icon }}"></use> </svg>
Example Icon Component (React):
import { uniqueId } from 'lodash'; const Icon = (props) => { const id = uniqueId(); return ( <svg role="img" viewBox="0 0 16 16" className={`icon icon-${props.icon}`} aria-labelledby={ (props.title ? `title-${id}` : '') + (props.desc ? ` desc-${id}` : '') }> {props.title && <title id={`title-${id}`}>{props.title}</title>} {props.desc && <desc id={`desc-${id}`}>{props.desc}</desc>} <use xlinkHref={`#icon-${props.icon}`} /> </svg> ); }; export default Icon;
Optimization: Integrate tools like SVGO (npm install svgo
) to optimize SVG files before sprite generation for improved performance. Use npm scripts to automate this process.
This workflow provides a robust, maintainable, and accessible solution for managing SVG icons in your projects. Remember to always test your icons across different browsers and screen readers to ensure optimal accessibility.
The above is the detailed content of A Working SVG Workflow for Accessible Icons. For more information, please follow other related articles on the PHP Chinese website!