2020: время хороших интерфейсов. Базовое руководство

Анна Селезнёва

2020: время хороших интерфейсов

Базовое руководство

Анна Селезнёва

Обо мне

Анна Селезнёва

Ведущий фронтенд-разработчик в Spiral Scout

Соорганизатор сообществ MinskCSS и MinskJS

#freehugs

Рассказываю очевидные вещи с 2011 года

2020

Не рекомендую

Изоляция

Быстрый или удобный?

Вопрос

Вы бы перестали пользоваться любимым сайтом,
если бы он стал грузиться на 100ms дольше?

200ms?

500ms?

Яндекс

Быстрый или удобный?

Два фронтенд-разработчика сидят рядом в баре.
Им не о чем говорить

Крис Койер @ CodePen.io

The Great Divide

Опрос

https://twitter.com/asktwi/status/1299696636290117632
Фронтенд-разработчик

Разработчик интерфейсов

2011

10+ лет фронтенда

А как же интерфейс?

Этого не было в дизайне

В дизайне может не быть

Если дизайнер не показал, как делать что-то,
нельзя делать вид, что этого нет

Артём Поликарпов @ Chatra.io

У дизайнера тоже могут быть причины

🤷Не было задачи или времени

🤷Недостаточно опыта или инструментов

🤷Его нет

Инициатива не наказуема

Есть дизайнер? Спроси

Нет дизайнера? Сделай сам

Действуй!

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

Павел Рыбин @ Mail.Ru Group / Хабр

Это было в дизайне

В дизайне могут быть

Работай головой, а не руками

Неудобно? Сложно? Спроси

Не согласен с решением? Спорь

Найди компромисс

Дизайн – это не только то,
как это выглядит и ощущается
Дизайн – это то, как это работает

Стив Джобс

Сайт продукт

Статистика интернет-пользователей *

В 2020 году более 80% людей
пользуются интернетом

* — в развитых странах

Пользователи — не разработчики

Интерфейс от разработчика

Информация

Pixel Perfect

Сайт может менять размеры

Отзывчивость

Отзывчивая область просмотра

      <meta
  name="viewport"
  content="width=device-width, initial-scale=1"
>
    

Важно! Не отключайте возможность масштабирования:

user-scalable=yes

Макет в пикселях

270x240

          .block {
  width: 270px;
  height: 240px;
}
        

Единица измерения rem

          
.block {
  width: 270px;
  height: 240px;
}
        
          /* 1rem = 16px */
.block {
  width: 16.875rem;
  height: 15rem;
}
        

Минимальная адаптивность

      html {
  font-size: 16px; /* по умолчанию */
}
@media (max-width: 1280px) {
  html {
    font-size: 12px;
  }
}
    

Минимальная адаптивность

270 x 240

203 x 180

Жесткие контрольные точкиПроблема

1440

?

1024

?

768

Гибкая типографикаРешение

      html {
  font-size: calc($min_font_size +
    ($max_font_size - $min_font_size) *
    ((100vw - $min_viewport_width) /
    ($max_viewport_width - $min_viewport_width))
  );
}
    

© MadeByMike

Отзывчивость всего

Текст сайта может меняться

Lorem ipsum

В копилку

Cat ipsum

This cat happen now, it was too purr-fect!!! Trip owner up in kitchen i want food make meme, make cute face for where is my slave?

Cat ipsum

В копилку

Hipster ipsum

Paleo tousled snackwave, tumeric selvage XOXO lomo. Microdosing kickstarter shabby chic raw denim craft beer woke keffiyeh umami yr pug pitchfork.

Hipster ipsum

В копилку

Fillerama

Bender, we're trying our best. Yep, I remember. They came in last at the Olympics, then retired to promote alcoholic beverages! No!

Hipster ipsum

Язык тоже важен

fish-text.ru

Есть над чем задуматься: акционеры крупнейших компаний лишь добавляют фракционных разногласий и подвергнуты целой серии независимых исследований.

Fish Text

«Зимний дизайн не работает летом»

I18n

И17я

Интернационализация

Интернационализация

Terms of Use

Условия
использования ?

Nutzungsbedingungen

Длинные слова Проблема

Sozialversicherungsfachangestelltenauszubildender (49 букв)

Cтажер помощника социального страхового брокера

Длинные слова Решение 1

Принудительно перенести:

          word-break: break-all;
        

До:

Sozialversicherungsfachangestelltenauszubildender

После:

Sozialversicherungsfachangestelltenauszubildender

Длинные слова Решение 2

Обрезать и добавить многоточие:

            text-overflow: ellipsis;
overflow: hidden;
          

До:

Sozialversicherungsfachangestelltenauszubildender

После:

Sozialversicherungsfachangestelltenauszubildender

Фиксированная ширина Проблема

Фиксированная ширина Решение 1

      <svg viewBox="0 0 150 20">
  <text x="0" y="15">Добавить в корзину</text>
</svg>
    
svg {
  width: 100%;
}

Фиксированная ширина Решение 2

elem.style.fontSize =`${
  (elem.clientWidth / elem.innerText.length) * K
}rem`
/*
K = X / W
где W — средняя ширина буквы в пикселях при размере шрифта X
*/

      
    

На сайте могут быть разные картинки

Картинка в макете

Картинка на сайте

Кот

Картинка произвольного размера Проблема

Кот

Картинка произвольного размера Решение

Пропорционально центрировать:

          img {
  max-height:100%;
  max-width: 100%;
  object-fit: contain;
}
        
Cat

Отсутствие аватара Проблема

Константин Константинопольский

Отсутствие аватара Неправильное Решение

Отсутствие аватара Правильное Решение

Инициалы:

КК

С сайтом можно взаимодействовать

Ссылка Проблема

Пример:

Ссылка Проблема

Пример:

Ссылка Решение

Просто:

Подробнее
      a {
  text-decoration: underline;
}
    

Ссылка Решение

Гибко:

Подробнее
      a {
  background-image: linear-gradient(currentColor,currentColor);
  background-position: center bottom .25rem;
  background-repeat: no-repeat;
  background-size: 100% 1px;
}
    

Реакция на наведение Памятка

Подробнее
Подробнее

Хотя бы так:

          a:hover {
  opacity: .75;
}
          
        

Реакция на наведение Памятка

Подробнее
Подробнее
Подробнее

А лучше так:

          a:hover {
  color: darken($color, 10%);
  /* или */
  color: lighten($color, 10%);
}
          
        

Кликабельные области

Кликабельные области

Кликабельные области Проблема

Кликабельные области Решение

          button::after {
  content: ;
}         
        

На сайте можно вводить данные

Поле ввода Проблема

Поле ввода Решение

Поле ввода Решение

Заголовок поля ввода Проблема

      <input name="email" type="email" placeholder="E-mail">
    

Заголовок поля ввода Решение

          
input:placeholder-shown ~ label {
  opacity: 0;
}
        

Заголовок поля ввода Проблема

      
<label>E-mail</label>
<input name="email" type="email">
      
    

Заголовок поля ввода Решение

      
<label for="email-unique-id">E-mail</label>
<input id="email-unique-id" name="email" type="email">
      
    

Заголовок поля ввода Решение

      <label>
  <span>E-mail</span>
  <input name="email" type="email">
</label>
      
    

+50 к доступности

Заголовок поля ввода Бонус

Фокус Проблема

Фокус Решение 1

Подобрать стиль:

          button:focus {
  outline: none;
  box-shadow: 0 0 0 .25em white,
              0 0 0 .375em tomato;
}         
        

Фокус Решение 2

Оставить выделение для навигации с клавиатуры:

        button:focus:not(:focus-visible) {
  outline: none;
}       
      

drafts.csswg.org/selectors-4/#focus-visible-pseudo

Фокус Решение 2

Полифил: github.com/WICG/focus-visible

        [data-js-focus-visible]
button:focus:not([data-focus-visible-added] {
  outline: none;
}       
      

Оповещения

Действие по клику

UI kit

CSS-фреймворки

и ещё 10 вариантов

Сайт должен
быть дружелюбным

Естественность

Плавность анимации

Скорость анимации

The ultimate guide to proper use of animation in UX

Анимация + загрузка Проблема

Принудительное замедление Решение

          Promise.all([
  loadData(),
  timeOut()
])
.then(...)
        

Длительная загрузкаПроблема

1 секунда 🙂

2 секунды 😐

3 секунды 😒

5 секунд 😡

10 секунд 💀

Длительная загрузкаРешение

Благодарности

Итоги

Спасибо!

asktwi

Слайды: askd.rocks/pres/ui-2020

Frontend Live 2020