vue3楼层滚动
时间: 2025-04-20 21:34:07 浏览: 22
### 实现 Vue3 中的楼层滚动效果
在 Vue3 中实现楼层滚动效果可以通过监听窗口滚动事件来动态更新当前显示的内容。为了确保 DOM 已经完全加载并可以操作,应当在 `onMounted` 生命周期钩子内添加相应的逻辑。
对于吸顶、锚点以及滚动高亮按钮的效果,在组件挂载完成后立即设置滚动监听器是一个常见做法[^1]:
```javascript
import { onMounted, ref } from 'vue';
export default {
setup() {
const handleScroll = () => {
// 处理滚动逻辑
};
onMounted(() => {
window.addEventListener('scroll', handleScroll);
// 清除监听器防止内存泄漏
return () => {
window.removeEventListener('scroll', handleScroll);
};
});
return {};
}
};
```
如果希望使用第三方库如 Better Scroll 来增强页面内的滚动体验,则需要注意该插件应在 DOM 完全呈现后再初始化其实例对象,并传入目标容器作为参数[^2]:
```javascript
// 假设已经安装了 better-scroll 并导入 bs
import BScroll from '@better-scroll/core';
import ObserveDOM from '@better-scroll/observe-dom'; // 如果需要观察 dom 变化可引入此模块
BScroll.use(ObserveDOM);
setup() {
let scrollInstance;
onMounted(() => {
nextTick().then(() => {
const wrapperElement = document.querySelector('.wrapper');
scrollInstance = new BScroll(wrapperElement, {});
});
return () => {
if (scrollInstance) {
scrollInstance.destroy();
}
};
});
return {};
}
```
当仅依赖于原生 JavaScript 和 CSS 而不借助额外框架时,也可以通过计算各部分相对于视口顶部的距离来进行楼层定位和切换样式[^3]:
```html
<template>
<div class="floor-container">
<!-- 各个楼层 -->
<section v-for="(item, index) in floors" :key="index" :id="'floor-' + item.id">{{ item.name }}</section>
<!-- 导航栏 -->
<nav id="navigation-bar"></nav>
</div>
</template>
<script lang="ts">
import { defineComponent, reactive, computed, watchEffect } from 'vue';
export default defineComponent({
name: 'FloorExample',
setup() {
const floors = reactive([
{ id: 0, name: '一楼' },
{ id: 1, name: '二楼' },
{ id: 2, name: '三楼' }
]);
function getOffsetTop(element: HTMLElement): number {
var rect = element.getBoundingClientRect();
return Math.round(rect.top);
}
const activeIndex = computed<number>(() => {
let currentIndex = -1;
for (let i = 0; i < floors.length; ++i) {
const floorElm = document.getElementById(`floor-${floors[i].id}`);
if (!floorElm || getOffsetTop(floorElm as HTMLElement) >= 0 && getOffsetTop(floorElm as HTMLElement) <= 80 /* 预留导航高度 */) {
currentIndex = i;
break;
}
}
return currentIndex;
});
watchEffect(() => {
console.log(activeIndex.value);
updateNavigationHighlighting(activeIndex.value);
});
function updateNavigationHighlighting(index: number){
// 更新导航栏选中状态...
}
return {
floors,
activeIndex
};
}
});
</script>
```
上述代码展示了如何利用 Vue 的组合 API 结合简单的算法判断哪个楼层处于可见区域,并据此调整导航栏上的激活项。
阅读全文
相关推荐


















