Как стать автором
Обновить
3553.01
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Как сделать ужасный для пользователя интерфейс. Коллекция HTML/CSS лайфхаков

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров12K


Привет, Хабр!


Я в течение нескольких лет рассказываю вам, как сделать интерфейс лучше для пользователя. Например, в прошлом месяце я поделился простыми HTML и CSS лайфхаками, которые помогают сделать интерфейс дружелюбнее к пользователю.


А недавно я подумал: а вдруг есть фронтендеры, которые хотят сделать ужасный интерфейс? Ну не любят они пользователей. Или хотят сделать пакость работодателю, который их обидел. Где им взять советы?


Надо помочь! Я собрал вредные HTML и CSS техники. Они супер простые, но очень действенные. Я уверен на сто процентов, что благодаря им интерфейс вашего проекта заставит пользователя вспомнить несколько «ласковых» слов.


Давайте посмотрим, что я вам подготовил.


▍ Всегда используйте type="text" для всех полей ввода данных


В интерфейсах есть несколько типов данных, которые пользователь может ввести. Для этого придумали атрибут type. Особенно важно знать, что браузеры используют его, чтобы показать более подходящую виртуальную клавиатуру.


Забудьте. Для всех полей ввода данных используйте значение text. Вам даже его не надо писать. Оно используется по умолчанию. Всегда используйте его, и браузеры отобразят виртуальную клавиатуру с буквами и цифрами.


Это будет жутко бесить пользователя во многих ситуациях. Например, при вводе номера паспорта ему будет нужно нажимать по маленьким цифрам.


Я нахожусь в поле для ввода паспорта. Отображена клавиатура с буквами и цифрами

<div class="input input--small-label ">
  <label class="input__label" for="id_0.2013064072314139">Серия и номер</label>
  <div aria-expanded="false" class="input__text has-error">
    <input type="text" title="Серия и номер" class="input__text-input" aria-describedby="passenger-number" maxlength="14" autocomplete="one-time-code" id="id_0.2013064072314139">
  </div>
</div>

То же самое при вводе номера телефона.


Я в поле для ввода телефона. Мне отображена клавиатура с буквами и цифрами

<div class="input input--label-hide">
  <label for="id_0.37648949029345546_number" class="input__label">Ваш номер телефона</label>
  <div class="phone__wrapper">
    <span class="phone__code">+7</span>
    <div class="input__text">
      <input type="text" class="input__text-input" id="id_0.37648949029345546_number" autocomplete="new-password" maxlength="15">
    </div>
  </div>
</div>

При вводе электронной почты стандартная клавиатура заставит пользователя переключить её, чтобы ввести специальные символы.


Я в поле для ввода электронной почты. Интерфейс отображает клавиатуру. Символа @ нет

<div class="input">
  <label class="input__label" for="id_0.5944244514014756">Эл. почта</label>
  <div class="input__text">
    <input type="text" class="input__text-input" id="id_0.5944244514014756" autocomplete="new-password" maxlength="59">
  </div>
</div>

Это замечательные вредные примеры. Но я хочу предупредить вас. Вам также нужно избегать использования атрибута inputmode. Браузеры тоже используют его, чтобы отобразить более подходящую виртуальную клавиатуру. Его не должно быть в вашем коде.


▍ Элемент <button> не должен существовать вне элемента <form>


Переходим к моей любимой теме. Я верстаю давно. Треть жизни. Раньше была замечательная вредная практика. Большинство верстальщиков использовали элемент <button> только внутри элемента <form>.


Их не волновало, что в интерфейсах есть множество других кнопок. Как бы было логично использовать элемент <button>, но нет. Большинство предпочитало либо элемент <span>, либо элемент <div>.


А потом на конференциях, подкастах и статьях начали говорить, что так нельзя. И верстальщики послушали, но хорошо, что не все. Мне удалось найти несколько примеров.


Начну я с кнопки «Закрыть». Например, вы её можете встретить для модального окна.


В инструментах разработчика подсвечена кнопка и выделен элемент div

<div class="d-modal__close-button">
  <div class="icon icon_cross-thin-white icon_direction-down" title="Закрыть"></div>
</div>

Вторая популярная кнопка — это «Показать пароль».


В инструментах разработчика подсвечена кнопка и выделен элемент div


<div class="auth__input-wrap">
  <input class="auth__input" name="password" type="password" id="signInInputPassword101">
  <label for="signInInputPassword101" class="auth__input--placeholder">Пароль</label>
  <div class="btn-show-hide-password">
    <span data-v-a713a5e8="" class="icon"></span>
  </div>
</div>

Этот кейс — моя личная боль. У меня четыре пароля. Они отличаются последними символами. Конечно, я не помню, где какой используется. Вот когда пароль не подходит, я хочу посмотреть его. Жму клавишу Tab и мимо кнопки «Показать пароль». А потом матюгаюсь и тянусь за мышкой.


Здорово же? Так, что пользуйтесь возможностью усложнить мне жизнь.


▍ При стилизации нестандартных элементов управления используйте свойство background


Вы шаман вёрстки, поэтому стремитесь сделать всё с помощью CSS. Особенно нестандартные элементы управления. Кнопки, радиокнопки, чекбоксы и так далее.


В этой задаче надо использовать свойство background при написании стилей. В этом случае ваши элементы не отобразятся в режиме принудительных цветов. Например, на этом сайте есть кнопка «Гамбургер».


Отображена кнопка Гамбургер. Рядом кнопка поиска

.menu-toggler__burger,
.menu-toggler__burger::after,
.menu-toggler__burger::before {
  width: 2.3rem;
  height: 0.2rem;
  border-radius: 10rem;
  background-color: #050625;
}

Я нажал сочетание клавиш левый ctrl, левый alt и PrtSc, чтобы включить режим высокой контрастности Windows. Попробуйте найти кнопку на этом экране.


Кнопка поиска отображена, а вот кнопки Гамбургер нет

Она визуально не отображена. Думаете, это случайность? Нет! Разработчики сайта знают, что в режиме высокого контраста используется одно и то же значение для всех мест, где есть свойство background.


Это очень тонкая работа специалистов. Они хотели помочь пользователю весело провести время, ищя кнопку. А главное, тыкнуть по ней случайно — это единственный способ её найти. Если бы они использовали векторную графику или свойство border для вёрстки кнопки, то так не получилось бы. Хорошая работа!


▍ Все изображения должны приводить к скачкам контента


Изображения — это отличный пособ подбесить пользователя. Они должны долго загружаться, и при этом вызывать скачки контента вокруг. Чтобы всё прыгало!


Мне сложно в рамках статьи показать динамический пример. По этой причине я покажу с помощью скриншотов. Я нашёл страницу с новостями. У каждого блока есть изображение.


Есть 3 новости, отображенных в ряд. У каждой есть картинка превью, время публикации, заголовок

Обратите внимание, как красиво выровнены заголовки. Все на одной линии. Далее нам это пригодится.


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


У первой новости пропало изображение. Заголовок выше, чем заголовки у других статей

Заголовок теперь отобразился выше, чем другие. На самом деле я наблюдал скачок. Теперь представьте, как прекрасно скачет текст при загрузке страницы. Жутко бесит!


Так должно быть и в вашем проекте. А если кто-то попытается рассказать вам про свойство aspect-ratio, не слушайте их. Они ничего не понимают в ужасных интерфейсах.


▍ У вас должно быть ограничение на количество введённых символов


Данный совет прекрасно подходит для проектов, где пользователи покупают билеты. У некоторых людей могут быть двойные фамилии. Здесь у вас появляется возможность не дать им это сделать. Используйте атрибут maxlength для поля ввода фамилии. Люди не смогут заполнить форму и купить билеты!


Такой случай был у моей знакомой Екатерины. После замужества у неё стала фамилия «Михайличенкова-Павлюченкова». На латинице «Mikhailichenkova-Pavlyuchenkova».


Она попыталась её ввести при покупке авиабилетов.


В поле для ввода Фамилии отображается текст Mikhailichenkova-Pavlyuchenkov

<input type="text"  maxlength="30" value="MIKHAILICHENKOVA-PAVLYUCHENKOV" title="Фамилия" class="input__text-input" aria-describedby="passenger-name"autocomplete="one-time-code" id="id_0.5152585184040783">

Не получилось ввести последний символ. Она попыталась вставить фамилию, но браузеры обрезали её, чтобы соответствовать лимиту. Безупречное решение от разработчиков!


Правда, мы можем улучшить и этот пример. Можно добавить атрибут minlength. Тогда люди с короткими фамилиями, например, иностранцы, тоже не смогут заполнить форму. Но тут уже смотрите сами.


▍ Сделайте всё, но не используйте свойство outline


Я уверен, что вы можете сами сделать ужасный интерфейс. Но с напарником же лучше? Попросите дизайнера сделать нестандартную обводку для интерактивных элементов, находящихся в состоянии «Фокус».


В этом случае у вас появится возможность навредить мне. Ваша задача — не использовать свойство outline. Вместо него сделайте обводку с помощью свойства box-shadow.


Раздел с 3 новостями. У 2 новости обводкой выделено время публикации

.news-container :focus-visible {
  border-radius: 1px;
  box-shadow: 0 0 0 3px #68d;
}

В этом случае я её не увижу, если буду использовать режим принудительных цветов. Например, так будет отображена обводка из предыдущего примера в режиме высокой контрастности Windows.


Тот же раздел. У 2 новости пропала обводка

Очень действенный метод! Я часто использую клавиатуру, и это очень сильно осложнит мне жизнь. Но вы мне можете сказать, что мало кто использует такой режим. Ладно, не буду спорить. Есть ещё способ сделать пакость мне.


Вы можете дополнительно поиздеваться надо мной, если ваша обводка будет обрезана. Я нашёл прекрасный пример.


Несколько новостей отображены в столбец. У 2 сверху и снизу есть синие линии

Вот я же не с первого раза пойму, что это за две линии сверху и справа. Буду думать. Так что обязательно сделайте так же. Для этого добавьте свойство overflow со значением hidden к любому родительскому элементу.


В инструментах разработчика выделен родительский элемент, у которого установлено свойство overflow

.mCustomScrollBox {
  direction: ltr;
  height: 100%;
  max-width: 100%;
  outline: none;
  overflow: hidden;
  position: relative;
}

▍ Всегда заполняйте бессмысленной информацией атрибут alt


Конечно, я не мог оставить в покое пользователей скринридера. Они тоже должны мучаться. В этом вам поможет атрибут alt. Ваша задача заключается в том, чтобы абсолютно для всех изображений добавить в него текст. Неважно, является оно декоративным или нет.


А ещё лучше, если вы туда добавите бессмысленный текст. Например, разработчики добавили текст «Участник сообщества 2».


В инструментах разработчика выделен элемент img, у которого установлен альтернативный текст Участник сообщества 2. Хотя изображение декоративное. Обозначает участника сообщества

<img alt="Участник сообщества 2" class="_image_1fz8s_65" src="https://opis-cdn.tinkoffjournal.ru/mercury/ugc_soqmcc_userpic?preset=icon_30x30_2x">

Какого сообщества? Почему он второй? Вот такие вопросы задаст пользователь скринридера. Но на этом не стоит останавливаться. Пусть пользователь будет конфужен полностью.


В современных интерфейсах часто используется аватарки. Вот добавьте для них текст «Аватар пользователя».


В инструментах разработчика выделен элемент img, у которого установлен альтернативный текст Аватар пользователя. Само изображение является аватаркой пользователя

<img alt="Аватар пользователя" class="_image_jfgqc_12" width="90" height="90" src="https://opis-cdn.tinkoffjournal.ru/ip/SCMpowFpEL5LW7xeI9FmjqJKjIJO2-qvsYH6S1VQhYU/h:600/w:600//ZjIzMmVlYl8zMl8y/LmpwZw">

Таким решением вы только заспамите озвучку текста. Никакой пользы не будет. Вот что сказал мой незрячий знакомый Илья:


«Для меня — это спам. У меня весь день ридер болтает в телефоне и ноуте. Бывает, к вечеру едет крыша. Да и слух притупляется. Поэтому всё лишнее стараюсь отбрасывать».


Напоследок я хочу позаботиться о вас. Буду честен, у меня есть серия статей, где мы с Ильёй рассказали, как правильно поступать. Ни в коем случае не читайте эти статьи. Тогда сделаете хорошо. А это же против ваших интересов.


▍ Заключение


Надеюсь, теперь вы знаете, как сделать ужасный интерфейс. Конечно, я не показал все техники, но эти уже очень сильно усложнять жизнь пользователям. Ваша задача будет решена.


Но вы действительно хотите приносить неудобства людям? Надеюсь, что нет. И вы будете использовать эту статью, как чек-лист багов, которые нужно исправить.


Кстати, поделитесь, пожалуйста, своими примерами, когда интерфейс бесит вас. Мне будет интересно прочитать.


На этом я прощаюсь. Спасибо за чтение!


P.S. Помогаю больше узнать про CSS в своём ТГ-канале CSS isn't magic. Присоединяйтесь. Ссылка в профиле.


© 2025 ООО «МТ ФИНАНС»

Telegram-канал со скидками, розыгрышами призов и новостями IT 💻
Теги:
Хабы:
+57
Комментарии45

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds