Tippy.js, как современная библиотека для создания всплывающих подсказок и тултипов в JavaScript, предоставляет широкие возможности для адаптации интерфейсов, включая поддержку языков с направлением письма справа налево (Right-to-Left, RTL). Правильная интеграция RTL критически важна для веб-приложений, ориентированных на арабский, иврит, персидский и другие языки с нестандартным направлением текста.
Tippy.js использует Popper.js под капотом для позиционирования
тултипов. Popper.js автоматически определяет направление в зависимости
от свойства dir родительского элемента:
<div dir="rtl">
<button id="btn">Наведи на меня</button>
</div>
<script>
tippy('#btn', {
content: 'Пример RTL тултипа',
placement: 'right'
});
</script>
Особенности:
dir="rtl",
Tippy.js корректно меняет стороны тултипа: left становится
right и наоборот.top, bottom, left,
right и их вариаций с
-start/-end).placement с RTLВ Tippy.js предусмотрены расширенные варианты
placement:
start и end заменяют left
и right в зависимости от направления документа.
В RTL-среде:
| Позиция | RTL интерпретация |
|---|---|
top-start |
Верхний правый угол |
top-end |
Верхний левый угол |
bottom-start |
Нижний правый угол |
bottom-end |
Нижний левый угол |
Пример:
tippy('#btn', {
content: 'Тултип с RTL поддержкой',
placement: 'bottom-start'
});
Если контейнер имеет dir="rtl", тултип появится справа
внизу кнопки.
Иногда необходимо игнорировать автоматическое определение и задать
направление вручную. Для этого Tippy.js поддерживает опцию
popperOptions:
tippy('#btn', {
content: 'Тултип с ручным направлением',
popperOptions: {
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['left', 'right'] // меняем позиции вручную
}
}
]
}
});
Это полезно для сложных интерфейсов, где контейнер имеет смешанное
направление текста или динамическое изменение dir.
Tippy.js позволяет управлять стилями через CSS. Для RTL можно
использовать селектор [dir="rtl"]:
[dir="rtl"] .tippy-box {
text-align: right;
direction: rtl;
}
Дополнительно рекомендуется проверять отступы для стрелки
(arrow) и внутренних элементов тултипа:
[dir="rtl"] .tippy-arrow {
left: auto;
right: 0;
}
Это гарантирует, что стрелка корректно отображается на противоположной стороне тултипа.
Если интерфейс поддерживает переключение языков на лету, можно
обновлять направление тултипа через метод setProps:
const tip = tippy('#btn', {
content: 'Динамический RTL',
placement: 'bottom-start'
});
// Переключение направления
function switchDirection(isRTL) {
document.getElementById('container').dir = isRTL ? 'rtl' : 'ltr';
tip.setProps({ placement: 'bottom-start' }); // пересчет позиции
}
Tippy.js автоматически пересчитывает позицию тултипа при изменении
placement или свойств Popper.js.
RTL может влиять на направление анимаций. Например, стандартная
анимация shift-away смещается в сторону start.
Для RTL:
tippy('#btn', {
content: 'RTL анимация',
animation: 'shift-away',
placement: 'left-start' // будет скорректировано в RTL
});
Popper.js автоматически корректирует смещение, но при кастомных
анимациях важно учитывать изменение transform-origin:
[dir="rtl"] .tippy-box[data-animation~='shift-away'] {
transform-origin: right center !important;
}
dir="rtl" на контейнере для
автоматической адаптации.start и end вместо
left/right.setProps.Tippy.js обеспечивает надежную поддержку RTL через интеграцию с Popper.js и гибкую систему опций, позволяя создавать полноценные мультиязычные интерфейсы с корректным позиционированием тултипов.