← All Carousels

React Slick

Accessibility Fixes Applied

  • tabindex management for hidden slides (library traps focus with aria-hidden)

Summary

Accessibility Analysis

Score: 57.4% — 35/61 accessibility issues resolved Median resolution time: 558.8 days Oldest unresolved issue: 3,178 days (8+ years)

Open Issues (26)


Our Workaround

React Slick sets aria-hidden="true" on inactive slides but doesn’t manage tabindex on focusable elements inside. This creates a focus trap.

useEffect(() => {
  if (!containerRef.current) return
  const slideElements = containerRef.current.querySelectorAll('.slick-slide')
  slideElements.forEach((slide) => {
    const focusables = slide.querySelectorAll('a, button, input, select, textarea')
    const isActive = slide.classList.contains('slick-active')
    focusables.forEach((el) => {
      el.setAttribute('tabindex', isActive ? '0' : '-1')
    })
  })
}, [currentSlide])

Custom Controls

Built-in dots use <li> with role="button" (invalid ARIA). Use custom buttons:

<Slider ref={sliderRef} dots={false} arrows={false}>
  {/* slides */}
</Slider>

{/* Custom controls */}
<button onClick={() => sliderRef.current?.slickPrev()}>Previous</button>
<button onClick={() => sliderRef.current?.slickNext()}>Next</button>