Компонент Affix в библиотеке Naive UI предназначен для «прилипания» элементов интерфейса к определённой позиции на странице при прокрутке. Он полезен для закрепления кнопок, панелей навигации, уведомлений и других элементов, которые должны оставаться видимыми независимо от положения пользователя на странице.
Ключевые свойства Affix:
position — указывает сторону, к которой элемент будет
прикреплён: 'top', 'bottom',
'left', 'right'.offset — задаёт расстояние в пикселях от края
контейнера или окна до закреплённого элемента.target — функция, возвращающая элемент, относительно
которого осуществляется закрепление. Если не задан, используется окно
(window).z-index — уровень слоя закреплённого элемента, чтобы он
корректно отображался поверх других элементов.Пример базового использования:
import { NAffix, NButton } from 'naive-ui'
<NAffix :offset="20" position="top">
<NButton>Закреплённая кнопка</NButton>
</NAffix>
В этом примере кнопка остаётся видимой в верхней части окна, даже при прокрутке страницы.
Affix позволяет точно контролировать положение
элемента с помощью комбинации position и
offset.
position="top" с offset="0" фиксирует
элемент строго у верхнего края контейнера.position="bottom" с offset="10" фиксирует
элемент внизу, отступив на 10 пикселей.position="left" или position="right".Смещение можно динамически изменять, передавая в offset
вычисляемое значение или реактивную переменную:
<NAffix :offset="dynamicOffset" position="top">
<NButton>Динамическое смещение</NButton>
</NAffix>
Здесь dynamicOffset может изменяться в зависимости от
условий страницы или действий пользователя.
По умолчанию Affix ориентируется на окно браузера,
но для сложных интерфейсов часто требуется закреплять элемент
относительно конкретного контейнера. Для этого используется свойство
target, которое принимает функцию, возвращающую
DOM-элемент.
Пример закрепления элемента внутри определённого блока:
<template>
<div ref="scrollContainer" style="height: 300px; overflow-y: scroll;">
<NAffix :target="getContainer" :offset="10" position="top">
<NButton>Закреплено внутри блока</NButton>
</NAffix>
<div style="height: 800px;"></div>
</div>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const scrollContainer = ref(null)
const getContainer = () => scrollContainer.value
return { scrollContainer, getContainer }
}
}
</script>
Элемент закрепляется внутри блока с прокруткой, а не относительно окна.
Affix поддерживает реактивное управление видимостью. Можно скрывать или показывать закреплённый элемент на основе состояния компонента:
<NAffix v-if="isVisible" offset="20" position="top">
<NButton>Появляющийся элемент</NButton>
</NAffix>
Для плавного появления можно использовать CSS-переходы или сторонние компоненты анимации, применяя их к содержимому Affix.
Affix хорошо сочетается с другими компонентами библиотеки:
Пример сочетания с кнопкой «Наверх»:
<NAffix position="bottom" :offset="50">
<NButton @click="scrollToTop">Наверх</NButton>
</NAffix>
<script>
export default {
methods: {
scrollToTop() {
window.scrollTo({ top: 0, beh * avior: 'smooth' })
}
}
}
</script>
updatePosition() вручную через
ref.target, иначе элемент будет «прыгать» при прокрутке.left/right).offset, что позволяет создавать интерактивные
интерфейсы.Affix в Naive UI — гибкий и мощный инструмент для создания удобного интерфейса, который остаётся функциональным даже при прокрутке больших страниц.