Drag-&-Drop компоненты для слепых пользователей? Вы шутите?

Сергей Кригер

Drag-&-Drop компоненты
для слепых пользователей?
Вы шутите?

Сергей Кригер

@_sergeikriger

SinnerSchrader logo.

Примеры использования drag and drop

Trello board. Gmail. Google Keep. Aviasales.

Слепые пользователи

Круглые очки.

Слайдер

Aviasales screenshot

Aviasales screenshot.

Слайдер

Стили для слайдера

::-webkit-slider-runnable-track
::-webkit-slider-thumb
::-moz-range-track
::-moz-range-thumb
::-ms-track
::-ms-thumb
::-ms-fill-lower
::-ms-fill-upper

danielstern.ca/range.css

Стилизованный слайдер

Aviasales dev tools screenshot

Aviasales dev tools.

События drag and drop

position: absolute;

События drag and drop

mousedown mousemove mouseup

События drag and drop на мобильном

touchstart touchmove touchend

Слайдер

ARIA

        <div class="thumb" tabindex="0"
          role="slider"
          aria-label="Слайдер"
          aria-valuenow="5"
          aria-valuemin="0"
          aria-valuemax="10"
        ></div>
      

Доступный слайдер

Сортировка

Google Keep screenshot

Google Keep screenshot.

Список дел

Пустой список.

Аттрибут draggable

draggable="true"

Элементы с аттрибутом draggable по умолчанию

<img> <a>  выбранный текст

Как работает drag end drop

draggable

Картинка.

    drop-zone

      Перенос данных

                draggable.addEventListener("dragstart", e => {
                  e.dataTransfer.setData("text/plain", e.target.id);
                });
                dropZone.addEventListener("drop", e => {
                  const id = e.dataTransfer.getData("text/plain");
                  const el = document.getElementById(id);
                });
            

      Drop зона

                dropZone.addEventListener("dragenter", e => {
                  e.preventDefault();
                });
                 
                dropZone.addEventListener("dragover", e => {
                  e.preventDefault();
                });
            

      Список дел

      Пустой список.

      Live region

                <div class="live-region visually-hidden"
                  aria-live="polite"
                  role="status"
                ></div>
                 
                const liveRegion = document.querySelector(".live-region");
                liveRegion.textContent = 'Новый текст';
            

      Список дел

      Пустой список.

      Перемещение

      Trello screenshot

      Trello screenshot.

      Доска задач

      Gmail screenshot

      Gmail screenshot.

      Перетащите файл или .

      Резюме

      Inclusive components by Heydon Pickering

      Aria best practices.

      Accessibility for everyone

      Accessibility for everyone by Laura Kalbag.

      Inclusive components by Heydon Pickering

      Inclusive components by Heydon Pickering.

      Blog of Tatiana Fokina

      Blog of Tatiana Fokina.

      Спасибо!..

      @_sergeikriger

      Credits

      Icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY
      Icons made by Smashicons from www.flaticon.com is licensed by CC 3.0 BY