当前位置:首页 > VUE

vue实现左侧楼层导航

2026-01-20 17:30:30VUE

Vue实现左侧楼层导航的方法

数据准备

创建一个包含楼层信息的数组,每个楼层对象包含id、名称和对应的DOM元素id。例如:

data() {
  return {
    floors: [
      { id: 1, name: "楼层1", targetId: "floor1" },
      { id: 2, name: "楼层2", targetId: "floor2" }
    ],
    activeFloor: null
  }
}

模板结构

在模板中创建导航列表和对应的楼层区域:

<div class="container">
  <div class="nav-wrapper">
    <ul class="floor-nav">
      <li v-for="floor in floors" 
          :key="floor.id"
          :class="{active: activeFloor === floor.id}"
          @click="scrollToFloor(floor)">
        {{ floor.name }}
      </li>
    </ul>
  </div>

  <div class="content">
    <div v-for="floor in floors" 
         :id="floor.targetId" 
         class="floor-section">
      <h2>{{ floor.name }}</h2>
      <!-- 楼层内容 -->
    </div>
  </div>
</div>

滚动定位功能

实现点击导航跳转到对应楼层的方法:

methods: {
  scrollToFloor(floor) {
    const element = document.getElementById(floor.targetId)
    if (element) {
      element.scrollIntoView({ behavior: "smooth" })
      this.activeFloor = floor.id
    }
  }
}

滚动监听

添加滚动事件监听,自动更新当前激活的楼层导航:

mounted() {
  window.addEventListener("scroll", this.handleScroll)
},
beforeDestroy() {
  window.removeEventListener("scroll", this.handleScroll)
},
methods: {
  handleScroll() {
    const scrollPosition = window.scrollY
    this.floors.forEach(floor => {
      const element = document.getElementById(floor.targetId)
      if (element) {
        const offsetTop = element.offsetTop
        const offsetHeight = element.offsetHeight
        if (scrollPosition >= offsetTop && scrollPosition < offsetTop + offsetHeight) {
          this.activeFloor = floor.id
        }
      }
    })
  }
}

样式优化

添加基础样式使导航固定并美化:

.container {
  display: flex;
}
.nav-wrapper {
  position: fixed;
  width: 200px;
}
.floor-nav {
  list-style: none;
  padding: 0;
}
.floor-nav li {
  padding: 10px;
  cursor: pointer;
}
.floor-nav li.active {
  color: #42b983;
  font-weight: bold;
}
.floor-section {
  min-height: 100vh;
  margin-left: 220px;
}

性能优化

对于大量楼层的情况,可以使用节流函数优化滚动事件:

import { throttle } from "lodash"

methods: {
  handleScroll: throttle(function() {
    // 原有逻辑
  }, 100)
}

响应式处理

添加响应式处理,在小屏幕下隐藏导航或改为其他交互方式:

vue实现左侧楼层导航

@media (max-width: 768px) {
  .nav-wrapper {
    display: none;
  }
  .floor-section {
    margin-left: 0;
  }
}

标签: 楼层vue
分享给朋友:

相关文章

vue实现头像剪切

vue实现头像剪切

Vue 实现头像剪切的实现方法 使用 vue-cropperjs 库 vue-cropperjs 是一个基于 cropperjs 的 Vue 组件,专门用于图片裁剪。安装方式如下: npm inst…

vue实现动态

vue实现动态

Vue 实现动态路由的方法 在 Vue 中实现动态路由通常涉及以下几个关键步骤: 使用 Vue Router 的动态路由匹配 通过 Vue Router 的 :param 语法可以实现动态路由匹配。…

vue实现树形

vue实现树形

Vue 实现树形组件 在 Vue 中实现树形结构通常需要递归组件和动态数据绑定。以下是实现树形组件的几种常见方法。 递归组件实现 递归组件是 Vue 中实现树形结构的核心方法。通过组件调用自身,可以…

vue实现 页面

vue实现 页面

Vue 实现页面的核心方法 创建 Vue 项目 使用 Vue CLI 或 Vite 快速初始化项目。Vue CLI 是官方脚手架工具,适合传统项目;Vite 提供更快的现代构建体验。 npm cre…

vue源码实现

vue源码实现

Vue 源码实现解析 Vue.js 的核心实现可以分为响应式系统、虚拟 DOM、模板编译、组件化等几个关键部分。以下是对这些核心机制的详细解析。 响应式系统 Vue 的响应式系统基于 Object.…

vue实现前端跳转

vue实现前端跳转

Vue 实现前端跳转的方法 在 Vue 中实现前端跳转通常使用 Vue Router,以下是几种常见的跳转方式: 声明式导航(模板中使用 <router-link>) 在模板中直接使用…