Людоедский интерфейс

Вадим Макеев, HTML Academy

Людоедский интерфейс

Обложка комикса «Inhuman».
Логотип HTML Academy.

DX

UX

Людоедский?

Недоступный

Недоступный

Иконка доступности: человек расставил руки в голубом круге.

Контроль

Семантика

Парень и девушка сравнивают знание HTML-тегов: она знает много, он — только div.

Диватоз

			<div class="floor floor--bigleft-aside">
			    <div class="floor__bigleft floor__bigleft--smaller">
			        <div class="project__ladel">Ресторан</div>
			        <div class="project__description">Запустили сайт
			        <div class="project__footer">
			            <div class="project__tag">Вёрстка</div>
			            <div class="project__tag">Разработка</div>
        

Диватоз

        	                                        
                                                                    
                                                Ресторан            
                                                      Запустили сайт
                                                 
                                                  Вёрстка            
                                                  Разработка            
	    
Цветущая ветка сакуры.

Диватоз

        	                                        
                                                                    
                                            <h2>Ресторан</h2>       
                                                   <p>Запустили сайт</p>
                                          <ul>   
                                              <li>Вёрстка</li>       
                                              <li>Разработка</li>       
	    

Зачем списки?

			<nav>
			    <ul>
			        <li><a href="">Главная</a></li>
			        <li><a href="">Проекты</a></li>
			        <li><a href="">Контакты</a></li>
			    </ul>
			</nav>
		

Навигация,
Список, первый из трёх.
Ссылка, главная.

Зачем списки?

			<div class="menu">
			    <a href="">Главная</a>
			    <a href="">Проекта</a>
			    <a href="">Контакты</a>
			</div>
		

Ссылка,
главная.

Ориентиры

			<header>Логотип</header>
			<nav>Ссылки</nav>
			<main>
			    <h1>Заголовок</h1>
			    <p>Полезное</p>
			</main>
			<footer>Информация</footer>
		
Иконка ориентира.

Заголовки

			<h1>Название компании</h1>
			    <section>
			        <h2>Услуги</h2>
			        <article>
			            <h3>Дизайн</h3>
			        <article>
			            <h3>Разработка</h3>
		

Интерактивные

Ссылка

Фокус

Главня страница AliExpress. Главная AliExpress увеличена. Главная AliExpress с фокусом на интерактивных элементах.
			:focus {
			    outline: 0;
			}
		

Tab

Shift Tab

Как попасть в порядок

API кнопки?

Кнопка

			<button class="button">Кнопка</button>
			<div class="button">Кнопка</div>
			<button class="button">Кнопка</button>
			<div class="button">Кнопка</div>
		
Кнопка
Кнопка

:Focus

			.button:focus {
			    box-shadow:
			        0 0 0 3px #ffffff,
			        0 0 0 6px #2f7cc0;
			    outline: none;
			}
		

Active

			.button:active {
			    border-color: #4777a6;
			    background: #4e87c0;
			    color: #ffffff;
			}
		

Tabindex

			<button class="button">Кнопка</button>
			<div tabindex="0" class="button">Кнопка</div>
			<button class="button">Кнопка</button>
			<div tabindex="0" class="button">Кнопка</div>
		
Кнопка
Кнопка

Скрипт

			var buttons = document.querySelectorAll('.button');
			 
			for(var i = 0; i < buttons.length; i++) {
			    buttons[i].addEventListener('click', function() {
			        this.disabled = true;
			    });
			}
		
Кнопка
Кнопка
Огромная надувная уточка.

Disabled

			.button:disabled {
			    background: linear-gradient(
			        #cccccc,
			        #fefefe
			    );
			    color: #aaaaaa;
			}
		

Лейблы

Лейблы

звучит как чёрный треугольник, направленный вправо,
× звучит как умножить, х как ха,   как хлопок одной ладонью.

Legend

			<input type="radio" name="color" id="white" checked>
			<label for="white">Чёрный</label>
			<input type="radio" name="color" id="black">
			<label for="black">Белый</label>
		

Чёрный, выбран.
Радиокнопка.
Первая из двух.

Legend

			<fieldset>
			    <legend>Цвет холодильника</legend>
			    <input type="radio" name="color" id="white" checked>
			    <label for="white">Чёрный</label>
			    <input type="radio" name="color" id="black">
			    <label for="black">Белый</label>
			</fieldset>
		

Цвет холодильника
чёрный, выбран.
Радиокнопка.
Первая из двух.

Цвет холодильника
белый, выбран.
Радиокнопка.
Вторая из двух.

Иконки

			<button>
			    <svg aria-label="Лайк!">
			        <use xlink:href="#like"></use>
			    </svg>
			</button>
		

Юникод

			<button aria-label="Меню">
			    ☰ Меню
			</button>
			<button>
			    <span aria-hidden="true">☰</span>
			    Меню
			</button>
		

А что если… нет заголовка?

			<main>
			    <h1 class="visually-hidden">
			        Заголовок
			    </h1>
			    <p>Полезное</p>
			</main>
		

Добавляйте и прячьте. Прятать такое не вредит SEO.

Визуально спрятано

			.visually-hidden {
			    position: absolute;
			    width: 1px;
			    height: 1px;
			    overflow: hidden;
			    clip: rect(0 0 0 0);
			}
		

Инструменты

  1. VoiceOver
  2. NVDA
  3. JAWS
Lighthouse logo.
100% результат тестирования доступности.
			:focus {
			    outline: 0;
			}
		
			alt="picture-1"
			alt="picture-2"
			alt="picture-3"
		

axe-cli

Инспектор доступности

  1. Открыть флаги chrome://flags
  2. Найти и включить Developer Tools Experiments
  3. Открыть настройки отладчика в кебаб-меню
  4. Включить в экспериментах Accessibility Inspection
  5. Найти вкладку Accessibility при выбранном элементе.
Google Maps search field in accessibility inspector.

Это фича!

			<i onclick="site()">
			<a href="site">
		
			<div class="button">
			<button class="button">
		

Это баг.

Читать дальше

Зелёный аллигатор говорит «arigato».

sokr.me/ihu

@pepelsbey

Логотип Shower.

Shower

Вопросы?