Tappable
Базовый компонент для создания интерактивных элементов, который автоматически адаптирует семантику и поведение под контекст. Обрабатывает состояния наведения, нажатия и фокуса, обеспечивая:
- визуальную обратную связь через фоновые эффекты;
- ripple-эффект на Android;
- автоматическую установку
cursor: pointer; - основу для интерактивных компонентов вроде
Button,Cell,ActionSheetItem;
Логика выбора элемента
Компонент динамически выбирает HTML-тег на основе переданных свойств:
| Условия | Тег | Роль/Атрибуты | Особенности |
|---|---|---|---|
Передан Component | Кастомный | Наследует переданные свойства | Требует ручной настройки a11y |
Указан href | <a> | role="link" при disabled | Блокировка через aria-disabled |
Указан onClick | <div> | role="button" tabIndex="0" | Обработка клавиш Space/Enter |
Без href/onClick | <div> | - | Неинтерактивный контейнер |
Особенности состояний
Наведение
- Свойство
hasHoverвключает/выключает реакцию на наведение. - Свойство
hoveredвключает состояние наведения. - Свойство
hoverModeпозволяет стилизовать состояние. Если передать произвольную строку, она добавится как css-класс во время наведения.
Нажатие
Задается свойством active:
- Свойство
hasActiveвключает/выключает реакцию на нажатие. - Свойство
activatedвключает состояния нажатия. - Свойство
activeMode/activeClassNameпозволяет стилизовать состояние. Если передать произвольную строку, она добавится как css-класс во время нажатия. - Свойство
activeEffectDelayотвечает за длительность подсветки (в миллисекундах).
Focus (фокус)
- Свойство
focusVisibleModeпозволяет стилизовать стиль состояния фокуса. Если передать произвольную строку, она добавится как css-класс при:focus-visible
Скругление углов
Задается свойством borderRadiusMode:
auto— адаптивный режим (нет скруглений на мобильных);inherit— наследование стилей.
Взаимодействие с дочерними элементами
Групповая подсветка
// Родитель сохраняет hover при наведении на детей
<Tappable hasHoverWithChildren>
<IconButton />
<IconButton />
</Tappable>Проброс состояния
// Дочерний элемент активирует hover родителя
<Tappable>
<IconButton unlockParentHover />
</Tappable>Доступность (a11y)
Основные принципы
-
Автоматическая семантика
Компонент сам выбирает подходящий HTML-тег:
<a>при передачеhref;<div role="button">при наличииonClick;- в остальных случаях
<div>.
-
Блокировка элементов
При
disabled:- Для ссылок:
aria-disabled="true"+ удалениеhref - Для кнопок:
aria-disabled="true"+tabIndex="-1"
- Для ссылок:
-
Клавиатурные события
Кнопки (
role="button") обрабатывают:- Нажатие клавиш
Space/Enter - Фокус через клавишу
Tab
- Нажатие клавиш
Критические правила
-
Иконки без текста
Всегда добавляйте текстовую метку:
// Плохо <Tappable><Icon16Close /></Tappable> // Хорошо <Tappable aria-label="Закрыть"> <Icon16Close /> </Tappable> -
Смешение href и onClick
Избегайте комбинации — это нарушает семантику:
// Антипаттерн <Tappable href="/page" onClick={handleClick} /> // Правильно <Tappable href="/page">Ссылка</Tappable> <Tappable onClick={handleClick}>Кнопка</Tappable> -
Кастомные элементы
Для нестандартных тегов явно укажите:
<Tappable Component="span" role="button" tabIndex={0} aria-label="Действие" />
Визуальный фокус
- Используйте
focusVisibleModeдля кастомизации. - Не переопределяйте
:focus-visibleбез веской причины.
Свойства и методы
| Свойство | Описание |
|---|---|
activated | booleanПозволяет управлять По умолчанию: - |
activeClassName | stringDeprecated: Since 7.3.0. Свойство устарело и будет удалено в По умолчанию: - |
activeEffectDelay | numberДлительность показа По умолчанию: - |
activeMode | StateModeLiteralСтиль подсветки active-состояния. Если передать произвольную строку, она добавится как css-класс во время active. По умолчанию: background |
baseClassName | string | falseDeprecated: Since 7.3.0. Свойство устарело и будет удалено в По умолчанию: - |
baseStyle | CSSPropertiesDeprecated: Since 7.3.0. Свойство устарело и будет удалено в По умолчанию: - |
borderRadiusMode | "auto" | "inherit"Задает border-radius элементу
В режиме По умолчанию: auto |
Component | ElementType<any, keyof IntrinsicElements>По умолчанию: - |
DefaultComponent | ElementType<any, keyof IntrinsicElements>Компонент который будет при передаче По умолчанию: - |
focusVisibleMode | FocusVisibleModeСтиль аутлайна focus visible. Если передать произвольную строку, она добавится как css-класс при :focus-visible По умолчанию: - |
getRootRef | Ref<HTMLElement>По умолчанию: - |
hasActive | booleanУказывает, должен ли компонент реагировать на По умолчанию: - |
hasHover | booleanУказывает, должен ли компонент реагировать на По умолчанию: - |
hasHoverWithChildren | booleanПозволяет родительскому компоненту
иметь Присваивается родителькому компоненту. По умолчанию: - |
hoverClassName | stringDeprecated: Since 7.3.0. Свойство устарело и будет удалено в По умолчанию: - |
hovered | booleanПозволяет управлять По умолчанию: - |
hoverMode | StateModeLiteralСтиль подсветки hover-состояния. Если передать произвольную строку, она добавится как css-класс во время hover. По умолчанию: background |
unlockParentHover | booleanПозволяет родительскому компоненту показывать hovered-состояние при наведении на текущий дочерний компонент. Присваивается дочернему компоненту. По умолчанию: - |