Компонент Affix предназначен для закрепления элементов интерфейса в определённой позиции при прокрутке страницы. Это особенно полезно для навигационных панелей, кнопок действия или других элементов, которые должны оставаться видимыми пользователю независимо от прокрутки контента.
В Element Plus компонент реализован через директиву
el-affix и предоставляет высокую степень контроля над
поведением закрепления.
Базовый синтаксис выглядит следующим образом:
<template>
<el-affix :offset-top="50">
<el-button type="primary">Закреплённая кнопка</el-button>
</el-affix>
</template>
<script>
export default {
data() {
return {
offsetTop: 50
};
}
};
</script>
Пояснение ключевых параметров:
offset-top — расстояние от верхней границы окна до
закреплённого элемента. Элемент будет фиксироваться, когда прокрутка
достигнет этой величины.offset-bottom — альтернативный параметр, позволяющий
закреплять элемент снизу экрана.target — задаёт область, внутри которой будет работать
закрепление. По умолчанию используется window, но можно
привязать к конкретному блоку с прокруткой.Компонент Affix предоставляет события для отслеживания изменений состояния закрепления:
<el-affix
:offset-top="100"
@change="handleAffixChange"
>
<el-button>Кнопка с событиями</el-button>
</el-affix>
<script>
export default {
methods: {
handleAffixChange(isAffixed) {
console.log('Закрепление изменилось:', isAffixed);
}
}
};
</script>
change — вызывается при закреплении или отпускании
элемента. Аргумент isAffixed принимает значение
true, если элемент закреплён, и false, если
нет.Affix корректно реагирует на изменение размеров окна и содержимого.
Чтобы обеспечить точное позиционирование при изменении контента внутри
закреплённого блока, рекомендуется использовать комбинацию с
watch:
<el-affix :offset-top="topValue" ref="affix">
<el-card>Динамический контент</el-card>
</el-affix>
<script>
export default {
data() {
return {
topValue: 20
};
},
mounted() {
window.addEventListener('resize', this.updateAffix);
},
beforeUnmount() {
window.removeEventListener('resize', this.updateAffix);
},
methods: {
updateAffix() {
this.$refs.affix.updatePosition();
}
}
};
</script>
Метод updatePosition() позволяет вручную пересчитать
положение закреплённого элемента при изменении размеров контейнера или
окна.
Affix часто используется совместно с:
Пример закрепления вкладок:
<el-affix :offset-top="0">
<el-tabs v-model="activeTab">
<el-tab-pane label="Первая вкладка">Контент 1</el-tab-pane>
<el-tab-pane label="Вторая вкладка">Контент 2</el-tab-pane>
</el-tabs>
</el-affix>
targetМожно закрепить элемент относительно определённого блока с прокруткой, а не всей страницы.
<el-affix :offset-top="10" :target="getContainer">
<el-button>Внутри блока</el-button>
</el-affix>
<script>
export default {
methods: {
getContainer() {
return document.querySelector('.scroll-container');
}
}
};
</script>
<style>
.scroll-container {
height: 400px;
overflow-y: scroll;
border: 1px solid #dcdfe6;
padding: 10px;
}
</style>
При этом закрепление срабатывает только внутри указанного контейнера, что удобно для модальных окон или внутренних панелей.
offset-top, иначе элемент может никогда не
закрепиться.z-index, если нужно,
чтобы элемент был поверх других блоков.updatePosition() при
динамическом изменении размеров родительских элементов или
контента.Affix в Element Plus — универсальный инструмент для создания закреплённых элементов интерфейса, позволяющий гибко управлять позиционированием, интегрироваться с другими компонентами и обрабатывать события закрепления.