К содержанию
Гайд

Как сделать кнопку с состояниями и вариантами

Кнопка в макете — это компонент с набором вариантов: «Обычная», «Наведение», «Нажата», «Фокус», «Отключена». Ниже весь путь от подписи «Сохранить» до hover в прототипе и готового кода.

Обновлено 7 минут чтения

Карточка из UI-кита, выбран экземпляр кнопки «Позже»; справа панель «Экземпляр»: вид «Контурная», состояние «Обычная», текст и переключатель иконки

Коротко

Кнопка с состояниями в Morfa — это компонент с набором вариантов: оберните подпись в автолейаут (⇧A), создайте компонент (⌥⌘K), добавьте свойство «Состояние» со значениями «Обычная», «Наведение», «Нажата», «Фокус», «Отключена» и при желании второе свойство, например «Вид».

В прототипе hover и нажатие делаются действием «Изменить на» с триггерами «При наведении» и «При удержании». В коде состояния становятся :hover, :active, :focus-visible и :disabled.

Шаг 1. Соберите кнопку на автолейауте

Кнопка должна расти вместе с подписью, поэтому её собирают на автолейауте, а не рисуют прямоугольником под текстом.

  1. Напишите подпись

    Инструментом «Текст» (T) напишите «Сохранить». Шрифт выберите из каталога, например Inter.

  2. Оберните её в автолейаут

    Выделите текст и нажмите ⇧A. Редактор обернёт его во фрейм с автолейаутом.

  3. Задайте отступы и размер

    В разделе «Автолейаут» задайте отступы, например 10 px сверху и снизу и 16 px по бокам. В размерах оставьте «Обтянуть»: кнопка будет подстраиваться под длину подписи.

  4. Добавьте заливку и скругление

    В разделе «Заливка» выберите цвет, в поле «Скругление» задайте радиус, например 8 px. Переименуйте фрейм в «Кнопка» (⌘R).

Шаг 2. Превратите фрейм в компонент

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

  1. Создайте компонент

    Выделите фрейм «Кнопка» и нажмите ⌥⌘K («Создать компонент»). Во вкладке «Дизайн» появится раздел «Компонент».

  2. Опишите его

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

Шаг 3. Как сделать состояния кнопки: hover, нажатие, фокус

Состояния — это варианты одного компонента, а «Состояние» — свойство типа «Вариант». С первым таким свойством компонент становится «Набором вариантов».

  1. Добавьте свойство «Вариант»

    В разделе «Компонент» у строки «Свойства» нажмите «+» и выберите «Вариант». Компонент превратится в «Набор вариантов» со свойством «Свойство 1».

  2. Назовите свойство и первое значение

    Сразу откроется окно свойства (позже его открывает нажатие на строку свойства). Впишите название «Состояние», а значение «Вариант 1» замените на «Обычная».

  3. Добавьте варианты

    Нажмите «Добавить вариант» под списком свойств. Появится копия первого варианта, и она сразу выделена: в разделе «Вариант» задайте ей «Состояние» — «Наведение». Повторите для «Нажата», «Фокус» и «Отключена».

  4. Нарисуйте каждое состояние

    Для «Наведение» и «Нажата» затемните заливку, для «Фокус» добавьте заметную обводку или тень с разбросом, для «Отключена» сделайте заливку серой, а текст бледным.

Если у вас уже есть отдельные компоненты кнопок, их можно не пересобирать. Назовите каждый по схеме «Состояние=Наведение», выделите все и выберите «Объединить как варианты»: свойства и значения возьмутся из названий.

Шаг 4. Второе свойство: «Вид» кнопки

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

  1. Добавьте свойство к набору

    Выделите «Набор вариантов», снова нажмите «+» у «Свойств» и выберите «Вариант». Назовите свойство «Вид», значение у существующих вариантов — «Основная».

  2. Сделайте контурные варианты

    Выделите вариант «Обычная» и в меню «…» раздела «Вариант» выберите «Добавить вариант». Копии задайте «Вид» — «Контурная», уберите заливку и добавьте обводку. Повторите для остальных состояний.

  3. Проверьте сочетания

    Каждое сочетание значений «Вид» и «Состояние» должно встречаться один раз. Если у двух вариантов значения совпали, раздел «Набор вариантов» покажет предупреждение.

Карточка из UI-кита, выбран экземпляр кнопки «Позже»; справа панель «Экземпляр»: вид «Контурная», состояние «Обычная», текст и переключатель иконки
Экземпляр кнопки на карточке и панель экземпляра: «Вид» — «Контурная», «Состояние» — «Обычная».

Шаг 5. Подпись и иконка в свойствах

Подпись и иконку выносят в свойства компонента. Тогда их меняют прямо в экземпляре, не отсоединяя его.

  1. Свойство «Текст» для подписи

    Нажмите «+» у «Свойств», выберите «Текст» и в окне свойства нажмите «Привязать слой» → слой подписи.

  2. «Логическое» для иконки

    Добавьте свойство типа «Логическое» и привяжите к нему слой иконки: в экземпляре появится переключатель, который показывает и прячет иконку.

  3. «Замена экземпляра» для другой иконки

    Если иконка — экземпляр своего компонента, свойство «Замена экземпляра» позволит подставить в кнопку другую иконку.

Шаг 6. Экземпляры кнопки на экранах

Экземпляр следует за компонентом: правка образца обновляет все кнопки в файле, а изменения в конкретном экземпляре остаются его переопределениями.

  1. Поставьте экземпляр

    В меню «…» раздела «Набор вариантов» выберите «Создать экземпляр». Экземпляр появится рядом с набором, его можно перенести на нужный экран.

  2. Переключайте вариант

    В разделе «Экземпляр» выберите «Вид» и «Состояние» из списков, например «Контурная» и «Отключена».

  3. Меняйте подпись

    Подпись и переключатель иконки — там же, в разделе «Экземпляр».

Шаг 7. Hover и нажатие в прототипе

Кнопка в прототипе меняет вид действием «Изменить на», которое переключает вариант. Взаимодействия добавляют вариантам в наборе, и их получают все экземпляры кнопки. Подробнее о триггерах и переходах — на странице про прототипы.

  1. Выделите вариант «Обычная»

    Выберите в наборе основной вариант в состоянии «Обычная» и откройте вкладку «Прототип».

  2. Добавьте наведение

    В разделе «Взаимодействия» нажмите «+»: триггер «При наведении», действие «Изменить на», вариант — «Наведение». Переход — «Растворение» или «Умная анимация».

  3. Добавьте нажатие

    У варианта «Наведение» добавьте триггер «При удержании» и «Изменить на» с вариантом «Нажата».

  4. Повторите для контурной кнопки

    Контурным вариантам добавьте такие же взаимодействия, только с контурными вариантами «Наведение» и «Нажата».

  5. Проверьте в плеере

    Нажмите ▶ или ⌥⌘↵. Плеер откроется в новой вкладке.

Что получит код

В режиме «Код» (⇧D) и при «Экспорте в React…» кнопка становится React-компонентом. «Вид» превращается в проп с union-типом. Частые русские слова генератор переводит: «Вид» — kind, «Основная» — primary, «Контурная» — outline. «Состояние» в пропсы не попадает: наведение, нажатие и фокус браузер показывает сам через CSS, а «Отключена» становится обычным атрибутом disabled у <button>.

В коде экрана экземпляр такой кнопки выглядит примерно так: <Button kind="outline" disabled>Сохранить</Button>. Если цвета кнопки привязаны к переменным, на тёмном фрейме она возьмёт тёмные значения: как это настроить, описано в гайде про тёмную тему.

tsxПример, упрощённо: Button.tsx (React + CSS Modules) для набора «Кнопка» со свойствами «Вид» и «Состояние»
export type ButtonProps = ComponentPropsWithRef<'button'> & {
  /** «Вид»: 'primary' — «Основная», 'outline' — «Контурная» */
  kind?: 'primary' | 'outline';
};

export function Button({kind = 'primary', children, className, ...props}: ButtonProps) {
  return (
    <button type="button" className={cx(styles.root, className)} data-kind={kind} {...props}>
      <span className={styles.label}>{children}</span>
    </button>
  );
}
cssПример, упрощённо: состояния из того же набора в Button.module.css
.root[data-kind='outline'] {
  background: none;
  box-shadow: inset 0 0 0 1px #333333;
}

.root[data-kind='primary']:hover:not(:disabled) {
  background: #1A1A1A;
}

.root:focus-visible {
  box-shadow: 0 0 0 3px #0066FF;
}

.root[data-kind='primary']:active:not(:disabled) {
  background: #0D0D0D;
}

.root:disabled {
  background: #D9D9D9;
  cursor: not-allowed;
}

Частые ошибки

Чаще всего кнопка ломается не в редакторе, а в мелочах сборки: в размерах, названиях и месте, куда добавлены взаимодействия.

Morfa — редактор интерфейсов в браузере

Компоненты, автолейаут, прототипы, совместная работа и код React. Без VPN, с оплатой в рублях.

0 ₽
План «Бесплатный»: 10 файлов, все инструменты и экспорт, без срока
990 ₽
в месяц за план «Профессиональный» или 790 ₽ при оплате за год; 20 ГБ картинок
Figma → Morfa
Импорт файлов по ссылке, бесплатно на любом плане
Без VPN
Открывается в браузере из России, без установки

Вопросы

Что чаще всего спрашивают о теме «Кнопка с вариантами».

Как сделать hover у кнопки в прототипе?

Сделайте вариант «Наведение» в наборе кнопки и добавьте варианту «Обычная» взаимодействие: триггер «При наведении», действие «Изменить на», вариант «Наведение». Когда курсор уходит, кнопка сама возвращается в обычный вид.

Можно ли добавить состояние «Фокус» для навигации с клавиатуры?

Да: значение «Фокус» в свойстве «Состояние» попадает в код как :focus-visible. В макете его рисуют обводкой или тенью, чтобы фокус было видно на любом фоне.

Почему состояние кнопки не стало :hover в коде?

Генератор узнаёт состояния по названиям значений: «Обычная», «Наведение», «Нажата», «Фокус», «Отключена» или их английские аналоги. Если значение названо иначе или нет значения «Обычная», свойство остаётся пропом компонента.

Как сделать иконку, которую можно включать и выключать?

Добавьте свойство типа «Логическое» и привяжите к нему слой иконки: в каждом экземпляре появится переключатель. Чтобы менять саму иконку, используйте свойство «Замена экземпляра».

Что будет, если отсоединить экземпляр кнопки?

Он станет обычным фреймом и перестанет обновляться вместе с компонентом. Чтобы откатить правки экземпляра, есть команда «Сбросить все изменения», а отсоединять экземпляр (⌥⌘B) стоит, только когда копия должна стать самостоятельной.

Начните с шаблона или с файла из Figma

Бесплатно — 10 файлов, все инструменты и экспорт. Карта не нужна.