|
| 1 | +/** |
| 2 | + This component displays a figure with an accompanying figure caption. Use it |
| 3 | + to display diagrams, charts, and other images that have an explanatory |
| 4 | + caption that should be visible to everyone. |
| 5 | +
|
| 6 | + For some info regarding alt text vs fig captions, see this stack overflow |
| 7 | + response from a blind user (available at |
| 8 | + https://stackoverflow.com/questions/58447538/accessibility-difference-between-img-alt-and-figcaption): |
| 9 | +
|
| 10 | + I'm a blind user. I would say that there are two big categories of images on the web: |
| 11 | +
|
| 12 | + 1. Functional images |
| 13 | + 2. Illustrative images a.k.a. figures |
| 14 | +
|
| 15 | + AS the name says, figcaption is a caption for a figure. The caption is |
| 16 | + always visible by everybody, not only blind people. Figures are images that |
| 17 | + can be found in a book, an article, or whatever more or less long paragraphs |
| 18 | + of text. Most of the time, figures are purely illustrative. |
| 19 | +
|
| 20 | + When you use figcaption, the alt attribute should probably be empty: |
| 21 | +
|
| 22 | + - Copying the text of the figcaption into the alt attribute, or any |
| 23 | + shortened version, is almost always useless: the screen reader will read |
| 24 | + twice the same or almost the same information, and it's worth absolutely |
| 25 | + nothing |
| 26 | +
|
| 27 | + - You may think that the alt attribute could be useful for a longer |
| 28 | + description of the image, that wouldn't fit in the figcaption; for example |
| 29 | + a detailed description of a chart or a diagram. But in fact, this kind of |
| 30 | + description is better below the image or in another page (then available |
| 31 | + for everybody), rather than in the alt attribute. The alt attribute should |
| 32 | + normally remain short. |
| 33 | +
|
| 34 | + - You may think that the figcaption is useless and only set the alt |
| 35 | + attribute to something. Example: "Photo with Alice on the left, Bob on the |
| 36 | + right". But in fact sighted people could as well find this information |
| 37 | + useful, if they don't know Alice and Bob for example. So it could be |
| 38 | + interesting to move this description to the figcaption, so that everybody |
| 39 | + benefits from it and not only blind people. |
| 40 | +
|
| 41 | + Now, the biggest case when you won't use figure/figcaption is when images |
| 42 | + are functional: a button taht can be clicked, an icon with a precise |
| 43 | + meaning, etc. The basic rules for alt texts of functional images are: |
| 44 | +
|
| 45 | + - If you can interact with the image to perform actions (click, etc.), or if |
| 46 | + the icon conveys an information, then you must set a non-empty alt. It |
| 47 | + must be a function description, not a objective description of the image. |
| 48 | +
|
| 49 | + Example 1: "Go back" is good, while "Blue left arrow" is bad. |
| 50 | + Example 2: "Unread message" is good, while "Closed enveloppe" is bad |
| 51 | +
|
| 52 | + - Otherwise, if the image provide no interaction and if it doesn't convey |
| 53 | + any information, then it is illustrative; the alt should be empty in that |
| 54 | + case. |
| 55 | +
|
| 56 | + ------ |
| 57 | +
|
| 58 | + However, even when using fig captions, there **may** be times when also |
| 59 | + using an alt is appropriate, which is why it's an optional attribute on |
| 60 | + this component. However, if you do use it, make sure it conveys |
| 61 | + **separate** information to what the fig caption does. |
| 62 | +
|
| 63 | +
|
| 64 | +**/ |
| 65 | + |
| 66 | +import React from 'react'; |
| 67 | +import useBaseUrl from '@docusaurus/useBaseUrl'; |
| 68 | + |
| 69 | +import './styles.module.css'; |
| 70 | + |
| 71 | +type Props = { |
| 72 | + // An optional alt text, if the caption does not already convey all relevant |
| 73 | + // information. |
| 74 | + alt?: string; |
| 75 | + // The figure caption, visible to everyone |
| 76 | + caption: string; |
| 77 | + // the path to the image, starting with `/img/`. Example: /img/image.png |
| 78 | + img: string; |
| 79 | +}; |
| 80 | + |
| 81 | +const Component: React.FC<Props> = ({ img, alt, caption }) => { |
| 82 | + return ( |
| 83 | + <figure> |
| 84 | + <img alt={alt} src={useBaseUrl(img)} /> |
| 85 | + <figcaption>{caption}</figcaption> |
| 86 | + </figure> |
| 87 | + ); |
| 88 | +}; |
| 89 | + |
| 90 | +export default Component; |
0 commit comments