Splidejs / splide

Splide is a lightweight, flexible and accessible slider/carousel written in TypeScript. No dependencies, no Lighthouse errors.
https://splidejs.com
MIT License
4.89k stars 424 forks source link

Link focus issue on "destroyed" slider #1307

Open 2ndkauboy opened 5 months ago

2ndkauboy commented 5 months ago

Checks

Version

v4.1.3

Description

Splide has an option to "destory" the slider on a certain breakpoint. This works fairly well, but it introduces an accessibility issue. When the slides contain links, they are no longer focusable, since Splide sets a tabindex="-1" on every "inactive slide". Since in the "destroy" state, all slides are visible and therefore "active", this tabindex="-1" and other accessibility properties should be removed (e.g. aria-hidden="true" does get removed correctly) .

Reproduction Link

https://codepen.io/2ndkauboy/pen/VwOvWpG

Steps to Reproduce

  1. Create a slider with links inside the slides.
  2. Set the option to destroy the slider at a certain breakpoint.
  3. Test keyboard navigation of links inside the slides.

Expected Behaviour

Links (and other focusable elements) inside the slider should be focusable when "destroyed".

2ndkauboy commented 5 months ago

I came up with a temporary fix for now:

splide.on("destroy", () => {
    for ( let slide of splide.Components.Elements.list.children ){
        for ( let focusableNode of slide.querySelectorAll(splide.options.focusableNodes)) {
            focusableNode.setAttribute('tabindex', '');
        }
    }
});

You can test it here: https://codepen.io/2ndkauboy/pen/wvbKqeJ

But this should really be solved in the code itself.