Skip to content
easeweb
Search topics

Emoji read out by their names, not their meaning

A bakery marks each bake with emoji for wheat, milk, peanuts and vegan, so a screen reader reads the pictures' names, such as "sheaf of rice" and "seedling", and the decorative sparkles in the heading too.

WCAG 2.2
SC 1.1.1A
Required by
Section 508 · EN 301 549 (EU)
Broken <span class="marks">🌾 🌱</span>
The accessibility problem illustrated: No vision:Which ones have wheat in them?
01

The problem

Screen reader users can't tell which bakes contain wheat or milk, or which are vegan, because they hear the names of the pictures instead.

02

Try it

Compare the marks you see with what a screen reader reads.

The panel shows what a screen reader reads, top to bottom. Which bakes contain wheat, and which are vegan?

Broken Can you fix this?

BrokenBare emoji as the allergen marks and around the heading

✨ Fresh today ✨

  • Sourdough loaf 🌾🌱
  • Butter croissant 🌾🥛
  • Peanut cookie 🥜🌱

Key: 🌾 Contains wheat🥛 Contains milk🥜 Contains peanuts🌱 Vegan

Screen reader says:

  1. sparkles Fresh today sparkles, heading
  2. list, 3 items
  3. Sourdough loaf, sheaf of rice, seedling
  4. Butter croissant, sheaf of rice, glass of milk
  5. Peanut cookie, peanuts, seedling
  6. Key: sheaf of rice Contains wheat, glass of milk Contains milk, peanuts Contains peanuts, seedling Vegan

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Name every emoji that carries meaning by what it means here, and hide every emoji that only decorates with aria-hidden="true".

  1. 1Every emoji is named or hidden, never left bare.
  2. 2Name what the mark means on this page, as an aria-label or as words beside a hidden emoji, not what it pictures.
  3. 3Hide decorative emoji with aria-hidden="true", so headings and links are read by their words.
Before Bare emoji as the allergen marks and around the heading
<h2>✨ Fresh today ✨</h2><ul class="bakes">  <li>    Sourdough loaf    <span class="marks">🌾 🌱</span>  </li>  <li>    Butter croissant    <span class="marks">🌾 🥛</span>  </li>  <li>    Peanut cookie    <span class="marks">🥜 🌱</span>  </li></ul><p class="key">  Key:  🌾 Contains wheat  🥛 Contains milk  🥜 Contains peanuts  🌱 Vegan</p>
After

Name each mark by its meaning

<h2>  <span aria-hidden="true">✨</span>  Fresh today  <span aria-hidden="true">✨</span></h2><ul class="bakes">  <li>    Sourdough loaf    <span class="marks">      <span role="img" aria-label="Contains wheat">🌾</span>      <span role="img" aria-label="Vegan">🌱</span>    </span>  </li>  <li>    Butter croissant    <span class="marks">      <span role="img" aria-label="Contains wheat">🌾</span>      <span role="img" aria-label="Contains milk">🥛</span>    </span>  </li>  <li>    Peanut cookie    <span class="marks">      <span role="img" aria-label="Contains peanuts">🥜</span>      <span role="img" aria-label="Vegan">🌱</span>    </span>  </li></ul><p class="key">  Key:  <span aria-hidden="true">🌾</span> Contains wheat  <span aria-hidden="true">🥛</span> Contains milk  <span aria-hidden="true">🥜</span> Contains peanuts  <span aria-hidden="true">🌱</span> Vegan</p>

Fixing this with an AI coding assistant? Get this guide as Markdown, or get every guide in your coding agent.

04

Design ideas

Marks can stay small and still say what they mean.

Three more ways to show the same two marks, and two looks that only seem to say them. Each shows what a screen reader gets in its note.

In the design file

  • Write each mark’s meaning in words beside or under it, not only the picture.
  • Label every emoji in the file as meaning or decoration, so the developer knows which to name and which to hide.
  • Keep one list of the marks with their words, for the menu’s key and for the developer.
  • Set bold and italic with the text styles, never with letters copied from a fancy-text generator.

Passes

  • Emoji tiles with the word under each Each mark is a soft square with the emoji over a short word, like the allergen grids on food apps. The emoji is hidden from screen readers and the word is read, so the picture can stay large.
  • A quiet line of words under the name No emoji at all: “Vegan · Contains wheat” in a smaller brown, #6b5e52 at 6.27:1 on white. It takes no more room than the marks and needs no key.
  • Outlined tags in small capitals Thin outlined tags in tracked capitals, a common look on modern menus. Write the words in ordinary case and let the style set the capitals: some screen readers spell out words typed in capitals letter by letter.

Fails

  • Emoji in coloured circlesWCAG 1.1.1 Pastel circles make the marks look finished, but they hold only the emoji, so a screen reader still says “sheaf of rice, seedling”. Put the word in or beside each circle, or name it by its meaning.
  • A “new” tag in fancy-text lettersWCAG 1.1.1 Bold letters pasted from a fancy-text generator are mathematical symbols that only look like letters: screen readers skip them or spell out their names. Set the tag in bold with the text style instead.
05

Verify the fix

4 checks, no mouse.

Test with: Screen reader

0 of 4 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat whenever the menu's marks or the component that renders them change.

Limits

This is a starting pattern, not a guarantee for every application. Class names, colours and the bakes are placeholders. Screen readers name emoji from different lists, and some versions or settings skip them, so test with the assistive technology your users have. An image icon or SVG used the same way follows the same rule; see SVG icons with no name, or read when they should be silent. Whether an emoji decorates or means something depends on the page around it, and only someone who knows the content can judge that. Test the complete journey with your target assistive technology.

This is a recreated teaching example, not a finding about a named client. The code is a starting pattern: test it in your own product. No completed assistive-technology test is claimed here.

Keep this fixed as your code changes.

Turn guides like this into rules your coding agents and CI follow, then have the result retested with a keyboard and screen readers.

How retests work