<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="pretty-atom-feed.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>Blog posts - jamesjacobs.me</title>
  <subtitle>Blog posts on web accessibility by James Jacobs</subtitle>
  <link href="https://www.jamesjacobs.me/feed/feed.xml" rel="self" />
  <link href="https://www.jamesjacobs.me/" />
  <updated>2026-03-28T00:00:00Z</updated>
  <id>https://www.jamesjacobs.me/</id>
  <author>
    <name>James Jacobs</name>
  </author>
  <entry>
    <title>Setting up Windows Screen Readers on a Mac</title>
    <link href="https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/" />
    <updated>2026-03-28T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/</id>
    <content type="html">&lt;p&gt;I recently picked up a Mac mini for personal projects and went through the usual process of setting up my development and testing tools. Like most accessibility specialists, I regularly work with multiple screen readers. Macs come with VoiceOver built in, but getting JAWS and NVDA running on a Mac takes a few extra steps.&lt;/p&gt;
&lt;h2 id=&quot;why-test-in-multiple-screen-readers&quot;&gt;Why test in multiple screen readers&lt;/h2&gt;
&lt;p&gt;When testing, experimenting, and building UI components for the web, I test in JAWS, NVDA, macOS VoiceOver and iOS VoiceOver, unless it&#39;s something tried and tested, in which case I&#39;ll give it a quick pass with VoiceOver.&lt;/p&gt;
&lt;p&gt;The latest WebAIM survey shows the top 3 most commonly used screen readers are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nvaccess.org&quot;&gt;NVDA&lt;/a&gt; (NonVisual Desktop Access). Windows-only. Free&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vispero.com/jaws-screen-reader-software/&quot;&gt;JAWS&lt;/a&gt; (Job Access With Speech). Windows-only. Paid&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-gb/guide/voiceover/welcome/mac&quot;&gt;VoiceOver&lt;/a&gt;. Included with macOS and iOS.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While the basic experience is similar, each screen reader announces things slightly differently, has different browser and ARIA support, and like any software, can have bugs and quirks. Testing in multiple screen readers helps build up a more complete picture of the screen reader experience. Sometimes, with more complex UI components, you can encounter issues specific to a certain screen reader.&lt;/p&gt;
&lt;h2 id=&quot;setting-up-a-windows-virtual-machine&quot;&gt;Setting up a Windows Virtual Machine&lt;/h2&gt;
&lt;p&gt;Since neither JAWS nor NVDA supports macOS, we need to set up a Windows virtual machine. In the past, I&#39;ve used VirtualBox, but since moving to an Apple Silicon Mac, I&#39;ve found that &lt;a href=&quot;https://mac.getutm.app/&quot;&gt;UTM&lt;/a&gt; performs better and has been easier to work with. I had performance issues running Windows in VirtualBox, which meant the audio would cut out, not great when you’re relying on speech output.&lt;/p&gt;
&lt;h3 id=&quot;download-windows-11&quot;&gt;Download Windows 11&lt;/h3&gt;
&lt;p&gt;First, we need to grab Windows 11. I prefer to use &lt;a href=&quot;https://apps.apple.com/us/app/crystalfetch-iso-downloader/id6454431289&quot;&gt;CrystalFetch (opens App Store)&lt;/a&gt;, a free macOS app that makes legally downloading the latest Windows builds really easy.&lt;/p&gt;
&lt;p&gt;Open CrystalFetch and:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select Windows 11.&lt;/li&gt;
&lt;li&gt;Select latest under build.&lt;/li&gt;
&lt;li&gt;Click Download.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/UdcLqcvc6J-1012.avif 1012w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/UdcLqcvc6J-1012.webp 1012w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/UdcLqcvc6J-1012.png&quot; alt=&quot;Screenshot of Crystal Fetch UI showing Windows 11 download &quot; width=&quot;1012&quot; height=&quot;562&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Alternatively, you can download directly from Microsoft.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/software-download/windows11&quot;&gt;Download Windows 11 for Intel Macs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/software-download/windows11arm64&quot;&gt;Download Windows 11 for Apple Silicon Macs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;buy-a-windows-11-licence-key&quot;&gt;Buy a Windows 11 licence key&lt;/h3&gt;
&lt;p&gt;I bought a licence key from &lt;a href=&quot;https://www.productcodes.co.uk/product/windows-11-professional-retail/&quot;&gt;Product Codes&lt;/a&gt;. At the time of writing, a Windows 11 Pro licence key was £9.90.&lt;/p&gt;
&lt;h3 id=&quot;set-up-utm-and-install-windows&quot;&gt;Set up UTM and install Windows&lt;/h3&gt;
&lt;p&gt;Download and install &lt;a href=&quot;https://mac.getutm.app/&quot;&gt;UTM&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/nN-tZMx6ZG-968.avif 968w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/nN-tZMx6ZG-968.webp 968w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/nN-tZMx6ZG-968.png&quot; alt=&quot;Screenshot of UTM UI&quot; width=&quot;968&quot; height=&quot;720&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once installed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click &amp;quot;+ Create a New Virtual Machine&amp;quot;.&lt;/li&gt;
&lt;li&gt;Click Virtualize.&lt;/li&gt;
&lt;li&gt;Click Windows.&lt;/li&gt;
&lt;li&gt;Select the memory and CPU cores you&#39;d like to use. I used the minimum spec for Windows 11 Pro - 4GB of memory and 2 CPU cores.&lt;/li&gt;
&lt;li&gt;Select the ISO we downloaded with Crystal Fetch, then tick &amp;quot;Install Windows 10 or higher&amp;quot; and &amp;quot;Install drivers and SPICE tools&amp;quot; checkboxes.&lt;/li&gt;
&lt;li&gt;Enter the size of the virtual hard drive for the VM. I went with the minimum required 64GB.&lt;/li&gt;
&lt;li&gt;Click save and let UTM finish setting up the VM.&lt;/li&gt;
&lt;li&gt;When the VM launches, press any key to start the Windows installer when you see the &amp;quot;press any key to boot from disk&amp;quot;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should then be taken through the Windows installer, where you can enter the product key you bought earlier.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/L8Wk3u2oI3-912.avif 912w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/L8Wk3u2oI3-912.webp 912w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/L8Wk3u2oI3-912.png&quot; alt=&quot;Screenshot of windows installer showing the enter product key page&quot; width=&quot;912&quot; height=&quot;752&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once Windows has finished installing, updating and restarting, we can start downloading our browsers and screen readers.&lt;/p&gt;
&lt;p&gt;If you hit any issues, check out the &lt;a href=&quot;https://docs.getutm.app/guides/windows/&quot;&gt;Windows set up guide&lt;/a&gt; on the UTM site.&lt;/p&gt;
&lt;h2 id=&quot;install-nvda&quot;&gt;Install NVDA&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nvaccess.org/download/&quot;&gt;Download NVDA&lt;/a&gt; within the newly created VM. Although it&#39;s free, I&#39;d recommend making a donation to support the software and future development.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/rMsPOrXRV_-1529.avif 1529w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/rMsPOrXRV_-1529.webp 1529w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/rMsPOrXRV_-1529.png&quot; alt=&quot;Screenshot of the NVDA website&#39;s download page&quot; width=&quot;1529&quot; height=&quot;1124&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Once installed, there are two settings worth enabling.&lt;/p&gt;
&lt;h3 id=&quot;visual-highlight&quot;&gt;Visual Highlight&lt;/h3&gt;
&lt;p&gt;This makes it easy to see the element NVDA is currently focused on and announcing as you navigate through the page. It’s slightly different from standard focus indicators provided by the site/browser, as it will also be shown on any non-interactive element, such as text that’s being read out.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start NVDA.&lt;/li&gt;
&lt;li&gt;Right-click the NVDA icon in the system tray.&lt;/li&gt;
&lt;li&gt;Click Preferences, then Settings.&lt;/li&gt;
&lt;li&gt;Within the Settings dialog, click Vision.&lt;/li&gt;
&lt;li&gt;Click Enable Highlighting, under Visual Highlight.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/_kRm7nAzgY-1138.avif 1138w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/_kRm7nAzgY-1138.webp 1138w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/_kRm7nAzgY-1138.png&quot; alt=&quot;Screenshot of vision settings dialog showing the visual highlight setting ticked&quot; width=&quot;1138&quot; height=&quot;1005&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;speech-viewer&quot;&gt;Speech Viewer&lt;/h3&gt;
&lt;p&gt;Speech viewer displays a text log of the NVDA spoken output. It&#39;s useful, but bear in mind that &lt;a href=&quot;https://adrianroselli.com/2020/08/speech-viewer-logs-of-lies.html&quot;&gt;the speech viewer doesn&#39;t always match exactly what NVDA has spoken&lt;/a&gt;, so it shouldn&#39;t be used as a replacement for listening to the spoken output.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start NVDA.&lt;/li&gt;
&lt;li&gt;Right-click the NVDA icon in the system tray.&lt;/li&gt;
&lt;li&gt;Click Tools, then Speech Viewer.&lt;/li&gt;
&lt;li&gt;The Speech Viewer will then open.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/94mY0zILUz-1138.avif 1138w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/94mY0zILUz-1138.webp 1138w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/94mY0zILUz-1138.png&quot; alt=&quot;Screenshot of the NVDA speech viewer&quot; width=&quot;1138&quot; height=&quot;1005&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;install-jaws&quot;&gt;Install JAWS&lt;/h2&gt;
&lt;p&gt;Download &lt;a href=&quot;https://vispero.com/jaws-screen-reader-software/&quot;&gt;JAWS&lt;/a&gt; within the VM.&lt;/p&gt;
&lt;p&gt;JAWS is a paid product, with prices ranging from the hundreds to the thousands, depending on the licence. It does, however, offer a 40 minute demo mode for evaluation. Keep in mind that the End User License Agreement prohibits using the 40-minute demo mode for accessibility testing.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/coF8LAwIcA-1138.avif 1138w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/coF8LAwIcA-1138.webp 1138w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/coF8LAwIcA-1138.png&quot; alt=&quot;Screenshot of the JAWS installer&quot; width=&quot;1138&quot; height=&quot;1005&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Like NVDA, JAWS also contains a couple of useful features worth knowing about.&lt;/p&gt;
&lt;h3 id=&quot;speech-history&quot;&gt;Speech History&lt;/h3&gt;
&lt;p&gt;Similar to NVDA Speech Viewer, JAWS contains a Speech History feature that shows the last 500 lines of speech. You can open the Speech History dialog by pressing &lt;kbd&gt;Insert&lt;/kbd&gt; + &lt;kbd&gt;Spacebar&lt;/kbd&gt; + &lt;kbd&gt;H&lt;/kbd&gt;.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/CH9n9tgBnU-1144.avif 1144w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/CH9n9tgBnU-1144.webp 1144w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/CH9n9tgBnU-1144.png&quot; alt=&quot;Screenshot of the JAWS speech viewer showing lines of previous speech output&quot; width=&quot;1144&quot; height=&quot;1008&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;highlight-virtual-pc-cursor&quot;&gt;Highlight Virtual PC Cursor&lt;/h3&gt;
&lt;p&gt;JAWS also contains a visual highlight for tracking the position of the JAWS cursor. In JAWS 2026 it&#39;s enabled by default. You can find the setting and related options for changing the appearance of the highlight by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;From the JAWS dialog, click Utilities, then Settings Center.&lt;/li&gt;
&lt;li&gt;In the settings center, in the left-hand tree view, click Visual Tracking.&lt;/li&gt;
&lt;li&gt;Enable &amp;quot;Highlight Virtual PC Cursor&amp;quot;. You can modify the appearance of the highlight here too.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/iGMKCmsDuz-1144.avif 1144w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/iGMKCmsDuz-1144.webp 1144w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/iGMKCmsDuz-1144.png&quot; alt=&quot;Screenshot of the JAWS showing the visual highlight&quot; width=&quot;1144&quot; height=&quot;1008&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;configure-the-keyboard&quot;&gt;Configure the keyboard&lt;/h2&gt;
&lt;p&gt;By default, both JAWS and NVDA use the &lt;kbd&gt;Insert&lt;/kbd&gt; key for certain commands, which isn&#39;t present on Apple keyboards. There&#39;s a couple of options to work around this.&lt;/p&gt;
&lt;h3 id=&quot;option-1-external-pc-keyboard&quot;&gt;Option 1: external PC keyboard&lt;/h3&gt;
&lt;p&gt;The easiest option is to plug in a full sized PC keyboard, though if you&#39;re working from a laptop and move around a lot, it&#39;s not ideal.&lt;/p&gt;
&lt;h3 id=&quot;option-2-remap-insert-key&quot;&gt;Option 2: remap insert key&lt;/h3&gt;
&lt;p&gt;There are a number of apps that let you remap keys. Not all will work with UTM due to how it receives keyboard input from the host machine. Mac apps like Karabiner-Elements, though often recommended, will not work with UTM. After trying tools like PowerToys and AutoHotKey, I found &lt;a href=&quot;https://apps.microsoft.com/detail/xpffcg7m673d4f&quot;&gt;SharpKeys&lt;/a&gt;, which is free and straightforward to set up.&lt;/p&gt;
&lt;p&gt;Within the VM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and open &lt;a href=&quot;https://apps.microsoft.com/detail/xpffcg7m673d4f&quot;&gt;SharpKeys&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click Add, then under &amp;quot;Map this key&amp;quot;, select the key you want to trigger &lt;kbd&gt;Insert&lt;/kbd&gt; (make sure you pick a rarely used key).&lt;/li&gt;
&lt;li&gt;Then, under &amp;quot;To this key&amp;quot;, select Insert and map it to the &lt;kbd&gt;Insert&lt;/kbd&gt; key.&lt;/li&gt;
&lt;li&gt;Click Write to Registry.&lt;/li&gt;
&lt;li&gt;Restart the VM.&lt;/li&gt;
&lt;li&gt;You can now use your chosen key as &lt;kbd&gt;Insert&lt;/kbd&gt; .&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/0pu2vIhG5m-1144.avif 1144w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/0pu2vIhG5m-1144.webp 1144w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/0pu2vIhG5m-1144.png&quot; alt=&quot;Screenshot of SharpKeys showing a remapped insert key&quot; width=&quot;1144&quot; height=&quot;1008&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;section class=&quot;callout&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;avoid-using-caps-lock&quot;&gt;Avoid using Caps Lock&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;Both JAWS and NVDA have the option to use &lt;kbd&gt;Caps Lock&lt;/kbd&gt; as a modifier key in addition to &lt;kbd&gt;Insert&lt;/kbd&gt;. I&#39;d avoid that, as caps lock behaves slightly differently on Apple keyboards and may not pass through to the VM as expected.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id=&quot;selecting-the-keyboard-layout&quot;&gt;Selecting the keyboard layout&lt;/h3&gt;
&lt;p&gt;Both JAWS and NVDA use slightly different keyboard commands depending on whether you&#39;re using a desktop or laptop keyboard. Make sure you have the appropriate keyboard layout selected. For most Apple keyboards you want to use Laptop.&lt;/p&gt;
&lt;h4 id=&quot;jaws-keyboard-layout&quot;&gt;JAWS keyboard layout&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Start JAWS.&lt;/li&gt;
&lt;li&gt;Click Options, Basics.&lt;/li&gt;
&lt;li&gt;Under Use Keyboard Layout, select Laptop.&lt;/li&gt;
&lt;li&gt;Click OK to save.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/ZL-0cX2nNx-1138.avif 1138w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/ZL-0cX2nNx-1138.webp 1138w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/ZL-0cX2nNx-1138.png&quot; alt=&quot;Screenshot showing JAWS keyboard layout set to laptop&quot; width=&quot;1138&quot; height=&quot;1005&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;nvda-keyboard-layout&quot;&gt;NVDA keyboard layout&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Start NVDA.&lt;/li&gt;
&lt;li&gt;Right-click the NVDA icon in the system tray.&lt;/li&gt;
&lt;li&gt;Click Preferences, then Settings.&lt;/li&gt;
&lt;li&gt;Under keyboard, change Keyboard layout to Laptop.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/wmPDc4IvGc-1144.avif 1144w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/wmPDc4IvGc-1144.webp 1144w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/wmPDc4IvGc-1144.png&quot; alt=&quot;Screenshot showing NVDA keyboard layout set to laptop&quot; width=&quot;1144&quot; height=&quot;1008&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;using-function-f-keys&quot;&gt;Using Function (F) keys&lt;/h3&gt;
&lt;p&gt;Certain NVDA and JAWS commands require the use of a function key. Because Apple keyboards use function keys for things like screen brightness, you&#39;ll need to press &lt;kbd&gt;fn&lt;/kbd&gt; + the relevant function key to trigger the command in the VM.&lt;/p&gt;
&lt;p&gt;So for NVDA commands like &lt;kbd&gt;Insert&lt;/kbd&gt; + &lt;kbd&gt;F7&lt;/kbd&gt;, you&#39;ll need to press &lt;kbd&gt;Insert&lt;/kbd&gt; + &lt;kbd&gt;fn&lt;/kbd&gt; + &lt;kbd&gt;F7&lt;/kbd&gt; on your Apple keyboard.&lt;/p&gt;
&lt;p&gt;Alternatively, you can set F keys to function as standard function keys in macOS settings, which will pass through to your VM&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/wyRkjuuguZ-835.avif 835w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/wyRkjuuguZ-835.webp 835w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/setting-up-windows-screen-readers-on-a-mac/wyRkjuuguZ-835.png&quot; alt=&quot;Screenshot the macOS function key settings with use F keys as standard function keys enabled&quot; width=&quot;835&quot; height=&quot;737&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;browser-and-screen-reader-combinations&quot;&gt;Browser and screen reader combinations&lt;/h2&gt;
&lt;p&gt;Screen readers work better when paired with a supported browser. While screen reader support for different browsers has improved over the past few years, I&#39;d recommend the following pairings when testing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JAWS + Chrome or Edge.&lt;/li&gt;
&lt;li&gt;NVDA + Chrome or Firefox.&lt;/li&gt;
&lt;li&gt;VoiceOver + Safari.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These also match the most common screen reader browser pairings from the latest &lt;a href=&quot;https://webaim.org/projects/screenreadersurvey10/#browsercombos&quot;&gt;WebAIM Screen Reader Survey&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;set-up-complete&quot;&gt;Set up complete&lt;/h2&gt;
&lt;p&gt;Once everything is set up, switching between macOS VoiceOver and Windows screen readers is just a case of firing up your new VM. You can now cover most real-world combinations without leaving your Mac.&lt;/p&gt;
&lt;h2 id=&quot;useful-links&quot;&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jamesjacobs.me/guides/testing/how-to-test-with-a-screen-reader/&quot;&gt;How to test with a screen reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dequeuniversity.com/screenreaders/jaws-keyboard-shortcuts&quot;&gt;Deque JAWS keyboard shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dequeuniversity.com/screenreaders/nvda-keyboard-shortcuts&quot;&gt;Deque NVDA keyboard shortcuts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/projects/screenreadersurvey10/#browsercombos&quot;&gt;WebAIM Screen Reader User Survey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Deep dive: crafting accessible links</title>
    <link href="https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/" />
    <updated>2026-03-17T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/</id>
    <content type="html">&lt;p&gt;The humble link. A small but mighty, fundamental piece of HTML that&#39;s arguably the backbone of the entire web. Links are everywhere, and we use them thousands of times a day, but what goes into making a link truly accessible? In this post, I&#39;m going to deep drive into link accessibility, covering the basics, things to avoid, and some common problematic patterns.&lt;/p&gt;
&lt;p&gt;So grab a drink, some snacks, and strap in.&lt;/p&gt;
&lt;h2 id=&quot;foundations&quot;&gt;Foundations&lt;/h2&gt;
&lt;section class=&quot;callout&quot;&gt;
	&lt;h3 class=&quot;callout__heading&quot; id=&quot;accessible-names-and-roles&quot;&gt;Accessible names and roles&lt;/h3&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;You’ll see the terms &amp;quot;accessible role&amp;quot; and &amp;quot;accessible name&amp;quot; used throughout this post. They describe what assistive technology, such as screen readers, exposes to users.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;role&lt;/strong&gt; tells assistive tech what something is and how it behaves. Native HTML elements come with built-in roles. For example, an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; with a &lt;code&gt;href&lt;/code&gt; has the role of “link”. Generic container elements like &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; carry no semantic meaning.&lt;/li&gt;
&lt;li&gt;Roles can be explicitly set with the &lt;code&gt;role&lt;/code&gt; attribute. This is generally only necessary when not using native HTML or in rare cases where the default needs to be changed.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;accessible name&lt;/strong&gt; is the label announced alongside the role. For links, this is usually the text inside the &lt;code&gt;&amp;lt;a&amp;gt;&amp;lt;/a&amp;gt;&lt;/code&gt; tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to dig deeper, see the MDN pages on &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles&quot;&gt;WAI-ARIA roles&lt;/a&gt; and &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Accessible_name&quot;&gt;accessible names&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id=&quot;use-semantic-markup&quot;&gt;Use semantic markup&lt;/h3&gt;
&lt;p&gt;Let&#39;s start with the basics: when is a link actually a link?&lt;/p&gt;
&lt;p&gt;If an anchor tag &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; has a &lt;code&gt;href&lt;/code&gt;, it&#39;s a hyperlink:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.jamesjacobs.me&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;James Jacobs&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Native elements have semantic meaning and behaviour built in. Taking the example above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&#39;s keyboard accessible. You can &lt;kbd&gt;Tab&lt;/kbd&gt; to it and activate with &lt;kbd&gt;Enter&lt;/kbd&gt;.&lt;/li&gt;
&lt;li&gt;It looks like a link (blue with an underline) in all common browsers.&lt;/li&gt;
&lt;li&gt;It&#39;s announced as a link by screen readers.&lt;/li&gt;
&lt;li&gt;It navigates somewhere when activated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A link is not just something that looks clickable. It’s a specific element with built-in meaning and behaviour. However, not all links are created (or coded) equally...&lt;/p&gt;
&lt;p&gt;If you are involved with accessibility testing, you’ve probably seen something like this:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;some-id-for-js&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Link text&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Can you spot the difference? There&#39;s no &lt;code&gt;href&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes, developers omit the &lt;code&gt;href&lt;/code&gt; attribute and use JavaScript to handle navigation. The problem is that, according to the &lt;a href=&quot;https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element&quot;&gt;HTML living standard&lt;/a&gt;, an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element without an &lt;code&gt;href&lt;/code&gt; is just a placeholder for where a link might have been placed.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the a element has no href attribute, then the element represents a placeholder for where a link might otherwise have been placed, if it had been relevant, consisting of just the element&#39;s contents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Without a &lt;code&gt;href&lt;/code&gt;, an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; element does not have the role &amp;quot;link&amp;quot;. It falls back to role &amp;quot;generic&amp;quot;. It won’t be announced as a link by screen readers and won’t appear in lists of links. Semantically, it’s not much different from a &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Another common inaccessible pattern is along the lines of:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;div&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;tabindex&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Link text&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;div&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In both cases, the developer has to recreate the behaviour and semantics that a native link would have provided, by adding:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript to handle navigation and activation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tabindex=&amp;quot;0&amp;quot;&lt;/code&gt; to make it keyboard focusable, as a &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, or a &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; without a &lt;code&gt;href&lt;/code&gt;, can&#39;t be tabbed to via the keyboard.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;role=&amp;quot;link&amp;quot;&lt;/code&gt; so assistive technology recognises it as a link.&lt;/li&gt;
&lt;li&gt;Custom styling to make it look like a link.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are other shortcomings, too. For example, the CSS &lt;code&gt;:link&lt;/code&gt; pseudo-class won&#39;t apply styles to &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; tags without a &lt;code&gt;href&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Semantic HTML provides a lot of out of the box functionaility, so use it wherever possible.&lt;/p&gt;
&lt;h3 id=&quot;links-vs-buttons&quot;&gt;Links vs buttons&lt;/h3&gt;
&lt;p&gt;All too often, links and buttons are used interchangeably. This creates a number of issues. Simply put: links go places and buttons do things.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it navigates somewhere, on the page or to a different page, use a &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; with the relevant &lt;code&gt;href&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it triggers an action, such as opening a menu, revealing content, submitting a form, or opening a modal, use a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Why is this important? Native HTML elements have semantic meaning and set expectations on how they will behave when encountered and interacted with. When someone activates a link, they expect navigation. When they activate a button, they expect an action.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Screen reader users hearing a link announced will expect to go somewhere if they activate it.&lt;/li&gt;
&lt;li&gt;Screen readers can list elements of a certain type on the page, including links - so users expect things that behave like a link to be listed there.&lt;/li&gt;
&lt;li&gt;Keyboard users expect to be able to tab to interactive elements, like links and buttons, and activate a link with &lt;kbd&gt;Enter&lt;/kbd&gt; and a button with &lt;kbd&gt;Space&lt;/kbd&gt; or &lt;kbd&gt;Enter&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the wrong element is used, those expectations may not be met. For example, when developers do things like:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;#&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;id-for-javascript&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;View Details&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That element is programmatically presented as a button (imagine it&#39;s visually presented as one too). A screen reader will announce it as a button, due to the role. A user might reasonably press &lt;kbd&gt;Space&lt;/kbd&gt; to activate it. But unless additional JavaScript has been added to handle the &lt;kbd&gt;Space&lt;/kbd&gt; key, nothing happens. The element looks like a button, sounds like a button, but does not behave like one - that&#39;s confusing.&lt;/p&gt;
&lt;p&gt;Use the right element for the job. Native elements already include the correct semantics, keyboard behaviour, and assistive technology support.&lt;/p&gt;
&lt;h2 id=&quot;writing-accessible-link-text&quot;&gt;Writing accessible link text&lt;/h2&gt;
&lt;h3 id=&quot;make-the-destination-clear&quot;&gt;Make the destination clear&lt;/h3&gt;
&lt;p&gt;Link text should make it clear where the link leads.&lt;/p&gt;
&lt;p&gt;Links are not always read in context. Screen reader users can pull up a list of links on a page and move through them one by one. Being presented with a list of &amp;quot;click here&amp;quot; or &amp;quot;read more&amp;quot; provides no useful information to go on.&lt;/p&gt;
&lt;p&gt;When reviewing or writing links, try reading them on their own. If the surrounding paragraph disappeared, would the destination still be obvious?&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-use-ambiguous-link-text&quot;&gt;Don&#39;t: use ambiguous link text&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://www.jamesjacobs.me/guides/testing/how-to-test-with-a-screen-reader/&quot;&gt;Click here&lt;/a&gt; to learn how to test with screen readers.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-make-it-clear-where-the-link-leads&quot;&gt;Do: make it clear where the link leads&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;Learn more about &lt;a href=&quot;https://www.jamesjacobs.me/guides/testing/how-to-test-with-a-screen-reader/&quot;&gt;how to test with screen readers&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;p&gt;A recommended approach is to use the target page&#39;s &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; text as the link text, assuming the title is descriptive. In the example above, the target page has a page &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; that starts with &amp;quot;How to test with a screen reader&amp;quot;, therefore, the same is used for the link text.&lt;/p&gt;
&lt;p&gt;While WCAG &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html&quot;&gt;2.4.4 Link Purpose (In Context) (Level A)&lt;/a&gt; allows for link context to be provided by text in the same paragraph, list item, table cell or header, this doesn&#39;t help screen reader users navigating from link to link or when reviewing a list of links out of context.&lt;/p&gt;
&lt;h3 id=&quot;keep-link-text-concise&quot;&gt;Keep link text concise&lt;/h3&gt;
&lt;p&gt;Avoid linking whole sentences or large blocks of text. Long links can be difficult and time-consuming to listen to in a screen reader and potentially awkward to activate with speech recognition software.&lt;/p&gt;
&lt;p&gt;Instead, link just enough words to make the destination clear.&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-link-unnecessary-words&quot;&gt;Don&#39;t: link unnecessary words&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/training-videos&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    You can find out more about accessibility 
    by watching our free accessibility training videos
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-link-enough-to-preserve-meaning&quot;&gt;Do: link enough to preserve meaning&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  You can find out more about accessibility 
  by watching our 
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/training-videos&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
    free accessibility training videos
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id=&quot;use-consistent-wording&quot;&gt;Use consistent wording&lt;/h3&gt;
&lt;p&gt;If multiple links point to the same page, use the same link text.&lt;/p&gt;
&lt;p&gt;WCAG &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/consistent-identification&quot;&gt;3.2.4 Consistent Identification (Level AA)&lt;/a&gt;, requires components that have the same function, within a set of pages, to be identified consistently. It&#39;s a good idea to use the same link text for the same destination, even on links in a single page.&lt;/p&gt;
&lt;p&gt;Consistency reduces cognitive load. It helps people build a mental model of your interface and move through it with confidence.&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-use-different-link-text-for-the-same-destination&quot;&gt;Don&#39;t: use different link text for the same destination&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Page 1 --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Contact us&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Page 2 --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Get in touch&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-be-consistent-with-link-text&quot;&gt;Do: be consistent with link text&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Page 1 --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Contact us&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- Page 2 --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/contact&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Contact us&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id=&quot;include-the-file-type-and-size-in-the-link-text&quot;&gt;Include the file type and size in the link text&lt;/h3&gt;
&lt;p&gt;When linking to non-HTML documents, let the user know the type and the size of file they are opening.&lt;/p&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-inform-the-user-of-the-file-type-and-size&quot;&gt;Do: inform the user of the file type and size&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;sales-figures-jan-2026.pdf&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  Sales figures Jan 2026 (PDF, 2MB)
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id=&quot;avoid-using-raw-urls-as-link-text&quot;&gt;Avoid using raw URLs as link text&lt;/h3&gt;
&lt;p&gt;Linked URLs are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hard to read at a glance&lt;/strong&gt;: long strings of slashes, numbers, and tracking parameters are difficult to read, scan and understand&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unclear and sometimes suspicious&lt;/strong&gt;: A shortened link gives no indication of where it leads. For example, where does &lt;a href=&quot;https://tinyurl.com/yetpupyz&quot;&gt;https://tinyurl.com/yetpupyz&lt;/a&gt; actually go?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Difficult to follow with screen readers&lt;/strong&gt;: which read them character by character, e.g., &amp;quot;H T T P S colon slash slash W W W dot james jacobs dot me slash guides slash how dash to dash test dash with dash a dash screen dash reader&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-link-raw-urls&quot;&gt;Don&#39;t: link RAW URLs&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://tinyurl.com/yetpupyz&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  https://tinyurl.com/yetpupyz
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-use-clear-descriptive-link-text&quot;&gt;Do: use clear descriptive link text &lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://tinyurl.com/yetpupyz&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  How to test with screen readers
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;p&gt;Though linked URLs are not necessarily a WCAG failure under &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html&quot;&gt;2.4.4 Link Purpose (In Context)(Level A)&lt;/a&gt; or &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html&quot;&gt;2.4.9 Link Purpose (Link Only)(Level AAA)&lt;/a&gt;, if they are human-readable, it&#39;s rarely the clearest option.&lt;/p&gt;
&lt;p&gt;Clear, descriptive link text reassures people about where the link leads and why it is there.&lt;/p&gt;
&lt;h2 id=&quot;non-text-links&quot;&gt;Non-text links&lt;/h2&gt;
&lt;p&gt;When icons, images, and other non-textual elements are linked, there are extra considerations to ensure the link remains accessible.&lt;/p&gt;
&lt;h3 id=&quot;icon-links-with-visible-text&quot;&gt;Icon links with visible text&lt;/h3&gt;
&lt;p&gt;Icons included within a link, in addition to visible link text, are typically decorative. In these cases, the icon should be hidden from assistive technology to avoid unnecessary noise. How the icon is added will determine how best to hide it.&lt;/p&gt;
&lt;p&gt;Inline images using &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; can use an empty &lt;code&gt;alt&lt;/code&gt; attribute to tell assistive technology to ignore the image:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;facebook-icon.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt; 
  Facebook
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Many icon font libraries, like Font-Awesome, use CSS pseudo-elements to display the icon. Typically, these are ignored by assistive technology, but to be safe, you can add &lt;code&gt;aria-hidden=&amp;quot;true&amp;quot;&lt;/code&gt; to the element providing the icon. This prevents some screen readers, like VoiceOver, from displaying the icon as a question mark in a rectangle (⍰), which could be confusing to sighted screen reader users.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fa-brands fa-facebook&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  Facebook
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the example above, the visible text provides the accessible name. The icon is purely decorative.&lt;/p&gt;
&lt;h3 id=&quot;icon-links-without-visible-text&quot;&gt;Icon links without visible text&lt;/h3&gt;
&lt;p&gt;Sometimes an icon is the only visible content inside a link. Social media links in footers are a common example. These links can be harder for speech recognition software users to activate, as it&#39;s not obvious what they should &lt;em&gt;say&lt;/em&gt; to activate the link. Typically, someone using speech recognition software will say &amp;quot;click&amp;quot;, followed by the visible text label. In the case of icon only links, there is no visible text label, so they have to use additional steps to activate the link. For this reason, it&#39;s worth avoiding icon-only links.&lt;/p&gt;
&lt;p&gt;If they are used, you must provide an accessible name for the icon link.&lt;/p&gt;
&lt;p&gt;One approach is to include visually hidden text inside the link:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;fa-brands fa-facebook&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-hidden&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;span&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;visually-hidden&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Facebook&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;span&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The hidden text becomes the link’s accessible name and what&#39;s announced by screen readers.&lt;/p&gt;
&lt;p&gt;Make sure the text is hidden visually but not from assistive technology. Do not use &lt;code&gt;display: none&lt;/code&gt; or &lt;code&gt;visibility: hidden&lt;/code&gt;, as these hide content from assistive technology.&lt;/p&gt;
&lt;p&gt;The common visually hidden pattern uses the &amp;quot;clip method&amp;quot; and typically looks like:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.visually-hidden&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;clip&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rect&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;0 0 0 0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;clip-path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;inset&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;50%&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; absolute&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;white-space&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nowrap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 1px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The Vispero team did a great job of breaking this down in their post &lt;a href=&quot;https://vispero.com/resources/the-anatomy-of-visually-hidden/&quot;&gt;the anatony of visually-hidden&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Avoid using &lt;code&gt;aria-label&lt;/code&gt; on the link, as Adrian Roselli notes - there are &lt;a href=&quot;https://adrianroselli.com/2019/11/aria-label-does-not-translate.html&quot;&gt;concerns around aria labels and translations&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;linked-images&quot;&gt;Linked images&lt;/h3&gt;
&lt;p&gt;When an image is the only content inside a link, its &lt;code&gt;alt&lt;/code&gt; text becomes the link’s accessible name and must be provided. It does the job that visible link text would normally do. Because of that, don’t describe what the image looks like. Use the &lt;code&gt;alt&lt;/code&gt; text to describe the link’s destination or purpose.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;alt&lt;/code&gt; text is also shown if the image fails to load, so it needs to make sense as visible link text. For example:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/NDxBNKsAny-278.avif 278w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/NDxBNKsAny-278.webp 278w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/NDxBNKsAny-278.png&quot; alt=&quot;screenshot of a linked image where the image has failed to load but the alt text &amp;quot;apply for a passport&amp;quot; is shown.&quot; width=&quot;278&quot; height=&quot;94&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;The same principles apply as with any other link. Write a clear, specific label that explains the destination of the link.&lt;/p&gt;
&lt;p&gt;If a linked image has no &lt;code&gt;alt&lt;/code&gt; text, the screen reader experience is poor. Some screen readers will just announce &amp;quot;link&amp;quot;.  Others may attempt to read the file name or URL. Neither is helpful.&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-describe-the-image-in-the-alt-text&quot;&gt;Don&#39;t: describe the image in the alt text&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;passport.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;A blue british passport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example screen reader output: &amp;quot;link, image, a blue British passport&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-use-alt-text-to-label-the-link&quot;&gt;Do: use alt text to label the link&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;...&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;passport.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Apply for a passport&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example screen reader output: &amp;quot;link, image, apply for a passport&amp;quot;.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;h2 id=&quot;link-behaviour&quot;&gt;Link behaviour&lt;/h2&gt;
&lt;h3 id=&quot;avoid-opening-links-in-new-tabs-warn-users-if-you-do&quot;&gt;Avoid opening links in new tabs (warn users if you do)&lt;/h3&gt;
&lt;p&gt;Opening a link in a new tab can be disorientating for some users as it changes browsing context without warning. In most cases, leave the control with the user and let them decide whether to open the link in a new tab.&lt;/p&gt;
&lt;p&gt;There are some situations where it may add value, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The link opens context-sensitive help that supports the current task.&lt;/li&gt;
&lt;li&gt;The user is working in a secure or form-based flow, and navigating away would risk losing data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If there is a clear reason to open a new tab, warn the user in the link text.&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-open-links-in-new-tabs-unnecessarily&quot;&gt;Don&#39;t: open links in new tabs unnecessarily&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.facebook.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  Follow us on Facebook
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-warn-users-when-a-link-needs-to-open-in-a-new-tab&quot;&gt;Do: warn users when a link needs to open in a new tab&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.somewebpage.com/help&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;_blank&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  View detailed instructions (opens in new tab)
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/section&gt;
&lt;p&gt;If you have a group of links that all open in new tabs, you can reduce repetition by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding a short note before the group, such as “The following links open in a new tab”, and&lt;/li&gt;
&lt;li&gt;Including visually hidden warning text inside each link for screen reader users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WCAG techniques &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/general/G200&quot;&gt;G200: Opening new windows and tabs from a link only when necessary&lt;/a&gt; and &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/general/G201&quot;&gt;G201: Giving users advanced warning when opening a new window&lt;/a&gt; cover this pattern: only open new windows when necessary, and provide advance warning.&lt;/p&gt;
&lt;p&gt;It’s also worth remembering that &lt;code&gt;target=&amp;quot;_blank&amp;quot;&lt;/code&gt; has &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#security_and_privacy&quot;&gt;security and privacy implications&lt;/a&gt;. If you use it, make sure it’s implemented safely.&lt;/p&gt;
&lt;h3 id=&quot;disabling-links&quot;&gt;Disabling links&lt;/h3&gt;
&lt;p&gt;In almost all cases, it&#39;s best to avoid disabling links.&lt;/p&gt;
&lt;p&gt;It&#39;s an unusual, rarely seen pattern. HTML does not support the &lt;code&gt;disabled&lt;/code&gt; attribute on &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;. Users expect links to be interactive. Disabling a link will likely lead to confusion. In cases where you think there is a need to disable a link, it&#39;s arguably better to remove the link completely or display it as plain text.&lt;/p&gt;
&lt;p&gt;If, for some reason, you must disable a link (ignoring that it&#39;s probably a bad idea), then you need to make sure the disabled state is visually conveyed to the user and programatically conveyed to assistive technologies. Depending on the use case, it may be beneficial to explain why the link is disabled.&lt;/p&gt;
&lt;p&gt;Remember at the start of this post, I mentioned that a link without a &lt;code&gt;href&lt;/code&gt; is a placeholder link? That is essentially what we need, but with some added ARIA.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;role&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;link&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;aria-disabled&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;true&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Disabled link&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removes the &lt;code&gt;href&lt;/code&gt;, so the link can&#39;t be focused or activated.&lt;/li&gt;
&lt;li&gt;Explicitly sets the &amp;quot;link&amp;quot; role, as without the &lt;code&gt;href&lt;/code&gt; its role changes from &amp;quot;link&amp;quot; to &amp;quot;generic&amp;quot; and is therefore not announced as a link to screen readers.&lt;/li&gt;
&lt;li&gt;Conveys the disabled state to assistive technologies via &lt;code&gt;aria-disabled=&amp;quot;true&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Without an &lt;code&gt;href&lt;/code&gt;, the element will not be keyboard focusable, but it can still be discovered by screen readers. That behaviour is consistent with other disabled elements, such as buttons and form inputs.&lt;/p&gt;
&lt;p&gt;Scott O&#39;Hara does a great job of going into more detail on this approach in &lt;a href=&quot;https://www.scottohara.me/blog/2021/05/28/disabled-links.html&quot;&gt;disabling a link&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;styling-considerations&quot;&gt;Styling considerations&lt;/h2&gt;
&lt;h3 id=&quot;visually-differentiate-text-links&quot;&gt;Visually differentiate text links&lt;/h3&gt;
&lt;p&gt;It should be obvious when text is a link, either through its position, such as in a navigation menu, or through its visual styling.&lt;/p&gt;
&lt;p&gt;By default, links are blue and underlined. Many sites change this to match their branding or design ideals, which is fine. The problems start when links are styled to look like normal body text, or when colour alone is used to distinguish them, especially when they&#39;re surrounded by plain text.&lt;/p&gt;
&lt;p&gt;Not everyone can reliably perceive colour differences. People with low vision or colour vision deficiency may struggle to spot a link if colour is the only visual cue, especially when it sits within a paragraph of text.&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-rely-on-colour-alone&quot;&gt;Don&#39;t: rely on colour alone&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;I&#39;ve written a guide on &lt;a href=&quot;https://www.jamesjacobs.me/guides/testing/how-to-test-with-a-screen-reader/&quot; style=&quot;text-decoration: none;&quot;&gt;how to test with a screen reader&lt;/a&gt;, which goes into more detail.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-use-a-secondary-visual-cue&quot;&gt;Do: use a secondary visual cue&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;I&#39;ve written a guide on &lt;a href=&quot;https://www.jamesjacobs.me/guides/testing/how-to-test-with-a-screen-reader/&quot;&gt;how to test with a screen reader&lt;/a&gt;, which goes into more detail.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;p&gt;To make links easy to recognise, use an additional, consistent, visual cue to distinguish them from plain text. An underline is the most common and widely understood option, though other approaches work if they are consistent and clearly distinguish links from surrounding text.&lt;/p&gt;
&lt;p&gt;While a link using colour alone to differentiate itself from plain text may not fail &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html&quot;&gt;WCAG 1.4.1 Use of Color (Level A)&lt;/a&gt; if it contrasts with plain text by at least a 3:1 ratio, or even uses the same colour as the surrounding plain text, using colour alone to differentiate links should be avoided.&lt;/p&gt;
&lt;h3 id=&quot;text-contrast-rules-apply&quot;&gt;Text contrast rules apply&lt;/h3&gt;
&lt;p&gt;As with unlinked text, text contrast ratio requirements still apply. Aim for a 7:1 or greater contrast ratio where possible, which meets the requirements of &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html&quot;&gt;WCAG 1.4.6 Contrast (Enhanced) (Level AAA)&lt;/a&gt;, or at minimum, a 4.5:1 as required by &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html&quot;&gt;WCAG 1.4.3 Contrast (Minimum) (Level AA)&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;use-a-highly-visible-focus-indicator&quot;&gt;Use a highly visible focus indicator&lt;/h3&gt;
&lt;p&gt;Focus indicators are critical for keyboard users. They highlight which element currently has keyboard focus and will therefore receive keyboard input. By default, browsers display some form of focus indicator, often a blue outline. While these have got better in recent years, they can still be hard to see in certain situations.&lt;/p&gt;
&lt;p&gt;Crafting your own, highly visible focus indicator is strongly recommended. If you tab through this site, you&#39;ll see that I use a 3px solid outline and a yellow background colour when elements are focused, which contrasts on both light and dark backgrounds, and also meets the requirements of WCAG &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;2.4.13 Focus Appearance (Level AAA)&lt;/a&gt;.&lt;/p&gt;
&lt;section class=&quot;callout callout--danger&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;don-t-disable-focus-indicators&quot;&gt;Don&#39;t: disable focus indicators&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;:focus, 
:focus-visible&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;outline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; none&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By disabling focus indicators, the user is left guessing as to which element has keyboard focus and will receive keyboard input.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section class=&quot;callout callout--success&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;do-use-a-highly-visible-focus-indicator&quot;&gt;Do: use a highly visible focus indicator&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/3O3rh31dJ--446.avif 446w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/3O3rh31dJ--446.webp 446w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/3O3rh31dJ--446.png&quot; alt=&quot;Screenshot of the focus indicator used on this site. The home link in a focused state, showing a focus indicator of a dark blue solid outline and a yellow background&quot; width=&quot;446&quot; height=&quot;82&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;p&gt;There are many ways to create great looking, accessible focus indicators - Sara Soueidan does a great job of exploring this further in &lt;a href=&quot;https://www.sarasoueidan.com/blog/focus-indicators/&quot;&gt;a guide to designing accessible, WCAG-conformant focus indicators&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Related WCAG success criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html&quot;&gt;1.4.11 Non-text Contrast (Level AA)&lt;/a&gt;: details contrast requirements for focus indicators&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html&quot;&gt;2.4.7 Focus Visible (Level AA)&lt;/a&gt;: requires a visible focus indicator to be present&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;2.4.13 Focus Appearance (Level AAA)&lt;/a&gt;: contains enhanced requirements around sizing and contrast&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html&quot;&gt;2.4.11 Focus Not Obscured (Minimum) (Level AA)&lt;/a&gt;: requires focused elements to be at least partially visible&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html&quot;&gt;2.4.12 Focus Not Obscured (Enhanced) (Level AAA)&lt;/a&gt;: require focused elements to be fully visible&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;make-links-large-enough-to-comfortably-activate&quot;&gt;Make links large enough to comfortably activate&lt;/h3&gt;
&lt;p&gt;Not everyone uses a mouse with steady hands at a desk. Some people use a small phone with one hand. Some use a trackpad that is less precise. Others live with tremors, arthritis, or reduced motor control. Even a temporary injury or bumpy bus journey can make small targets hard to hit. If links are too small or packed tightly together, activating the right one can be difficult.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ideal size&lt;/strong&gt;: Apart from links in sentences, aim for the target area of links to be at least 44px by 44px - which meets &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/target-size-enhanced.html&quot;&gt;2.5.5 Target Size (Enhanced) (Level AAA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimum size&lt;/strong&gt;: If 44px by 44px sizing isn&#39;t possible, ensure a minimum of 24px by 24px - required by &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html&quot;&gt;2.5.8 Target Size (Minimum) (Level AA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spacing&lt;/strong&gt;: Leave enough space between nearby links to prevent accidentally activating the wrong link&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html&quot;&gt;2.5.8 Target Size (Minimum) (Level AA)&lt;/a&gt; does allow for smaller target sizes if they are adequately spaced, larger controls are easier to reliably activate.&lt;/p&gt;
&lt;h3 id=&quot;hover-styles&quot;&gt;Hover styles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Style&lt;/strong&gt;: It&#39;s a good idea to add styling that visually differentiates when a link is being hovered over. This could be increasing the width of the link underline, changing the background, or other visuals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cursor&lt;/strong&gt;: By default, browsers change the cursor pointer to a hand icon when hovering over a link. That&#39;s something users are familiar with, so I&#39;d recommend against overriding it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The link hover styles on this site increase the underline and keep the default link cursor:&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/vOpq5mEusf-471.avif 471w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/vOpq5mEusf-471.webp 471w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/deep-dive-crafting-accessible-links/vOpq5mEusf-471.png&quot; alt=&quot;Screenshot of the link hover style used on this site. The main navigation guides link is shown hovered over with the mouse pointer, displaying a thicker underline than the other navigation links. The default link cursor is used.&quot; width=&quot;471&quot; height=&quot;82&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;common-patterns-to-avoid&quot;&gt;Common patterns to avoid&lt;/h2&gt;
&lt;p&gt;These patterns introduce barriers for many different users, including those who use screen readers and speech recognition software.&lt;/p&gt;
&lt;h3 id=&quot;avoid-pairing-a-heading-with-a-generic-link&quot;&gt;Avoid pairing a heading with a generic link&lt;/h3&gt;
&lt;p&gt;A common pattern often seen on blog post list pages places a heading above some short text, followed by a link such as &amp;quot;Read more&amp;quot;. For example:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Super cool blog post&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/supercool-blog-post&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Read more&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As mentioned above, link text should always describe the destination.  Instead of rewording the link, we could remove it and link the heading text:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/supercool-blog-post&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Super cool blog post&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This keeps the link text clear and avoids repeating information that already appears on the page.&lt;/p&gt;
&lt;h3 id=&quot;avoid-linking-an-image-and-nearby-text-to-the-same-place&quot;&gt;Avoid linking an image and nearby text to the same place&lt;/h3&gt;
&lt;p&gt;Similar to the last pattern, listing pages often show an image next to a heading, with both linking to the same page. This results in two separate links that take the user to the same destination, two tab stops, and screen reader users hearing the link twice in close succession.&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/making-links-accessible&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;links.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Making links accessible&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/making-links-accessible&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Making links accessible&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A simpler approach is to link the heading and unlink the image, adding alt text as appropriate (or leaving it empty to mark the image as decorative depending on the situation).&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;img&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;links.png&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;Screenshot of links with poor link text&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/making-links-accessible&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Making links accessible&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Some content&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dont-use-the-same-link-text-for-different-destinations&quot;&gt;Don&#39;t use the same link text for different destinations&lt;/h3&gt;
&lt;p&gt;Good link text informs the user where the link will lead. When the same link text is used for different destinations, things become confusing and uncertain. For example:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Available courses&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Art&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/art&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Explore courses&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Business&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/business&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Explore courses&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Screen reader users reading these links out of context may assume that they all lead to the same &amp;quot;explore courses&amp;quot; page, when they don&#39;t.&lt;/p&gt;
&lt;p&gt;There are various approaches that could be taken here, depending on the content, such as supplementing the link with visually hidden text, linking and rewording the headings, or just improving the link text:&lt;/p&gt;
&lt;pre class=&quot;language-html&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Available courses&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Art&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/art&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Art courses&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Business&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;h2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;...&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;/business&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Business courses&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you made it this far, thank you! I appreciate that this is a long post. I did consider splitting it into a series of smaller posts, but keeping everything on one page felt more useful in this case.&lt;/p&gt;
&lt;p&gt;Inaccessible links are still a common problem on the web. The &lt;a href=&quot;https://webaim.org/projects/million/#links&quot;&gt;2025 WebAim Million report&lt;/a&gt; found that 13.7% of the top one million most popular homepages contained link-related accessibility issues.&lt;/p&gt;
&lt;p&gt;Using semantic links and descriptive link text is a relatively easy way of making your web sites and applications more accessible. Much of the information in this post can also be applied to other mediums too - documents, emails, and social media.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>The accessibility pitfalls of truncating text</title>
    <link href="https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/" />
    <updated>2025-11-24T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/</id>
    <content type="html">&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/obRKHQ_tZT-2040.avif 2040w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/obRKHQ_tZT-2040.webp 2040w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/obRKHQ_tZT-2040.png&quot; alt=&quot;A button with truncated text that reads: Apply for a ...&quot; width=&quot;2040&quot; height=&quot;1046&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;p&gt;Truncated text, where text is cut off with an ellipsis or fades away, is still something often seen on the web, especially within web applications. Usually as a way to prevent long text from wrapping or for visual consistancy. When text is truncated it can hide meaning, effect understanding and place extra effort on people who already face barriers when using the web.&lt;/p&gt;
&lt;p&gt;In this post, I’ll look at why text is truncated, how it is usually done, the accessibility issues it causes, and what to do instead.&lt;/p&gt;
&lt;h2 id=&quot;why-text-is-truncated&quot;&gt;Why text is truncated&lt;/h2&gt;
&lt;p&gt;Designers and developers typically truncate text to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Preserve visual balance&lt;/strong&gt;: even when it limits what users can read&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control content of unknown length&lt;/strong&gt;: such as content entered by users in a CMS or pulled from external systems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintain fixed datatable layouts&lt;/strong&gt;: where rows, columns, and cells stay a uniform size&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimising for different devices&lt;/strong&gt;: by reducing visible text on smaller screens&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-is-text-truncated&quot;&gt;How is text truncated&lt;/h2&gt;
&lt;h3 id=&quot;css-most-common-method&quot;&gt;CSS (most common method)&lt;/h3&gt;
&lt;p&gt;Truncating text is typically done by CSS. Many design systems such as &lt;a href=&quot;https://getbootstrap.com/docs/5.3/helpers/text-truncation/&quot;&gt;Bootstrap&lt;/a&gt; and &lt;a href=&quot;https://tailwindcss.com/docs/text-overflow#truncating-text&quot;&gt;Tailwind&lt;/a&gt; include classes that truncate text. Text truncated in CSS is typically done by setting a &lt;code&gt;width&lt;/code&gt; or &lt;code&gt;max-width&lt;/code&gt; on the element or container plus:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.truncate&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;text-overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; ellipsis&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;white-space&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nowrap&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Text can also be truncated after a set number of lines:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.multi-line-truncation&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; -webkit-box&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-line-clamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 3&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;-webkit-box-orient&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; vertical&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; hidden&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; 230px&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because CSS truncation is purely visual, the full text still exists in the page. This becomes important later when looking at screen reader support.&lt;/p&gt;
&lt;h3 id=&quot;javascript-or-server-side-truncation&quot;&gt;JavaScript or server side truncation&lt;/h3&gt;
&lt;p&gt;Text truncation can also be handled with JavaScript or server side logic, where strings are cut short when they reach a certain length and ellipses appended, or worse text is truncated in the middle of the string - for example: &amp;quot;This text is [...] and ends here&amp;quot;.&lt;/p&gt;
&lt;p&gt;This approach should be avoided. It permanently removes content, meaning screen readers and other tools cannot access the full text. It also increases the risk of cutting words or sentences in confusing ways.&lt;/p&gt;
&lt;h2 id=&quot;who-is-affected&quot;&gt;Who is affected&lt;/h2&gt;
&lt;p&gt;Truncated text can affect everyone, especially when meaning or context is lost. Some groups face extra barriers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;People with vision impairments&lt;/strong&gt;: who use higher levels of zoom, use larger font sizes or modify text through custom styles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People with mobility impairments&lt;/strong&gt;: who use voice control software to interact with content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People with cognitive impairments&lt;/strong&gt;: who benefit from seeing complete information&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;People with language difficulties&lt;/strong&gt;: who may need full words and sentences to read comfortably&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyboard-only or touch users&lt;/strong&gt;: Sometimes, developers hide truncated text behind a hover event on the truncated text, which wouldn&#39;t be accessible to keyboards or people using touch devices&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smaller screens&lt;/strong&gt;: where truncation is triggered by responsive layouts or zoom&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;issues-caused-by-text-truncation&quot;&gt;Issues caused by text truncation&lt;/h2&gt;
&lt;p&gt;Here is a simple &lt;a href=&quot;https://codepen.io/jamesjacobs/full/myPBrjw&quot;&gt;CodePen&lt;/a&gt; with examples of single line truncation, multi line truncation, and a truncated button. The truncation is intentionally strong to make the issues easier to see.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;myPBrjw&quot; data-pen-title=&quot;Truncating text&quot; data-user=&quot;jamesjacobs&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
    &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/jamesjacobs/pen/myPBrjw&quot;&gt;
  Truncating text&lt;/a&gt; by James Jacobs (&lt;a href=&quot;https://codepen.io/jamesjacobs&quot;&gt;@jamesjacobs&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://public.codepenassets.com/embed/index.js&quot;&gt;&lt;/script&gt;
&lt;h3 id=&quot;effects-on-text-style-modification&quot;&gt;Effects on text style modification&lt;/h3&gt;
&lt;p&gt;Many people change how text looks on their device. Some do this by choice, others out of need. These changes may be set in the browser, the operating system, or through third party tools.&lt;/p&gt;
&lt;p&gt;Common changes include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Larger font size&lt;/li&gt;
&lt;li&gt;Increased line height&lt;/li&gt;
&lt;li&gt;More space between paragraphs, words or letters&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;increased-font-size&quot;&gt;Increased font size&lt;/h4&gt;
&lt;p&gt;In the screenshot below, taking the CodePen example, I&#39;ve increased the default text size in my browser to extra large. Due to the text size increase, more of the text is cut off, futher reducing readability and meaning.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/vfdMCY_L0l-1982.avif 1982w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/vfdMCY_L0l-1982.webp 1982w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/vfdMCY_L0l-1982.png&quot; alt=&quot;A comparison of the original text from the codepen and how the text appears after increase the default browser font size to extra large. More of the truncated text is cut off, resulting in less readable text&quot; width=&quot;1982&quot; height=&quot;1298&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;increased-text-spacing&quot;&gt;Increased text spacing&lt;/h4&gt;
&lt;p&gt;Using the &lt;a href=&quot;https://www.html5accessibility.com/tests/tsbookmarklet.html&quot;&gt;1.4.12 Text Spacing bookmarklet&lt;/a&gt; (credit to Steve Faulkner) to apply increased line height, paragraph, letter and word spacing that &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html&quot;&gt;WCAG 1.4.12 Text Spacing (Level AA)&lt;/a&gt; requires support of, we can see a similar effect with additional text being cut off.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/qI1hi9PJYF-1918.avif 1918w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/qI1hi9PJYF-1918.webp 1918w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/qI1hi9PJYF-1918.png&quot; alt=&quot;A comparison of the original text from the codepen and how the text appears after increase the line height, paragraph spacing, letter spacing and word spacing that WCAG 1.4.12 Text Spacing requires&quot; width=&quot;1918&quot; height=&quot;1120&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;increased-font-size-and-text-spacing&quot;&gt;Increased font size and text spacing&lt;/h4&gt;
&lt;p&gt;Combining both an increased font size and increased text spacing makes matters even worse to the point where meaning is completely lost.&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/k_X7FhrhGQ-2230.avif 2230w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/k_X7FhrhGQ-2230.webp 2230w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/k_X7FhrhGQ-2230.png&quot; alt=&quot;A comparison of the original text from the codepen and how the text appears after an increase to the text size and text spacing&quot; width=&quot;2230&quot; height=&quot;1526&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;browser-zoom&quot;&gt;Browser zoom&lt;/h3&gt;
&lt;p&gt;Some sites apply truncation only at smaller screen widths using media queries. Browser zoom effectively reduces the viewport width, which can trigger the same truncation.&lt;/p&gt;
&lt;p&gt;This means users who zoom in may lose content even on large screens.&lt;/p&gt;
&lt;p&gt;Here&#39;s an example of truncation applied via CSS media queries targetting smaller screen widths (also triggered by higher levels of browser zoom on larger screens):&lt;/p&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/81ZxO-PhxA-2074.avif 2074w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/81ZxO-PhxA-2074.webp 2074w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/81ZxO-PhxA-2074.png&quot; alt=&quot;An example of the Codepen content not truncated on a larger screen vs truncation triggered by media queires on a smaller screen or when a larger screen is zoomed triggering CSS media queires which add truncation. The single line and multiple line text examples as well as the button text is truncated.&quot; width=&quot;2074&quot; height=&quot;1316&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;effects-on-screen-readers&quot;&gt;Effects on screen readers&lt;/h3&gt;
&lt;p&gt;At the time of testing, JAWS, NVDA and macOS VoiceOver read the full untruncated text without any effect. This is because the CSS method for truncating text is a purely visual effect, the text is still in the DOM and not hidden from the accessibility tree.&lt;/p&gt;
&lt;h4 id=&quot;truncated-single-and-multiple-line-text-screen-reader-output&quot;&gt;Truncated single and multiple line text screen reader output&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/mAz4QQLq1r-2230.avif 2230w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/mAz4QQLq1r-2230.webp 2230w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/mAz4QQLq1r-2230.png&quot; alt=&quot;Screenshots showing the voiceover screen reader output for both the single line and multiple line truncation examples in the codepen - in both examples voiceover reads the full untruncated text&quot; width=&quot;2230&quot; height=&quot;1390&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;truncated-button-text-screen-reader-output&quot;&gt;Truncated button text screen reader output&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/XAuXUfYTzg-2230.avif 2230w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/XAuXUfYTzg-2230.webp 2230w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/XAuXUfYTzg-2230.png&quot; alt=&quot;A screenshot showing the voiceover screen reader output for the button with truncated text in the codepen - voiceover reads out the full untruncated text&quot; width=&quot;2230&quot; height=&quot;1390&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h3 id=&quot;effects-on-voice-control-and-speech-recognition&quot;&gt;Effects on voice control and speech recognition&lt;/h3&gt;
&lt;p&gt;Speech recognition and voice control software, such as &lt;a href=&quot;https://www.nuance.com/en-gb/dragon/business-solutions/dragon-professional.html&quot;&gt;Dragon&lt;/a&gt;, allows people to browse the web and interact with controls using spoken commands. These tools rely heavily on visible text labels. For example, saying &amp;quot;click save&amp;quot; activates a button with the visible text &amp;quot;Save&amp;quot;.&lt;/p&gt;
&lt;p&gt;When text is truncated, visible labels become shorter or unclear. This makes controls harder or impossible to activate by voice and forces users to rely on slower workarounds.&lt;/p&gt;
&lt;p&gt;The impact depends on how much the text is truncated. Using the button in the CodePen as an example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The full button text (and accessible name) is &amp;quot;Apply for a new passport&amp;quot;&lt;/li&gt;
&lt;li&gt;When truncated to &amp;quot;Apply f...&amp;quot;, the button can still be activated by saying &amp;quot;click apply&amp;quot;, though additional steps will be required if multiple &amp;quot;apply&amp;quot; buttons exist&lt;/li&gt;
&lt;li&gt;When further truncated to &amp;quot;App...&amp;quot;, saying &amp;quot;click app&amp;quot; no longer works&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once visible text is reduced to partial or indistinguishable words, users must switch to alternative interaction methods. One common workaround is the mousegrid, which overlays a numbered grid on the page and requires users to narrow down the target area step by step before activating the control.&lt;/p&gt;
&lt;p&gt;In the CodePen example, activating the button this way takes five separate steps before the user can say &amp;quot;mouse click&amp;quot;. This adds significant time, effort, and frustration compared to using clear, untruncated labels.&lt;/p&gt;
&lt;h4 id=&quot;mousegrid-step-1&quot;&gt;Mousegrid step 1&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/J_valVJIlh-5108.avif 5108w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/J_valVJIlh-5108.webp 5108w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/J_valVJIlh-5108.png&quot; alt=&quot;Screenshot of the demo codepen with the Dragon mouse grid activated which overlays a numbered grid, with 9 areas over the page&quot; width=&quot;5108&quot; height=&quot;2633&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;mousegrid-step-2&quot;&gt;Mousegrid step 2&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/2t5135S7k_-5117.avif 5117w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/2t5135S7k_-5117.webp 5117w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/2t5135S7k_-5117.png&quot; alt=&quot;Screenshot of the demo codepen with the Dragon mousegrid activated on area 4 - the grid has reduced in size now covering the box previously labelled 4 with 9 numbered areas&quot; width=&quot;5117&quot; height=&quot;2630&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;mousegrid-step-3&quot;&gt;Mousegrid step 3&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/TbPavB859--661.avif 661w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/TbPavB859--661.webp 661w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/TbPavB859--661.png&quot; alt=&quot;Screenshot of the demo codepen with the Dragon mousegrid activated on area 4 - the grid has reduced in size again now covering the box previously labelled 4 with 9 numbered areas&quot; width=&quot;661&quot; height=&quot;446&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;mousegrid-step-4&quot;&gt;Mousegrid step 4&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/E8vIHlLibg-348.avif 348w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/E8vIHlLibg-348.webp 348w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/E8vIHlLibg-348.png&quot; alt=&quot;Screenshot of the demo codepen with the Dragon mousegrid activated on area 7 - the grid has reduced in size again now covering the box previously labelled 7 with 9 numbered areas&quot; width=&quot;348&quot; height=&quot;226&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h4 id=&quot;mousegrid-step-5&quot;&gt;Mousegrid step 5&lt;/h4&gt;
&lt;p&gt;&lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/DmTb8jS5vp-313.avif 313w&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/DmTb8jS5vp-313.webp 313w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/the-accessibility-pitfalls-of-truncating-text/DmTb8jS5vp-313.png&quot; alt=&quot;The final stage of the mousegrid, now covering the button where a user can now say mouse click&quot; width=&quot;313&quot; height=&quot;196&quot;&gt;&lt;/picture&gt;&lt;/p&gt;
&lt;h2 id=&quot;wcag-considerations&quot;&gt;WCAG considerations&lt;/h2&gt;
&lt;p&gt;Depending on the situation and how truncation is used, it may lead to failures of several WCAG success criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html&quot;&gt;1.3.1 Info and Relationships (A)&lt;/a&gt;&lt;/strong&gt;: potentially a failure as the truncation is only visually and not programatically conveyed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html&quot;&gt;1.4.4 Resize Text (AA)&lt;/a&gt;&lt;/strong&gt;: if text cannot be resized up to 200% without loss of content (see &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/failures/F69&quot;&gt;F69&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/reflow.html&quot;&gt;1.4.10 Reflow (AA)&lt;/a&gt;&lt;/strong&gt;: if truncation occurs as a result of reflow at smaller viewport widths, such as 320 CSS pixels wide or 1280px with 400% zoom, and no alternative way to access the full content is provided&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html&quot;&gt;1.4.12 Text Spacing (AA)&lt;/a&gt;&lt;/strong&gt;: if support for the required spacing causes any lose of content (unless an accessible alternative is provided)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html&quot;&gt;2.5.3 Label in Name (A)&lt;/a&gt;&lt;/strong&gt;: if truncated visible labels do not match or are not contained within the components accessible name. For example: &amp;quot;Apply for a new passport&amp;quot; does not contain the text &amp;quot;Apply...&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html&quot;&gt;3.3.2 Labels or Instructions (A)&lt;/a&gt;&lt;/strong&gt;: if form labels or instruction are truncated to the point where they lose meaning&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-to-do-instead&quot;&gt;What to do instead&lt;/h2&gt;
&lt;p&gt;Avoid truncating text wherever possible. Truncation adds barriers and often causes confusion for everyone.&lt;/p&gt;
&lt;p&gt;In most cases, truncation can be designed away by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Letting text wrap naturally&lt;/li&gt;
&lt;li&gt;Using flexible layouts instead of fixed widths&lt;/li&gt;
&lt;li&gt;Allowing containers to grow with content&lt;/li&gt;
&lt;li&gt;Rethinking whether all content needs to fit in one line&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If content needs to be hidden, use clear and accessible patterns such as the &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/&quot;&gt;Disclosure pattern&lt;/a&gt;, that work with keyboard, touch, and screen readers.&lt;/p&gt;
&lt;p&gt;When dealing with long unbroken strings/words, where you may not have control over the content (e.g., user generated content or content pulled in from 3rd party integrations), rather than trucating, hyphenate the word and allow it to wrap:&lt;/p&gt;
&lt;pre class=&quot;language-css&quot; tabindex=&quot;0&quot;&gt;&lt;code class=&quot;language-css&quot;&gt;&lt;span class=&quot;token selector&quot;&gt;.wrap-text-with-hyphens&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;overflow-wrap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; break-word&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;hyphens&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; auto&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In rare cases where truncation is unavoidable, provide an obvious and accessible way to view the full content. This might mean repeating the full text nearby or offering a clear accessible control to reveal it.&lt;/p&gt;
&lt;p&gt;Truncation is a design choice, not a technical limit. By prioritising clarity over rigid layouts, we can create interfaces that work better for everyone.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>A simple example of how accessibility helps everyone</title>
    <link href="https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/" />
    <updated>2025-08-28T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/</id>
    <content type="html">&lt;p&gt;When accessibility is your day job, you all too often see accessibility issues on the web that make you wince. Today was one of those days.&lt;/p&gt;
&lt;p&gt;I was cooking tea (or dinner if you&#39;re not from Yorkshire). The kids were telling me about their days while I was cooking up their favourite spaghetti bolognese. I&#39;d had my car serviced earlier in the day. I got a text message from the dealer that linked to a &amp;quot;vehicle health check&amp;quot; video - where they walk you around the car and talk you through any potential issues. As the kids dashed off to play outside, I grabbed my phone with one hand, while trying not to burn the mince I was frying.&lt;/p&gt;
&lt;p&gt;I hit the link expecting to see the video...&lt;/p&gt;
&lt;h2 id=&quot;the-problem&quot;&gt;The problem&lt;/h2&gt;
&lt;p&gt;Instead, I was taken to a form where I needed to enter my car registration number, postcode and, mobile number.&lt;/p&gt;
&lt;div class=&quot;mobile-image-wrapper&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/T57CPp9Pgw-320.avif 320w&quot; sizes=&quot;320px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/T57CPp9Pgw-320.webp 320w&quot; sizes=&quot;320px&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/T57CPp9Pgw-320.png&quot; alt=&quot;A mobile web browser showing an authentication page. The page has 3 text inputs - registration number, email address and mobile number. The screen is laid out in a way that suggests it was not built responsively and only for larger screens with the input labels positioned to the left of the inputs.&quot; width=&quot;320&quot; height=&quot;695&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;The first red flag: the page wasn&#39;t responsive. Nothing stacked neatly into a single column - the usual mobile-first/responsive pattern.&lt;/p&gt;
&lt;p&gt;Ignoring this, I tapped on the registration number input, which is when things got frustrating.&lt;/p&gt;
&lt;div class=&quot;mobile-image-wrapper&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/nCP9Hr_72M-320.avif 320w&quot; sizes=&quot;320px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/nCP9Hr_72M-320.webp 320w&quot; sizes=&quot;320px&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/nCP9Hr_72M-320.png&quot; alt=&quot;The same authentication page, with the first input focused. The screen has shifted to the right with the input labels no longer visible.&quot; width=&quot;320&quot; height=&quot;695&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;The screen shifted and zoomed slightly so that labels disappeared off the left side. This happened for every field: car reg, email and mobile number.&lt;/p&gt;
&lt;p&gt;Trying to type one-handed while cooking and keeping an eye on the kids, I had to constantly scroll left and right just to remind myself which field I was in. Frustrating, especially when you know how easily this could have been avoided. Not to mention this is also a failure of &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/reflow.html&quot;&gt;WCAG 1.4.10 Reflow (AA)&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;mobile-image-wrapper&quot;&gt;
  &lt;picture&gt;&lt;source type=&quot;image/avif&quot; srcset=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/LtN0lPgRZw-320.avif 320w&quot; sizes=&quot;320px&quot;&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/LtN0lPgRZw-320.webp 320w&quot; sizes=&quot;320px&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;https://www.jamesjacobs.me/blog/a-simple-example-of-how-accessibility-helps-everyone/LtN0lPgRZw-320.png&quot; alt=&quot;The same authentication page, with the first input focused after scrolling back to the left to see which label matched up with which input&quot; width=&quot;320&quot; height=&quot;695&quot;&gt;&lt;/picture&gt;
&lt;/div&gt;
&lt;p&gt;For me, it was just an annoyance. But for someone with motor control challenges or cognitive impairments, this would have been a much bigger barrier.&lt;/p&gt;
&lt;h2 id=&quot;digging-deeper&quot;&gt;Digging deeper&lt;/h2&gt;
&lt;p&gt;Later in the day, I decided to take a deeper look at the page to see what other issues lurked. After inspecting the page in Chrome DevTools, more issues were found.&lt;/p&gt;
&lt;h3 id=&quot;page-basics&quot;&gt;Page basics&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;No language set on the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; tag, failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html&quot;&gt;WCAG 3.1.1 Language of Page (A)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No page landmarks at all, potentially making navigation harder for screen reader users&lt;/li&gt;
&lt;li&gt;No initial zoom level set due to missing &lt;code&gt;initial-scale=1.0&lt;/code&gt; on the viewport &lt;code&gt;meta&lt;/code&gt; tag&#39;s, which can cause zooming and layout problems&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;forms-and-labels&quot;&gt;Forms and labels&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Labels weren&#39;t programatically associated with inputs (missmatched &lt;code&gt;for&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt; values), failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html&quot;&gt;WCAG 1.3.1 Info and Relationships (A)&lt;/a&gt; and &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/name-role-value&quot;&gt;4.1.2 Name, Role, Value (A)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;autocomplete&lt;/code&gt; values on email or mobile inputs, failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html&quot;&gt;WCAG 1.3.5 Identify Input Purpose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Form errors were communicated by text but were not programmatically associated with inputs, arguably failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html&quot;&gt;WCAG 1.3.1 Info and Relationships (A)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;content-and-layout&quot;&gt;Content and layout&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Header links and images visible at wider screen widths were hidden on mobile, failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/reflow.html&quot;&gt;WCAG 1.4.10 Reflow (AA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Empty headings were present, failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html&quot;&gt;WCAG 2.4.6 Headings and Labels (AA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linked images had no accessible names (no alt text, ARIA or visually hidden text), failing &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/name-role-value&quot;&gt;WCAG 4.1.2 Name, Role, Value (A)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Text was small and the default iOS focus outline was low contrast, making everything harder to see and use.&lt;/li&gt;
&lt;li&gt;Percentage-based widths on labels and inputs with no media queries for smaller screen sizes / higher zoom levels (lack of responsive design)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-should-have-been-done&quot;&gt;What should have been done&lt;/h2&gt;
&lt;p&gt;This is a classic case where accessibility, usability, and good design overlap. These &amp;quot;vehicle health checks&amp;quot; are sent out by SMS, so almost everyone opening them will be on a phone. At the very least, the team should have tested the user journey on mobile, with and without a screen reader. Had this been done, almost all of the issues mentioned would have been caught.&lt;/p&gt;
&lt;p&gt;None of of the issues are hard to fix, it&#39;s standard responsive, accessible design.&lt;/p&gt;
&lt;p&gt;Here&#39;s a simple &lt;a href=&quot;https://codepen.io/jamesjacobs/pen/KwdYroK&quot;&gt;CodePen&lt;/a&gt; showing how the page could look, had it been built with accessibility in mind.&lt;/p&gt;
&lt;p class=&quot;codepen&quot; data-height=&quot;300&quot; data-theme-id=&quot;dark&quot; data-default-tab=&quot;result&quot; data-slug-hash=&quot;KwdYroK&quot; data-pen-title=&quot;Example responsive dealer sign in&quot; data-user=&quot;jamesjacobs&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot;&gt;
  &lt;span&gt;See the Pen &lt;a href=&quot;https://codepen.io/jamesjacobs/pen/KwdYroK&quot;&gt;
  Example responsive dealer sign in&lt;/a&gt; by James Jacobs (&lt;a href=&quot;https://codepen.io/jamesjacobs&quot;&gt;@jamesjacobs&lt;/a&gt;)
  on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;
&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://public.codepenassets.com/embed/index.js&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;When you&#39;re designing, building, or testing something, don&#39;t just check it on your desktop. Try the full user journey on different devices and screen sizes, and against the baseline WCAG provides, using tools like screen readers, speech recognition, and built-in features found in almost all browsers and operating systems, such as zoom or magnification.&lt;/p&gt;
&lt;p&gt;Doing this doesn&#39;t just help people with permanent disabilities - it makes life easier for anyone juggling everyday chaos: cooking dinner, sorting the kids, or trying to type one-handed. That&#39;s situational impairment in action, and this story is a perfect example.&lt;/p&gt;
&lt;p&gt;Accessibility isn&#39;t just about compliance. It&#39;s about making things work for real people, in real life. And real life is messy: kids, cooking, one hand free. When you design, develop and test with that in mind, everyone wins.&lt;/p&gt;
&lt;p&gt;Oh, and you&#39;ll be happy to know, I didn&#39;t burn the tea and the kids enjoyed spaghetti bolognese for the millionth time!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Building a lasting accessibility strategy: Part 4</title>
    <link href="https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-4/" />
    <updated>2025-08-01T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-4/</id>
    <content type="html">&lt;p&gt;In &lt;a href=&quot;https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-3/&quot;&gt;part 3&lt;/a&gt;, we looked at how to embed accessibility into the development lifecycle, going beyond compliance, design systems and how different roles can contribute. In this final post of the series, we&#39;ll wrap things up by focusing on audits, user testing, ongoing monitoring, and creating a living roadmap to keep accessibility moving forward.&lt;/p&gt;
&lt;p&gt;As before, I&#39;ll keep using the word &amp;quot;website&amp;quot; as a placeholder for digital products, services, platforms, and apps.&lt;/p&gt;
&lt;h2 id=&quot;accessibility-audits&quot;&gt;Accessibility audits&lt;/h2&gt;
&lt;p&gt;In-depth, human-led accessibility audits are an important part of any accessibility strategy and programme. They involve testing a website against WCAG success criteria, as well as recommending improvements beyond WCAG, to uncover barriers that users may face. Audits should be carried out by people with detailed technical knowledge of accessibility standards and assistive technologies.&lt;/p&gt;
&lt;p&gt;Issues identified in an audit should be prioritised and addressed. And while WCAG isn&#39;t the &lt;em&gt;be-all and end-all of accessibility&lt;/em&gt;, it provides a solid and consistent baseline for testing.&lt;/p&gt;
&lt;p&gt;It&#39;s important to remember that audits provide only a snapshot in time of a website&#39;s accessibility. Things change quickly - new content, features, and behaviours can introduce fresh issues. For this reason, audits should be seen as one part of the solution. Real progress comes from combining audits with culture change, staff knowledge, and embedded practices.&lt;/p&gt;
&lt;h3 id=&quot;how-to-audit&quot;&gt;How to audit&lt;/h3&gt;
&lt;p&gt;Accessibility auditing is a specialised area, and a full deep dive is beyond the scope of this post (though I plan to cover it in a future one). For now, here&#39;s a high-level overview for anyone with limited exposure to audits.&lt;/p&gt;
&lt;p&gt;Most organisations that perform audits use their own methodology, but these often align with the &lt;a href=&quot;https://www.w3.org/WAI/test-evaluate/conformance/wcag-em/&quot;&gt;WCAG-EM&lt;/a&gt; (WCAG Evaluation Methodology). WCAG-EM provides structured guidance on evaluating how well websites conform to WCAG through manual testing.&lt;/p&gt;
&lt;p&gt;Auditing an entire site with thousands of pages, components, interactions, and states would be impractical. Instead, audits typically focus on a representative sample of pages and key user journeys, which are tested against each WCAG success criterion using a mix of automated tools, assistive technologies, and manual testing.&lt;/p&gt;
&lt;p&gt;Common tools include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deque Axe&lt;/li&gt;
&lt;li&gt;Site Improve&lt;/li&gt;
&lt;li&gt;IBM Equal Access&lt;/li&gt;
&lt;li&gt;WAVE&lt;/li&gt;
&lt;li&gt;Microsoft Accessibility Insights&lt;/li&gt;
&lt;li&gt;Colour contrast checkers&lt;/li&gt;
&lt;li&gt;Screen readers: Mac/iOS VoiceOver, NVDA, JAWS&lt;/li&gt;
&lt;li&gt;Speech recognition software: such as Dragon NaturallySpeaking&lt;/li&gt;
&lt;li&gt;Magnification software&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, full website audits can be carried out if necessary (and if your have the time and resource) by breaking the audit into phases, with each phase focusing on a different area of the website.&lt;/p&gt;
&lt;p&gt;It&#39;s a good idea to perform audits periodically - to catch new issues and stay on top of compliance - alongside accessibility testing that&#39;s embedded into your development lifecycle. If you don&#39;t have in-house expertise, many organisations provide accessibility auditing services, such as &lt;a href=&quot;https://abilitynet.org.uk&quot;&gt;AbilityNet&lt;/a&gt; and &lt;a href=&quot;https://tetralogical.com&quot;&gt;TetraLogical&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;user-testing&quot;&gt;User testing&lt;/h2&gt;
&lt;p&gt;Audits, automated tools, and compliance checks all have their place in an accessibility strategy. They can highlight technical issues, flag WCAG violations, and provide a baseline for improvement. But none of these can substitute for real-world testing by people with disabilities.&lt;/p&gt;
&lt;p&gt;It often comes as a surprise to teams new to accessibility that a website can technically conform to WCAG standards while still including barriers for users. For example, navigation may be technically operable but exhausting for someone using a screen reader, or a form may be technically accessible but confusing for someone with cognitive impairments. Only by involving real people can you uncover these gaps between compliance and experience.&lt;/p&gt;
&lt;p&gt;The feedback from disabled users is super valuable: it provides direct insight into how well your design supports independence, efficiency, and dignity. No amount of internal testing can replicate lived experience.&lt;/p&gt;
&lt;p&gt;If you don&#39;t yet have a direct connection to disabled users, there are organisations that can help, such as &lt;a href=&quot;https://www.accessibility-services.co.uk/&quot;&gt;Shaw Trust Accessibility Services&lt;/a&gt; and &lt;a href=&quot;https://www.rnib.org.uk/professionals-old-version/business-professionals/accessibility-for-product-design/&quot;&gt;RNIB&lt;/a&gt;. These partnerships can bring powerful insights to your teams and build empathy in the process.&lt;/p&gt;
&lt;p&gt;User testing is often the difference between a product that is compliant and one that is genuinely inclusive.&lt;/p&gt;
&lt;h2 id=&quot;track-and-monitor-progress&quot;&gt;Track and monitor progress&lt;/h2&gt;
&lt;p&gt;If you&#39;re not measuring accessibility, you won&#39;t know whether you&#39;re improving. Tracking progress helps demonstrate impact, keeps accessibility visible across the organisation, and provides evidence for leadership buy-in. It also ensures accountability - accessibility isn&#39;t something you can &amp;quot;set and forget.&amp;quot;&lt;/p&gt;
&lt;p&gt;A balanced approach works best:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automated testing in the build pipeline&lt;/strong&gt;: tools like Cypress + cypress-axe can flag common issues during development. Track trends over time to show improvements or spot regressions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ongoing automated monitoring&lt;/strong&gt;: services like &lt;a href=&quot;https://silktide.com/&quot;&gt;Silktide&lt;/a&gt; and &lt;a href=&quot;https://www.siteimprove.com/&quot;&gt;Siteimprove&lt;/a&gt; provide regular scans and dashboards that highlight trends. Remember, automated tools only catch around 30% to 40% of WCAG issues, so this should complement, not replace, manual testing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual technical audits&lt;/strong&gt;: periodic human-led accessibility reviews against WCAG and beyond give a more accurate picture of barriers automated tools may miss.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;User testing with people with disabilities&lt;/strong&gt;: the most valuable feedback comes from real users - they&#39;ll uncover issues that no automated or technical audit will ever catch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support and feedback channels&lt;/strong&gt;: log accessibility issues raised through customer support, feedback forms, or social media.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issue tracking&lt;/strong&gt;: keep accessibility issues in your normal project management tool (Jira, Trello, Azure DevOps) so progress is visible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roadmap and backlog updates&lt;/strong&gt;: feed findings back into your accessibility roadmap to keep work prioritised.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transparent reporting&lt;/strong&gt;: share progress and gaps with your teams and leadership. This builds trust and keeps accessibility high on the agenda.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&#39;s just as important to celebrate wins as it is to flag challenges. Recognising progress keeps teams motivated, while openness about gaps prevents complacency.&lt;/p&gt;
&lt;p&gt;As accessibility advocate Meryl Evans says: &amp;quot;Progress over perfection.&amp;quot; Accessibility is a journey, not a checkbox. The goal is steady improvement, not ticking every box at once.&lt;/p&gt;
&lt;h2 id=&quot;create-a-living-accessibility-roadmap&quot;&gt;Create a living accessibility roadmap&lt;/h2&gt;
&lt;p&gt;Once you know where you are on your accessibility journey, the next step is to map out where you want to go. A living roadmap helps set clear expectations for product owners and leadership, and it should be something that&#39;s visible and shared widely across the organisation.&lt;/p&gt;
&lt;p&gt;Think in timeframes: what do you want to achieve this year, next year, and even in 5 years? Your roadmap should cover core products and design systems, with specific items pulled into product roadmaps as priorities shift.&lt;/p&gt;
&lt;p&gt;The key word here is &lt;em&gt;living&lt;/em&gt;. A roadmap isn&#39;t a static document. It should evolve as your organisation learns, grows, and makes progress.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That brings us to the end of this series of posts - I hope you&#39;ve found them useful. Accessibility strategy is a big topic, and one I could keep writing about (and probably will in the future).&lt;/p&gt;
&lt;p&gt;Building a lasting accessibility programme is not a quick or easy task. There will be obstacles, and it takes persistence, resources, and sometimes a thick skin. But the reward is worth it: a culture, a team, and a website that truly includes everyone.&lt;/p&gt;
&lt;h2 id=&quot;futher-reading&quot;&gt;Futher reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/articles/strategicframework/assessment&quot;&gt;The WebAIM Strategic Accessibility Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tpgi.com/a-guide-to-creating-a-successful-digital-accessibility-program/&quot;&gt;TPGI Guide to Creating a Successful Digital Accessibility Program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.craigabbott.co.uk/blog/defining-a-strategy-for-accessibility/&quot;&gt;Craig Abbott - Definding a strategy for accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.deque.com/blog/the-business-case-for-accessibility/&quot;&gt;Deque - the business case for accessibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
  <entry>
    <title>Building a lasting accessibility strategy: Part 3</title>
    <link href="https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-3/" />
    <updated>2025-07-24T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-3/</id>
    <content type="html">&lt;p&gt;In &lt;a href=&quot;https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-2/&quot;&gt;part 2&lt;/a&gt;, we covered how to get people involved, raising awareness, accessibility champions, and the importance of internal resources.&lt;/p&gt;
&lt;p&gt;Now that you have people on board, the next step is making accessibility part of how you build and maintain your products. That means going beyond compliance, weaving accessibility into the development lifecycle, making good use of design systems, building a dedicated accessibility function, and ensuring every role contributes to more inclusive experiences.&lt;/p&gt;
&lt;p&gt;As before, I&#39;ll keep using the word &amp;quot;website&amp;quot; as shorthand for digital products, services, platforms, and apps.&lt;/p&gt;
&lt;h2 id=&quot;understand-technical-compliance-but-aim-higher&quot;&gt;Understand technical compliance, but aim higher&lt;/h2&gt;
&lt;p&gt;A lot of organisations stop at WCAG AA compliance, since it&#39;s the minimum required by most accessibility laws. The problem is that this approach often ignores AAA requirements and best practices outside WCAG that can make a big difference to real people.&lt;/p&gt;
&lt;p&gt;AAA criteria are especially helpful for people with cognitive, visual, or auditory impairments. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1.4.6 Contrast (Enhanced)&lt;/strong&gt;: higher contrast ratio for text, improving readability for people with low vision&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2.4.9 Link Purpose (Link Only)&lt;/strong&gt;: ensures link text makes sense in isolation, which helps screen reader users&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3.1.5 Reading Level&lt;/strong&gt;: can help people with dyslexia and other learning disabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&#39;s true that not all AAA criteria are practical for every website. WCAG itself says Level AAA should not be required across the board. But aiming for AAA where possible is valuable. WCAG itself notes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is not recommended that Level AAA conformance be required as a general policy for entire sites because it is not possible to satisfy all Level AAA success criteria for some content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Beyond WCAG, additional guidance and recomendations exist, such as the work done by the W3C&#39;s Cognitive and Learning Disabilities Accessibility Task Force (COGA TF), for example, &lt;a href=&quot;https://www.w3.org/TR/coga-usable/&quot;&gt;Making Content Usable for People with Cognitive and Learning Disabilities&lt;/a&gt;. The excellent &lt;a href=&quot;https://inclusivedesignprinciples.info/&quot;&gt;Inclusive Design Principles&lt;/a&gt; are another useful reference.&lt;/p&gt;
&lt;p&gt;Simple design choices can make a big difference too. A decorative font might technically pass contrast checks but still be hard to read for people with dyslexia or low vision. That&#39;s why testing with real users is so important: a site can meet WCAG yet still include barriers.&lt;/p&gt;
&lt;p&gt;Compliance is the baseline. A stronger approach is to define your own accessibility standards, combining AA, selected AAA, and best practices that fit your users&#39; needs.&lt;/p&gt;
&lt;h2 id=&quot;embed-accessibility-into-the-full-development-lifecycle&quot;&gt;Embed accessibility into the full development lifecycle&lt;/h2&gt;
&lt;p&gt;Accessibility isn&#39;t something to tack on at the end, nor is it just one person&#39;s job - everyone can and needs to contribute. It should be integrated across the entire development life-cycle. Set role-specific expectations and requirements. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Product owners/Project managers&lt;/strong&gt;: prioritise accessibility work, ensure it&#39;s included in roadmaps and make space for it in sprints. Write accessible user stories and acceptance criteria.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Designers&lt;/strong&gt;: follow inclusive design patterns from the start, including accessible colours, target sizes, layouts, user journeys and interactions that work for a wide range of users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developers&lt;/strong&gt;: use accessible components and semantic HTML. Run basic accessibility checks before passing work to testers. Write accessibility test assertions with the same priority as unit and end-to-end (e2e) tests. Include accessibility checkpoints in your Definition of Done (DoD)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QA/Testers&lt;/strong&gt;: catch issues through automated tools and manual testing with assistive technologies. Contribute to any automated accessibility test suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other roles, not specifically involved in the typical development lifecycle can and should also contribute to promoting accessibility:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content authors&lt;/strong&gt;: write clear, concise content with headings, plain language and descriptive link text so information is easy to understand and navigate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer support&lt;/strong&gt;: listens to feedback from users, especially those with disabilities, and passes insights back to product teams&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Marketing&lt;/strong&gt;: produces campaigns and assets that are accessible and easy to engage with, from alt text on images to accessible PDFs and video captions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leadership&lt;/strong&gt;: sets expectations, removes barriers and gives teams the time and resources they need to do accessibility properly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Accessibility works best when it&#39;s seen as part of everyone&#39;s responsibility, not a single team&#39;s task. When each role contributes, accessibility becomes a natural and sustainable part of your organisation&#39;s culture. The goal is to make accessibility a habit, not a one-off task.&lt;/p&gt;
&lt;h2 id=&quot;design-systems-and-component-libraries&quot;&gt;Design systems and component libraries&lt;/h2&gt;
&lt;p&gt;If you&#39;re not using a component library, start now. If you are, make sure accessibility is built in by default.&lt;/p&gt;
&lt;p&gt;These reusable UI components should include all the necessary accessibility considerations - semantics, color contrast, keyboard support, ARIA (where necessary - remember the &lt;a href=&quot;https://www.w3.org/TR/using-aria/#rule1&quot;&gt;first rule of ARIA&lt;/a&gt;), focus styles - the lot. Broader accessibility guidance can be covered in your design system, as well as component specific guidance and expectations.&lt;/p&gt;
&lt;p&gt;The real power of a component library is that updates cascade across your whole product. Fixing one component can fix hundreds of instances in one go. That makes it a powerful tool for rolling out accessibility improvements, and a natural place to start when auditing or testing your site.&lt;/p&gt;
&lt;p&gt;An accessible component library doesn&#39;t guarantee a fully accessible product, but it gives teams strong foundations to build on.&lt;/p&gt;
&lt;h2 id=&quot;a-dedicated-accessibility-team&quot;&gt;A dedicated accessibility team&lt;/h2&gt;
&lt;p&gt;Many organisations don&#39;t have a dedicated accessibility team or lead, and instead rely on individual champions scattered across departments. While this grassroots energy is important, having a dedicated team can significantly accelerate progress.&lt;/p&gt;
&lt;p&gt;A dedicated accessibility team can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Set direction&lt;/strong&gt;: define the organisation&#39;s accessibility vision, strategy and standards&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provide expertise&lt;/strong&gt;: fill knowledge gaps across teams by offering guidance on design, content and development best practices&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaborate&lt;/strong&gt;: with product management, design, and development teams to define accessibility requirements and acceptance criteria&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consult&lt;/strong&gt;: on scope of effort, user impact, and regulatory priorities related to accessibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deliver training&lt;/strong&gt;: run onboarding, refresher sessions and role-specific training tailored to different functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support projects&lt;/strong&gt;: partner with product teams to review designs, test features and advise on complex accessibility challenges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build resources&lt;/strong&gt;: maintain documentation, component libraries and internal guidance to ensure consistent approaches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lead audits and monitoring&lt;/strong&gt;: coordinate testing and reporting, making sure accessibility is continuously tracked and improved&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Act as advocates&lt;/strong&gt;: champion accessibility at all levels, helping it stay visible and properly resourced&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The presence of a team also shows that accessibility is a real priority, not just something left to volunteers. It gives people a clear place to go for advice and reduces the burden on individual teams.&lt;/p&gt;
&lt;h3 id=&quot;what-a-dedicated-team-can-look-like&quot;&gt;What a dedicated team can look like&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smaller organisations&lt;/strong&gt;: A single accessibility lead or specialist who drives initiatives, supports teams, and acts as the main point of contact&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mid-sized organisations&lt;/strong&gt;: A small accessibility team (2–3 people) who split responsibilities across training, audits, design support and development guidance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Larger organisations&lt;/strong&gt;: A central accessibility function with specialists in design, development, content and assistive technology, often paired with accessibility champions embedded across departments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whatever the size, the team needs both visibility and authority. They should be able to influence priorities, shape processes, and work with leadership to ensure accessibility is resourced and sustainable.&lt;/p&gt;
&lt;h3 id=&quot;the-business-case&quot;&gt;The business case&lt;/h3&gt;
&lt;p&gt;Investing in a dedicated team pays off quickly. It helps avoid costly retrofits or lawsuits, creates reusable resources, and drives customer loyalty by making products usable by more people. In short: it helps everyone work smarter, not harder.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-4/&quot;&gt;part 4&lt;/a&gt;, we&#39;ll wrap things up by covering testing, measuring and monitoring accessibility.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Building a lasting accessibility strategy: Part 2</title>
    <link href="https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-2/" />
    <updated>2025-07-18T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-2/</id>
    <content type="html">&lt;p&gt;In &lt;a href=&quot;https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-1/&quot;&gt;part 1&lt;/a&gt;, we looked at how to get started by defining your goals, building a plan and getting leadership buy-in.&lt;/p&gt;
&lt;p&gt;With leadership on board and a plan in place, the next step is embedding accessibility into your organisation&#39;s culture. Real success doesn&#39;t just come from checklists or audits - it comes from people. In this post, we&#39;ll look at how to get everyone on board, raise awareness, find allies, build a champions network, and provide the education and resources teams need.&lt;/p&gt;
&lt;p&gt;To keep things simple, I&#39;ll keep using the word “website” as a stand-in for digital products, services, platforms, and apps.&lt;/p&gt;
&lt;h2 id=&quot;getting-everyone-on-board&quot;&gt;Getting everyone on board&lt;/h2&gt;
&lt;p&gt;Accessibility can&#39;t sit on one person&#39;s shoulders. It works best when everyone - designers, developers, testers, product managers, and leadership - sees it as part of their role. It should be part of your team&#39;s mindset, not an afterthought.&lt;/p&gt;
&lt;p&gt;In my experience, understanding varies hugely from person to person, ranging from zero awareness to deep expertise. The challenge is that accessibility can be complex, subjective, and often not covered in typical design or development courses.&lt;/p&gt;
&lt;p&gt;The tricky part is that awareness levels vary a lot. Some people have never heard of accessibility beyond “screen reader stuff”. Add to that the fact that accessibility can feel complicated and isn&#39;t always taught in design or development courses, and it&#39;s easy to see why it gets overlooked.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Accessibility? That&#39;s aria labels and screen reader stuff right?&lt;/p&gt;
&lt;p&gt;— Anonymous developer&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The biggest barriers I usually see are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lack of understanding of its importance and impact&lt;/li&gt;
&lt;li&gt;Limited knowledge, training, resources, and documentation&lt;/li&gt;
&lt;li&gt;Difficulty getting user feedback from real people with disabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Knowledge and awareness are important, but embedding accessibility requires cultural support too. Culture change takes time and effort, but when people feel engaged and passionate, the impact is huge. Tying accessibility into existing initiatives, like DEI programs, can also help build momentum.&lt;/p&gt;
&lt;h3 id=&quot;raising-awareness&quot;&gt;Raising awareness&lt;/h3&gt;
&lt;p&gt;If awareness is low, interactive and engaging activities can make a big difference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lunch and learn&lt;/strong&gt;: short sessions focused on one topic. For example, keyboard accessibility - before the session, find three websites with known keyboard issues, then challenge attendees to complete tasks using only their keyboard. Discuss what they found frustrating and why it matters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lived experience speakers&lt;/strong&gt;: invite people to share first-hand accounts of living with disabilities and how accessibility impacts daily life.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empathy labs&lt;/strong&gt;: designed to help participants understand and, to some extent, experience the challenges people with disabilities face when using digital products and the web. These labs often use personas and simulation equipment to demonstrate what it&#39;s like to navigate with different impairments or assistive technologies. While valuable for building empathy, they should never replace testing with real users who have disabilities.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even a short video can make a big impact when it comes to raising awareness. One of my favourites, which I often share in accessibility training, comes from Which Magazine and AbilityNet. In it, Adi Latif, a blind digital accessibility consultant, demonstrates &lt;a href=&quot;https://youtu.be/TUfM2IeZp54&quot;&gt;the challenges of booking airline tickets using a screen reader&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;finding-allies&quot;&gt;Finding allies&lt;/h3&gt;
&lt;p&gt;Many teams already have people who are passionate about accessibility or disability rights (often because of personal experiences), even if they aren&#39;t yet familiar with accessibility or technical requirements. Find those allies and encourage them to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Asking accessibility questions&lt;/li&gt;
&lt;li&gt;Celebrating accessibility wins&lt;/li&gt;
&lt;li&gt;Sharing user feedback&lt;/li&gt;
&lt;li&gt;Talking about accessibility in meetings, Slack/Teams channels, stand-ups, and retrospectives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Culture change doesn&#39;t happen overnight, but it starts with small, consistent actions.&lt;/p&gt;
&lt;h3 id=&quot;accessibility-champions&quot;&gt;Accessibility champions&lt;/h3&gt;
&lt;p&gt;Once you have allies, keep the momentum going by creating an accessibility champions network. This could be as simple as a monthly catch-up to share successes, challenges, and learning, or something more structured with defined learning paths. Including a senior leader in the network increases visibility, helps remove barriers, and reinforces the importance of the work.&lt;/p&gt;
&lt;p&gt;In my own work, I started a champions network with a two-hour session every other month: the first hour was training on a topic chosen by attendees, and the second was an open discussion. This mix of learning and sharing gave champions the confidence to become the go-to accessibility contacts in their teams.&lt;/p&gt;
&lt;p&gt;Resources on building a champions network:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://abilitynet.org.uk/resources/digital-accessibility/how-to-build-accessibility-champions-network-guide&quot;&gt;AbilityNet: How to build an accessibility champions network guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/intuit-design/intuits-accessibility-champions-program-b6c0b945a476&quot;&gt;Intuit&#39;s accessibility champions program&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.skyscanner.net/company-news/introducing-the-champions-of-accessibility-network&quot;&gt;The Champions of Accessibility Network&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/groups/12499821/&quot;&gt;The Champions of Accessibility Linked In group&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;education-and-resources&quot;&gt;Education and resources&lt;/h2&gt;
&lt;p&gt;Awareness is important, but people also need practical knowledge. If your team doesn&#39;t know how to build accessible things, they won&#39;t. I&#39;ve had great success tackling this through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accessibility training for new starters&lt;/li&gt;
&lt;li&gt;Role-specific training (e.g. for designers, developers, testers)&lt;/li&gt;
&lt;li&gt;Regular refresher sessions (e.g. quarterly)&lt;/li&gt;
&lt;li&gt;Internal guides and knowledge base&lt;/li&gt;
&lt;li&gt;Dedicated Slack/Teams accessiblity channel for questions, discussions and sharing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;internal-resource-center&quot;&gt;Internal resource center&lt;/h3&gt;
&lt;p&gt;An internal accessibility resource center can be incredibly powerful for sharing consistent guidance, accessible component patterns, guides and other related content. Built well, it acts as a single source of truth for your teams and provides a simpler alternative to technical documentation like WCAG.&lt;/p&gt;
&lt;p&gt;In my current role, we built an internal accessibility resource center that covers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal accessibility standards&lt;/strong&gt;: including WCAG AA, some AAA and best practices beyond WCAG&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessible UI components and patterns&lt;/strong&gt;: expected HTML, CSS, JavaScript, ARIA and keyboard interaction behaviour for components and patterns used across our platform&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Accessible content creation&lt;/strong&gt;: non-technical guidance for content creators&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing guidance&lt;/strong&gt;: covering light touch checks, full technical audits against WCAG and use of assistive technologies like screen readers, speech recognition and magnification&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relevant laws and regulations&lt;/strong&gt;: those that apply both to the organisation and its customers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you don&#39;t yet have the knowledge to create this internally, some organisations offer subscription-based accessibility knowledge bases, such as &lt;a href=&quot;https://www.deque.com/&quot;&gt;Deque&lt;/a&gt; and the &lt;a href=&quot;https://www.tpgi.com/arc-platform/knowledgebase/&quot;&gt;TPGI ARC KnowledgeBase&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once you have a solid plan for building a culture focused on accessibility it&#39;s time to look at how accessibility can be embedded into existing processes across the full development lifecycle, which we&#39;ll cover in &lt;a href=&quot;https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-3/&quot;&gt;part 3&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Building a lasting accessibility strategy: Part 1</title>
    <link href="https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-1/" />
    <updated>2025-07-10T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-1/</id>
    <content type="html">&lt;p&gt;Welcome to the first in a series of posts where I&#39;ll share my experiences of building a lasting accessibility strategy and programme at a software company whose platform is used by millions of people worldwide. Building a successful, sustainable accessibility strategy takes time, patience and a lot of hard work. There&#39;s no single &amp;quot;right&amp;quot; way to do it - what I&#39;m sharing here is what worked for me. Feel free to take the bits that resonate and adapt them to your own organisation.&lt;/p&gt;
&lt;p&gt;To keep things simple, I&#39;m going to use the word &amp;quot;website&amp;quot; as a placeholder for digital products, services, platforms and apps.&lt;/p&gt;
&lt;h2 id=&quot;laying-the-foundation&quot;&gt;Laying the foundation&lt;/h2&gt;
&lt;p&gt;Knowing where to begin with such a big task can feel overwhelming. The best place to start is with the basics: establish the why, define the goal, gather supporting data, and identify your current areas of weakness.&lt;/p&gt;
&lt;h3 id=&quot;define-the-goal&quot;&gt;Define the goal&lt;/h3&gt;
&lt;p&gt;Before diving into the current state of accessibility in your organisation, take a step back and ask: in an ideal world, what would accessibility look like here? That vision is your starting point.&lt;/p&gt;
&lt;p&gt;Your goal might be something like &amp;quot;everyone can use our website, no matter their ability or technology&amp;quot; or &amp;quot;we meet WCAG 2.2 AA across all websites.&amp;quot; From there, break the big vision into smaller, practical goals - both short and long term. For example: &amp;quot;Update our component library to meet WCAG 2.2 AA conformance.&amp;quot;&lt;/p&gt;
&lt;p&gt;Whatever the goals are, they should be clear, achievable, and something people can rally behind. If they&#39;re too vague or too ambitious, it&#39;ll be hard to make progress. These goals then become the foundation of your accessibility roadmap. Don&#39;t worry if you don&#39;t yet know every area that needs attention - that discovery will come in the next step.&lt;/p&gt;
&lt;h3 id=&quot;find-the-gaps&quot;&gt;Find the gaps&lt;/h3&gt;
&lt;p&gt;Once you have a goal in mind, look at your organisation&#39;s current accessibility practices. How well is accessibility built into everyday processes? At this stage, you don&#39;t need to dive into detailed WCAG failures or full audits. That said, if you already have an accessibility audit of your website, it can be a useful reference for spotting where processes are breaking down.&lt;/p&gt;
&lt;p&gt;The focus here should be on processes and gaps. A survey can be a great way to spark conversation, collect perspectives, and build a clearer picture of your accessibility landscape. The goal is to uncover barriers or knowledge gaps that might be holding your teams back.&lt;/p&gt;
&lt;p&gt;Example survey topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General awareness of accessibility&lt;/li&gt;
&lt;li&gt;How accessibility is prioritised within their role and team&lt;/li&gt;
&lt;li&gt;Existing accessibility processes or considerations in their team&lt;/li&gt;
&lt;li&gt;Understanding of relevant laws, regulations and directives - e.g. for UK public sector bodies: Public Sector Bodies Accessibility Regulations (PSBAR); in the US: ADA Title II or Section 508; in the EU: European Accessibility Act (EAA)&lt;/li&gt;
&lt;li&gt;Awareness of the user impact of accessiblility&lt;/li&gt;
&lt;li&gt;How their role can directly or indirectly affect accessibility&lt;/li&gt;
&lt;li&gt;Understanding of technical guidelines such as WCAG 2.2&lt;/li&gt;
&lt;li&gt;Knowledge of accessibility testing and assistive technologies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Send the survey to as many people as possible across different roles - including frontline contributors like designers, developers, and testers, as well as those who influence priorities, such as product owners, project managers, and senior leaders. Follow up with conversations to unpack the findings. For larger teams, consider tailoring survey questions to specific roles or departments.&lt;/p&gt;
&lt;h3 id=&quot;gather-useful-data&quot;&gt;Gather useful data&lt;/h3&gt;
&lt;p&gt;Solid data can help counter common misconceptions, such as the dreaded &amp;quot;Disabled people don&#39;t use our website&amp;quot;, and strengthens the case for investment in accessibility. It also helps get leadership on board by showing the scale and impact.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Around 1 in 4 people in both the UK and US have some form of disability. That&#39;s not a niche - it&#39;s a significant share of your audience.&lt;/li&gt;
&lt;li&gt;Globally, 1.3 billion people experience significant disability (16% of the world&#39;s population, according to the WHO).&lt;/li&gt;
&lt;li&gt;In the UK, disabled households represent an estimated £274 billion in annual spending power (often called the Purple Pound). In the US, it&#39;s over $490 billion.&lt;/li&gt;
&lt;li&gt;WebAIM&#39;s 2024 study of the top 1 million websites found that 96% had detectable WCAG failures on their homepage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Useful sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.scope.org.uk/media/disability-facts-figures&quot;&gt;Scope disability facts and figures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ons.gov.uk/peoplepopulationandcommunity/healthandsocialcare/disability&quot;&gt;Office for National Statistics Census 2021&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.gov.uk/government/statistics/disability-accessibility-and-blue-badge-scheme-statistics-2023-to-2024/disability-accessibility-and-blue-badge-statistics-england-2023-to-2024#:~:text=In%20the%20year%20ending%20March,unchanged%20from%20the%20previous%20year.&quot;&gt;Gov.uk disability, accessibility and blue badge statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wearepurple.org.uk/the-purple-pound-infographic/&quot;&gt;The Purple pound infographic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cdc.gov/disability-and-health/articles-documents/disability-impacts-all-of-us-infographic.html&quot;&gt;US CDC Disability and Health&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/projects/million/&quot;&gt;The WebAIM Million&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://info.usablenet.com/ada-website-compliance-lawsuit-tracker&quot;&gt;UsableNet accessibility lawsuit tracker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;building-a-plan&quot;&gt;Building a plan&lt;/h2&gt;
&lt;p&gt;Once you know where you stand and where the gaps are, the next step is to create a plan to address them. This usually includes a mix of resources, training, and ongoing support, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal resources like accessibility guides or knowledge bases&lt;/li&gt;
&lt;li&gt;Awareness-building activities (lunch-and-learns, empathy labs, talks from lived-experience speakers)&lt;/li&gt;
&lt;li&gt;General accessibility awareness training&lt;/li&gt;
&lt;li&gt;Role specific training for designers, developers, testers and other relevant groups&lt;/li&gt;
&lt;li&gt;Periodic refresher training&lt;/li&gt;
&lt;li&gt;An internal network of accessibility champions&lt;/li&gt;
&lt;li&gt;Dedicated accessibility Slack/Teams channels&lt;/li&gt;
&lt;li&gt;A designated accessibility lead or team&lt;/li&gt;
&lt;li&gt;Testing, auditing and monitoring&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;accessibility-maturity-models&quot;&gt;Accessibility maturity models&lt;/h2&gt;
&lt;p&gt;Accessibility maturity models can be useful throughout the journey of creating an effective accessibility strategy.&lt;/p&gt;
&lt;p&gt;Rather than focusing only on technical compliance (e.g. whether your site meets WCAG 2.2 AA), they provide a structured way to evaluate how well accessibility is embedded across your organisation—through leadership, culture, training, processes, and technology.&lt;/p&gt;
&lt;p&gt;They usually break things down into categories and stages of maturity, from ad-hoc to developing, established, and optimised. They help you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get a baseline view of where you are today&lt;/li&gt;
&lt;li&gt;Identify gaps and areas to improve&lt;/li&gt;
&lt;li&gt;Set realistic goals for growth&lt;/li&gt;
&lt;li&gt;Track progress over time&lt;/li&gt;
&lt;li&gt;Communicate achievements to leadership in a clear, strategic way&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two examples worth looking at are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.w3.org/TR/maturity-model/&quot;&gt;W3C Accessibility Maturity Model&lt;/a&gt;&lt;/strong&gt; – A high-level framework with seven dimensions (including communications, knowledge, and culture) measured across stages from Inactive through to Optimise. It&#39;s designed to help organisations of all sizes embed accessibility into everyday operations and align with governance and compliance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://abilitynet.org.uk/resources/digital-accessibility/digital-accessibility-maturity-model&quot;&gt;AbilityNet&#39;s Digital Accessibility Maturity Model (DAMM)&lt;/a&gt;&lt;/strong&gt; – A more practical toolkit designed to help organisations carry out structured assessments, set future goals, and create a roadmap of improvements. DAMM is available in a general form and a tailored version for higher education, making it adaptable to different contexts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The big benefit of maturity models is that they help shift thinking away from one-off fixes toward long-term cultural change.&lt;/p&gt;
&lt;h2 id=&quot;existing-issues&quot;&gt;Existing issues&lt;/h2&gt;
&lt;p&gt;At this stage, you probably won&#39;t have a full picture of all the accessibility issues in your website, and that&#39;s okay. Many organisations fall into the trap of starting with full audits, which can lead to endless cycles of technical fixes without addressing the root causes: knowledge gaps and culture.&lt;/p&gt;
&lt;p&gt;Audits and testing are important, but right now the priority is laying the foundations that support ongoing accessibility. Light-touch audits, however, can still be useful to highlight a few issues and provide tangible examples that help build the case with leadership.&lt;/p&gt;
&lt;h2 id=&quot;leadership-buy-in&quot;&gt;Leadership buy-in&lt;/h2&gt;
&lt;p&gt;Once you&#39;ve identified the gaps, created a clear plan, and gathered supporting data, it&#39;s time to get leadership on board.&lt;/p&gt;
&lt;p&gt;Without strong support from the top, accessibility efforts often stall. Leadership buy-in sets expectations, signals commitment, and helps embed accessibility into everyday practice.&lt;/p&gt;
&lt;p&gt;When approaching leadership, come prepared with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A clear plan to addressing gaps&lt;/li&gt;
&lt;li&gt;A list of needs (budget, visibility, endorsement, barrier removal)&lt;/li&gt;
&lt;li&gt;A strong business case (statistics, user stories, competitive benchmarks)&lt;/li&gt;
&lt;li&gt;A reminder: accessibility is both the right thing to do and the smart thing to do&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-why&quot;&gt;The why&lt;/h3&gt;
&lt;p&gt;Remember, many leaders won&#39;t be deeply familiar with accessibility. Keep it simple and cover the essentials:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What accessibility is and why it matters&lt;/li&gt;
&lt;li&gt;Statistics: e.g. 1 in 4 people in the UK have a disability - meaning almost every website serves disabled users&lt;/li&gt;
&lt;li&gt;Benefits for everyone: permanent, temporary, and situational impairments affect all of us&lt;/li&gt;
&lt;li&gt;User feedback: share real stories from disabled users who encountered barriers&lt;/li&gt;
&lt;li&gt;Benchmarking data: if relevant, e.g. &lt;a href=&quot;https://index.silktide.com/&quot;&gt;Silktide index&lt;/a&gt; rankings&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-business-case&quot;&gt;The business case&lt;/h3&gt;
&lt;p&gt;Highlight the advantages, the risks of inaction, and the broader impact:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Better customer experiences&lt;/strong&gt;: accessible websites and content are often faster, simpler, and easier to use for all users - not just disabled people. Everyone benefits from clearer design and smoother interactions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stronger loyalty&lt;/strong&gt;: when organisations take accessibility seriously, they earn the trust of disabled customers. Research shows that disabled users tends to be more loyal and more likely to recommend businesses that truly include them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced risks&lt;/strong&gt;: the cost of getting accessibility wrong is rising. Poor accessibility can lead to frustrated users, negative press, and even legal action. Laws and running like the UK&#39;s Public Sector Bodies Accessibility Regulations (PSBAR), the US&#39;s ADA, and the European Accessibility Act (EAA) require compliance with standards like WCAG.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Financial aspect&lt;/strong&gt;: excluding disabled customers isn&#39;t just unfair, it&#39;s expensive. UK businesses lose an estimated £2 billion every month by not meeting their needs (&lt;a href=&quot;https://wearepurple.org.uk/the-purple-pound-infographic/&quot;&gt;The Purple Pound&lt;/a&gt;). On top of that, it&#39;s much cheaper to build accessibility in from the start - IBM found that fixing issues after launch can cost four to five times more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Future-ready design&lt;/strong&gt;: Accessibility doesn&#39;t just help people - it also helps technology. As organisations invest in AI and automation, accessible content is easier for machines to understand and work with, making your digital services more future-proof.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;alignments-with-leadership-goals&quot;&gt;Alignments with leadership goals&lt;/h3&gt;
&lt;p&gt;Show how accessibility supports your organisation&#39;s existing values and priorities, such as &amp;quot;putting the user first&amp;quot; or DEI (Diversity, Equity, and Inclusion).&lt;/p&gt;
&lt;h3 id=&quot;be-clear-about-what-you-need&quot;&gt;Be clear about what you need&lt;/h3&gt;
&lt;p&gt;Finally, set out the commitments required, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Budget for training, resources, or dedicated accessibility roles&lt;/li&gt;
&lt;li&gt;Ongoing support from senior leadership&lt;/li&gt;
&lt;li&gt;Visible endorsement in communications, decision-making and cultural change&lt;/li&gt;
&lt;li&gt;Inclusion of accessibility in KPIs, OKRs, roadmaps, and review processes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you have leadership buy-in and a solid plan it&#39;s time to start building the culture, which is covered in &lt;a href=&quot;https://www.jamesjacobs.me/blog/building-a-lasting-accessibility-strategy-part-2/&quot;&gt;part 2&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Embedding manual accessibility testing in frontend development teams</title>
    <link href="https://www.jamesjacobs.me/blog/embedding-manual-accessibility-testing-in-frontend-development-teams/" />
    <updated>2025-06-02T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/embedding-manual-accessibility-testing-in-frontend-development-teams/</id>
    <content type="html">&lt;p&gt;Often when discussing accessibility testing, the focus is on technical accessibility audits, testing processes or the requirements of individual WCAG success criteria. While these things are important, they are require a certain level of technical knowledge, often from people whose day to day role is accessibility testing. There are many parts to an effective accessibility strategy, but one sometimes overlooked part is having your frontend developers, not just those working on design systems and component libraries, directly involved in accessibility testing as part of day to day features development and bug fixes.&lt;/p&gt;
&lt;p&gt;Involving developers in accessibility has several benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;increases the teams level of accessibility awareness and knowledge&lt;/li&gt;
&lt;li&gt;catches issues or prevents them outright before the testing phase&lt;/li&gt;
&lt;li&gt;reduces testing time&lt;/li&gt;
&lt;li&gt;ties in with a &amp;quot;shift-left&amp;quot; or &amp;quot;accessibility-first&amp;quot; approach&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are steps I use when working with frontend teams.&lt;/p&gt;
&lt;h2 id=&quot;first-steps&quot;&gt;First steps&lt;/h2&gt;
&lt;h3 id=&quot;define-basic-manual-tests&quot;&gt;Define basic manual tests&lt;/h3&gt;
&lt;p&gt;These are basic tests that can be documented in a checklist and require little accessibility knowledge. They should be quick and easy to perform.&lt;/p&gt;
&lt;p&gt;Example tests:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keyboard&lt;/strong&gt;: using the keyboard only, tab through the page, making sure all interactive elements can be navigated to and interacted with solely via the keyboard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus indicator&lt;/strong&gt;: check the keyboard focus indicator is visible against all background and does not disappear, or get completely hidden by other elements, at any time when tabbing through the page or interacting with elements via the keyboard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus order&lt;/strong&gt;: check the order that items gain keyboard focus is logical&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focus traps&lt;/strong&gt;: check keyboard focus doesn&#39;t get trapped within an area of page without a clear method of escaping the trap&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content on hover/focus&lt;/strong&gt;: check any content displayed on hover or keyboard focus can be hovered over, dismissed without moving the pointer and doesn&#39;t disappear after a few seconds&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See my &lt;a href=&quot;https://www.jamesjacobs.me/guides/checklists/basic-accessibility-tests-for-developers/&quot;&gt;basic accessibility tests for developers&lt;/a&gt; guide for more suggestions.&lt;/p&gt;
&lt;h3 id=&quot;use-an-accessibility-browser-extension&quot;&gt;Use an accessibility browser extension&lt;/h3&gt;
&lt;p&gt;Install an accessibility focused browser extension such as &lt;a href=&quot;https://www.deque.com/axe/browser-extensions/&quot;&gt;AXE&lt;/a&gt; or &lt;a href=&quot;https://www.tpgi.com/arc-platform/arc-toolkit/&quot;&gt;ARC Toolkit&lt;/a&gt;. These are quick and easy to run (typically one click) and generally provide enough detail to identify issues and the related fixes.&lt;/p&gt;
&lt;h3 id=&quot;use-an-accessibility-linter&quot;&gt;Use an accessibility linter&lt;/h3&gt;
&lt;p&gt;Linters are commonly used by developers to analyse and identify code issues. Linting code is very common for development teams wanting to ensure code meets team standards and quality. Many configurable accessibility focused linters also exist for different languages and frameworks that can catch potential issues at the code stage, for example &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter&quot;&gt;AXE Accessibility Linter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most linters include a configuration file that can be committed to a project and used by all developers involved, providing a uniform set of checks. This requires little setup and fits in easily with what is likely already a standard team process.&lt;/p&gt;
&lt;h3 id=&quot;basic-screen-reader-tests&quot;&gt;Basic screen reader tests&lt;/h3&gt;
&lt;p&gt;Check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All interactive elements have descriptive labels (accessible names)&lt;/li&gt;
&lt;li&gt;No parts of the page is skipped by the screen reader&lt;/li&gt;
&lt;li&gt;Images have meaningful alt text (unless they are purely decorative)&lt;/li&gt;
&lt;li&gt;The visual order of the page is the same or similar to the reading order&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are basic checks. I cover more indepth tests in my &lt;a href=&quot;https://www.jamesjacobs.me/guides/testing/how-to-test-with-a-screen-reader/&quot;&gt;how to test with a screen reader&lt;/a&gt; guide. Full screen reader testing should be handled by trained testers.&lt;/p&gt;
&lt;p&gt;Developers using Windows can use the free, open source &lt;a href=&quot;https://www.nvaccess.org/download/&quot;&gt;NVDA screen reader&lt;/a&gt;. &lt;a href=&quot;https://support.apple.com/en-gb/guide/voiceover/welcome/mac&quot;&gt;VoiceOver&lt;/a&gt; comes preinstalled on macOS.&lt;/p&gt;
&lt;section class=&quot;callout&quot;&gt;
	&lt;h4 class=&quot;callout__heading&quot; id=&quot;tip-run-a-workshop&quot;&gt;Tip: run a workshop&lt;/h4&gt;
	&lt;div class=&quot;callout__content&quot;&gt;&lt;p&gt;Run a &amp;quot;screen reader basics&amp;quot; workshop with the team before getting them involved with screen reader testing. Using a screen reader for the first time can be confusing as there is little to no UI.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;h3 id=&quot;consider-accessibility-in-code-reviews&quot;&gt;Consider accessibility in code reviews&lt;/h3&gt;
&lt;p&gt;Code reviews often focus on standards, patterns and potential bugs. Add accessibility to the list of considerations. This works well if accessibility is included in your internal coding standards.&lt;/p&gt;
&lt;p&gt;Example checks could include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;enforcing semantic HTML e.g. using &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; rather than &lt;code&gt;&amp;lt;div role=&amp;quot;button&amp;quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ensuring correct use of ARIA e.g. flagging the use of &lt;code&gt;aria-label&lt;/code&gt; on a generic element such as &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ensuring accessibility tests have been written for a new feature&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does require that developers have some level of accessibility knowledge. Role specific training can help with this.&lt;/p&gt;
&lt;h3 id=&quot;build-checks-into-acceptance-criteria&quot;&gt;Build checks into acceptance criteria&lt;/h3&gt;
&lt;p&gt;Most developer teams have either acceptance criteria or a definition of done. Incorporate these checks to set expectations and make it a part of everyday processes.&lt;/p&gt;
&lt;h2 id=&quot;longer-term-improvements&quot;&gt;Longer-term improvements&lt;/h2&gt;
&lt;h3 id=&quot;provide-accessibility-resources&quot;&gt;Provide accessibility resources&lt;/h3&gt;
&lt;p&gt;Having a centralised accessibility knowledge base that provide guides, patterns and component examples for developers to consult can go a long way into both increasing team accessibility knowledge and confidence while also reducing the amount of accessibility issues that make it into the test phase.&lt;/p&gt;
&lt;h3 id=&quot;training&quot;&gt;Training&lt;/h3&gt;
&lt;p&gt;In my current role, I regularly run accessibility training for developers. Both &amp;quot;Introduction to web accessibility&amp;quot; training sessions as part of new starter inductions and periodic role specific training for designers, developers and testers. We run the role specific training sessions at least twice a year to help in maintaining and refresh knowledge. If you don&#39;t have an internal accessibility lead or specialist that can run these for you, consider bringing in external trainers. If you&#39;re in the UK I recommend &lt;a href=&quot;https://abilitynet.org.uk/&quot;&gt;AbilityNet&lt;/a&gt; and &lt;a href=&quot;https://www.accessibility-services.co.uk/&quot;&gt;Shaw Trust Accessibility Services&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;monitor-issues-found-at-test&quot;&gt;Monitor issues found at test&lt;/h3&gt;
&lt;p&gt;Actively monitor the accessibility issues found in the test phase and feed this back to developers so that, where appropriate, developer tests can be expanded to include any common issues.&lt;/p&gt;
&lt;h3 id=&quot;ci-cd-pipeline&quot;&gt;CI/CD pipeline&lt;/h3&gt;
&lt;p&gt;Many development teams use some form of Continuous Integration (CI) and Continuous Delivery/Deployment (CD). These typically run tests (unit, regression, integration etc) as part of the process. Automated accessibility tests can also be run at this stage. Various tools exists such as &lt;a href=&quot;https://www.npmjs.com/package/cypress-axe&quot;&gt;Cypress-AXE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In addition to other tests, have developers write accessibility tests that run at build time, as part of feature/story development and bug fixes.&lt;/p&gt;
&lt;h3 id=&quot;have-a-dedicated-accessibility-champion-on-the-team&quot;&gt;Have a dedicated accessibility champion on the team&lt;/h3&gt;
&lt;p&gt;Accessibility champions promote accessibility and supports others on the team. They advocate for and advise on accessibility. In addition to any internal knowledge base or accessibility team, they can serve as the initial &amp;quot;go-to&amp;quot; for accessibility related advice and knowledge.&lt;/p&gt;
&lt;p&gt;Creating and maintaining a network of accessibility champions across your organisation is a big subject which I&#39;ll cover in another post.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Hello World</title>
    <link href="https://www.jamesjacobs.me/blog/hello-world/" />
    <updated>2025-05-02T00:00:00Z</updated>
    <id>https://www.jamesjacobs.me/blog/hello-world/</id>
    <content type="html">&lt;p&gt;For a long time I&#39;ve been wanting to get back into regular blogging. Life often gets busy - work, family, children etc can leave little time for other things. Back in the early 2010&#39;s I used to blog on my exploration into developing &amp;quot;hybrid&amp;quot; mobile apps, I then had a spate of posts on &lt;a href=&quot;https://medium.com/pulsar/modern-enterprise-ui-design-part-1-tables-ad8ee1b9feb&quot;&gt;Medium&lt;/a&gt; - both of which I thoroughly enjoyed writing. These days my primary focus is digital accessibility. So, going forward, this site will act as a dumping ground for my thoughts, ideas and discoveries as well as offer resources to people starting out in digital accessibility. It&#39;s also going to be a creative playground, allowing me to experiment with different technologies - at the moment, this site is built with &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In ~2008, when I first started learning about web accessibility, I found it difficult to find authoritive technical guides and documented patterns. Many of the resources and articles available were contradictory and typically focused on the basics, such as colour contrast. Many more focused on advocating for accessibility (which is 100% important) but as I was involved in building design systems, component libraries and enterprise-level UIs I wanted technical code-focused examples. Finding tried and tested solutions and examples of certain patterns was challenging.&lt;/p&gt;
&lt;p&gt;With that in mind, I intend to add regular posts and guides on digital accessibility - with the aim of building up a resource for people new to accessibility.&lt;/p&gt;
&lt;p&gt;At the time of writing (a sunny but cold day in January 2025), the web accessibility community has come on leaps and bounds with some amazing minds putting out regular, highly detailed content (which I aspire to do).&lt;/p&gt;
&lt;p&gt;Here&#39;s a small list of links to some of the, in my opinion, best accessibility related content creators and professionals on the web:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://adrianroselli.com/&quot;&gt;Adrian Roselli&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://html5accessibility.com/stuff/&quot;&gt;Steve Faulkner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yatil.net/blog&quot;&gt;Eric Eggert&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sarasoueidan.com/&quot;&gt;Sara Soueidan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tpgi.com/technical/&quot;&gt;TPGi Technical blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tetralogical.com/blog/&quot;&gt;Tetralogical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;and many others can be found on &lt;a href=&quot;https://a11y-webring.club/&quot;&gt;a11y-webring.club&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, here&#39;s some resources I&#39;d encourage everyone interested in web accessibility to become familiar with (more on these in another post!):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/quickref/?versions=2.2&quot;&gt;WCAG 2.2 quick reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/roles/&quot;&gt;Web Accessibility Initiative (WAI) resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://inclusivedesignprinciples.info/&quot;&gt;The Inclusive Design Principles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dequeuniversity.com/screenreaders/&quot;&gt;Deques screen reader keyboard shortcuts guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/&quot;&gt;ARIA Authoring Practices Guide (APG)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/examples/main.html&quot;&gt;ARIA Landmark examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content>
  </entry>
</feed>