10 accessibility mistakes on the new Whitehouse website

I thought it would be interesting to see how the new Whitehouse website did on accessibility, so here are a few places where I think it falls short.

Full-page screenshot of the Whitehouse homepage.

Contents

Auto-playing full-screen video

The Whitehouse website has a full-window video auto-play when you first visit the site (edit 18 Feb 2025 - it looks like this may now have been removed).

Having a large video auto-play on page load is an issue for some users - we can’t assume users will know how to set a preference so we should always avoid this kind of addition.

It is also not great for first impressions as on slower connections it can stumble. At 8.4MB it is also a heavy load for users on data limits. Disabled users in general have lower disposable incomes due to employment issues and additional expenses, so this is an accessibility issue.

On the plus side at least the sound is muted and the user can dismiss the video immediately (although even doing that allows 4.2MB of video download). On 3G I ran out of patience before the video even loaded.

Thankfully you only see it on first visit as a local storage flag is set.

Not respecting user preferences for reduced motion

Related to the first point, the website does not respect where a user has asked for reduced motion in their settings.

Four options in a settings panel. One of them states reduce motion and has a toggle button showing as active alongside.
MacOS settings for Reduce Motion

The auto-playing video, the heavy use of zoom effects in hover states and animation of the carousel on smaller viewports can all trigger issues for users.

There are simple mechanisms for websites to check for this setting and adjust the interactions based on it.

Alt text

Missing alt text

There are a couple of places where alt text has been left blank. For example the 47th president logo and adjacent signature. These could have been given explanatory descriptions as they do mean something.

The presidential seal with the number 47 below it. Alongside is a signature.
The presidential seal and number indicating this is the 47th president, alongside the president’s signature.

Repetition caused by alt text

Elsewhere alt text has been used and created repetition where a better pattern would have prevented it, such as the 3 links to "White House", "Camp David" and "Air Force One" towards the bottom of the page:

Three images each with text above. The text reads The White House, Camp David, and Air Force One
The White House links

Here the images are the links and the text above is unlinked. The images each have alt text which repeats the text above. So a screen-reader will get repeated content as they move through - it will be announced something like this:

“Camp David, Camp David link”

A better solution would be to use a card pattern which would use the text as the link and add a click-handler to include the image. This would allow users to click the text (as well as the image) and also allow us to add proper descriptive alt text to the images. For example:

<div class="wh-card"> /* js click handler added to this container */
  <a href="...">The White House</a>  
  <img src="wh.webp" alt="Exterior of the White House on a summer's day" />
</div>

Overly basic alt text

Finally on images, the two large images of Trump have very basic alt text of “Donald J Trump“ which whilst true does not put across any of the emotion I am sure the designers are intending to convey with those images.

Not updating ARIA

The search button in the top right has an ARIA attribute applied to indicate that it triggers something which is currently closed:

The text Search alongside an icon of a magnifying glass.
The button which opens the search form in a dialog.
<button aria-expanded="false" title="Open search">Search</button>

But when the button is pressed the ARIA is not updated which then conflicts with the information the user is now getting from the accessible name (which has been updated):

​​<button aria-expanded="false" title="Close search">Close</button>

Oddly the team managed to do this correctly with the menu dialog.

Keyboard

When the user opens the menu dialog keyboard users are not restricted to the modal. A keyboard user can tab to the page behind the dialog which can mean their focus becomes obscured.

Screen-readers

Screen-reader users don't fair much better as once the modal has opened the close button is unreachable as it sits outside the dialog bounds despite being visible.

We can see the issue when we look at the elements list for NVDA and see the buttons are there when the dialog is closed:

NVDA element list showing the Menu and search buttons which can also be seen in the page behind.
With the modal closed NVDAs element viewer lists the search and menu buttons

But the same elements are missing when the dialog is open, despite being visible:

NVDA element list showing the menu and search buttons are not visible to the screen-reader despite still being visible on the page behind.
Now the modal is open the button list is empty but the buttons are visible on the page

Fortunately the dialog has been hooked up to be closed via the Esc key so both users can close it if they are aware of the shortcut.

These issues are most likely a result of using role=”dialog” instead of the dialog element and not thinking through the impact of doing this. The dialog element brings with it some functionality, such as making the rest of the page inert and trapping focus. Using role=”dialog” is the equivalent of using role=”button on a div - you need to bring the functionality yourself.

Missing accessible name

Using a role=”modal” also requires that you give your modal an accessible name, for example using aria-label. This is not present here so adds another issue.

Headings

It is important that headings are correctly applied as they are one of the main navigation methods for screen-reader users on longer pages. They also give an indication of grouping of content and provide an important introduction to the content the user may find next.

Missing semantics

On the homepage "The Administration" text which introduces the photos of the president and others is just marked up as plain text:

Text which reads The Administration above a set of images. The size of the text suggests it is a heading
The text appears to be a heading but it is not programmatically set as such.
<div class="wp-block-whitehouse-front-administration__headline">
  The Administration
</div>

So if we take a look at the HeadingsMap browser extension (which lists all headings on a page and constructs a tree diagram) we can see that the first heading we will encounter after the h1 is actually below this group:

A tree structure of the headings on the page.
The Administration should present as a heading between the h1 of “America is Back” and the h2 of “Our priorities“

Non-unique headings

Another issues is that we can also see from this list that despite the h2 further down the page visually saying "About the White House":

A section heading which says About the White House. The word about is smaller and sits just above the other words.

This is not what is communicated as the "About" is actually sitting outside the h2:

<p>About</p>
<h2>The White house</h2>

This then means we have two headings adjacent to each other with the same content, but with different levels and with different meanings. The word “about” needs to be included in that h2 - something which should happen even if it didn’t cause the non-unique error.

While we are looking at the Administration section, the links for the 4 items are unreachable for both keyboard users and screen-reader users. This is also the case for the "Executive Actions" and "News" links above. This constitutes the majority of the content on the website.

A grid of 6 images.
None of these sections can be reached by keyboard or screen-reader.

Looking at the code it looks like there has been a decision made to not wrap the link element around any content, but instead use CSS to position it above the content:

<a href=".../jd-vance/" aria-hidden="true" tabindex="-1"></a>
<img src=".../jdvance.jpg" alt="" />
<p>J D Vance</p>

The lack of accessible name on the link is obviously one concern, but the link also has an aria-hidden attribute (which hides it from screen-readers) and a tabindex="-1" attribute which removes the link from the focus order. Both are very conscious decisions and suggest they are attempting to implement a card pattern.

The card pattern would normally have included making the main call-to-action (in this case the name) a link and letting keyboard and screen-reader users discover that and then have some positioned area as a mouse/touch option covering the whole card.

Looking at a fix

So the first step in fixing this would be to link up the main text for each item:

<a href=".../jd-vance/">J D Vance</a>

This works, however we still have our odd, heavily attributed and nameless link. Adding aria-hidden to a control such as a link is never a good idea as it causes a slew of odd behaviours.

For example if we just left it like this, then screen-readers suddenly start picking up both links (the initial one is now showing as the document name from the href):

The card component showing two links in the NVDA element list, one visible and one not. The one which is not visible has taken the accessible name form the href of the link.
NVDA’s element list showing how the addition of the new link exposes the first.

For this to work as we want we need the card link to be removed and instead replaced by a click handler on the container. This is ok as without js we still have the new link to fall back on.

<div class="container"> /* add click handler to this using the link href as target */
  <img src=".../jdvance.jpg" alt="" /><a href=".../jd-vance/">J D Vance</a>
</div>

We can improve this further by swapping the position of the image and link and adding alt text to the image. We could even include the secondary text as part of the link.

But at least now the content will be usable!

In short, never use aria-hidden on interactive things.

Use of title attribute

The title attribute has been used a lot on images and controls across the site. The title is problematic because it has a dual nature. It is really an accessible name source of last resort - so if there is no 'standard' accessible name provided (via content, alt text, labels or aria) then this would be used. However where an accessible name is provided the title is demoted to an accessible description, which means it will be read out after the given accessible name.

For example, the White House logo at the top of the screen:

Header logo showing a line drawing of the White House above the text The White House President Donald J Trump
Chrome developer tools accessibility panel showing the accessible name computation for the link.
We can see in devTools how the title was contributing to the accessible name of the link until it was overwritten by the link contents. This changes the title to be the accessible Description.
<a href="..." title="The White House">
  <img src="..." alt="" />
  <span>The White House</span>
  <span>President Donald J Trump</span>
</a>

Will be read out by a screen-reader as

"The White House President Donald J Trump The White House"

Whilst not a major issue this repetition can become confusing and is unnecessary.

Poor contrast

It wouldn't be a list of accessibility issues without at least one for poor contrast. While the text overlaid on the images on the homepage could potentially cause issues, I am going to look at one of the subpages for a more clear-cut example:

Four navigation links on a dark background. One is white whilst the others are darker.
The links as they currently stand

Here we can see the sub navigation has poor contrast with the exception of the currently active page. The contrast here is 4:1 which is below that required for AA conformance.

When the contrast is so close to passing it is not going to require a full re-think of colour choices. Here the non-selected links are set using a 0.42 opacity of the white colour. If we tweak it to 0.62 opacity instead:

The same links but the darker links are slightly brighter
With the tweak to the opacity the non-selected links are easier to read.

We now get a 7.4:1 contrast which is a pass. However we are left with another issue.

The original 0.42 opacity gave us exactly a 4.5:1 contrast with the selected option and increasing the opacity has made this worse. I think here we should be looking at adding an extra visual indicator for the current page, such as the underline used on other pages:

Three navigation links, all the same colour. One has an underline suggesting it is selected.

Missing programmatic information

Another issue with this navigation is that whilst it is showing the current page visually through the colour change, this is not being reflected programmatically.

This is simply done through the use of aria-current=”page” on the currently active link:

 <a 
  class="is-current" 
  href="https://www.whitehouse.gov/presidential-actions/" 
  aria-current="page">
    Presidential Actions
  </a>

We could even use this as a hook for CSS to help us improve our accessibility right at the start and get rid of the is-current CSS class entirely:

[aria-current]{
  ...
}

You could try to argue that the h1 does this job (and I suspect this is what the thought process was with this as the aria-current attribute is used elsewhere), but we cannot assume screen-reader users navigate sequentially or understand the relationship between these two components.

Other issues

These are just the main issues which jumped out at me after a quick look and only picking up a screen-reader. But there are other issues, such as poor error messages on the email form (along with a lack of error announcement for screen-reader users) and missing autocomplete on the same (although this is likely not to be an issue as most broswers will do a decent job of figuring this out in this instance). This administration has also removed the Spanish language version of the site, which in one move has made accessing information more difficult for a huge group of users.

This does show however that just a few simple checks can expose some quite major accessibility issues.

Verdict

I think it is good to say what a team have done well, so here are a few accessibility areas where they did ok too:

The dialogs are dismissable with the Esc key - without this the other issues would be more serious.

Landmarks are being used which will help screen-reader users. They have used several nav elements and whilst the footer ones do not have accessible names, where they have been using in-page such as for pagination controls, these have been given meaningful names.

Skip to content link is present and most importantly actually works, taking keyboard users beyond the main navigation.

In the main the team have used semantic elements. This goes a long way to improving accessibility, although they have shot themselves in the foot a couple of times.

ARIA has been used but not massively overused. Yes they have made some mistakes but you can see the thought process and adding some testing will help with these.

This goes to show that regardless of how your stakeholders view accessibility, there are accessibility wins which you can bring to a project just as part of doing your job.