Компонент Affix из библиотеки Ant Design предназначен для закрепления элементов на странице при прокрутке. Он полезен для создания фиксированных шапок, боковых панелей, кнопок действий или других элементов интерфейса, которые должны оставаться видимыми пользователю независимо от положения скролла.
offsetTop Определяет расстояние в пикселях от верхнего края окна до элемента, при котором он закрепляется. Например:
<Affix offsetTop={10}>
<Button type="primary">Закреплённая кнопка</Button>
</Affix>
В этом примере кнопка будет фиксироваться, когда верх окна прокрутки достигнет 10 пикселей от верхнего края кнопки.
offsetBottom Альтернатива
offsetTop, задаёт расстояние от нижнего края окна.
Используется для закрепления элемента снизу:
<Affix offsetBottom={20}>
<Button type="primary">Фиксированная снизу кнопка</Button>
</Affix>target Указывает элемент, относительно которого
происходит привязка Affix. По умолчанию привязка идёт к
window. Можно указать конкретный контейнер:
const container = () => document.getElementById('scrollableDiv');
<Affix target={container} offsetTop={5}>
<Button type="primary">Кнопка внутри контейнера</Button>
</Affix>onChange Коллбэк, вызываемый при изменении
состояния закрепления элемента. Принимает один аргумент:
true — элемент закреплён, false — нет.
<Affix offsetTop={50} onCha nge={affixed => console.log(affixed)}>
<Button>Отслеживание закрепления</Button>
</Affix>Компонент Affix хорошо интегрируется с различными элементами интерфейса, такими как Menu, Button, Tabs, Card. Например, можно создать закреплённую панель навигации:
<Affix offsetTop={0}>
<Menu mode="horizontal" defaultSelectedKeys={['1']}>
<Menu.Item key="1">Главная</Menu.Item>
<Menu.Item key="2">О нас</Menu.Item>
<Menu.Item key="3">Контакты</Menu.Item>
</Menu>
</Affix>
Здесь меню будет оставаться вверху страницы при прокрутке.
Если содержимое страницы меняется динамически, можно использовать
target для корректного поведения:
const container = () => document.getElementById('scrollContainer');
<Affix target={container} offsetTop={10}>
<Button type="primary">Закреплённая кнопка в динамическом контейнере</Button>
</Affix>
Это позволяет элементу правильно фиксироваться внутри конкретного блока при прокрутке.
Несколько компонентов Affix на одной странице могут иметь разные
offsetTop или offsetBottom для независимого
закрепления:
<Affix offsetTop={10}>
<Button type="primary">Верхняя кнопка</Button>
</Affix>
<Affix offsetBottom={20}>
<Button type="dashed">Нижняя кнопка</Button>
</Affix>
Такой подход часто используется для закрепления элементов в разных частях интерфейса.
Хотя Affix по умолчанию не поддерживает анимацию
появления/исчезновения, её можно реализовать через CSS-переходы и
изменение классов при onChange:
<Affix offsetTop={100} onCha nge={affixed => {
document.getElementById('myButton').classList.toggle('affixed', affixed);
}}>
<Button id="myButton">Анимированная кнопка</Button>
</Affix>
#myButton.affixed {
transition: all 0.3s ease;
transform: scale(1.05);
}
scroll, поэтому на страницах с большим количеством
скроллируемых элементов нужно минимизировать лишние Affix-компоненты или
использовать throttle/debounce для
оптимизации.offsetBottom,
так как динамические изменения высоты экранной клавиатуры могут сдвигать
фиксированные элементы.Компонент Affix является мощным инструментом для создания удобного и предсказуемого интерфейса. Его свойства позволяют гибко закреплять элементы, интегрировать их в динамические контейнеры и отслеживать состояние закрепления. Использование Affix вместе с другими компонентами Ant Design повышает удобство навигации и улучшает пользовательский опыт.