当前位置:首页 > 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)
}

响应式处理

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

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

vue实现左侧楼层导航

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

相关文章

vue伪函数实现

vue伪函数实现

Vue 伪函数实现方法 伪函数(Mock Function)在 Vue 中常用于测试或模拟某些逻辑,以下是几种常见的实现方式: 使用 Jest 的 jest.fn() 在单元测试中,可以通过 Jes…

vue实现多用户登录

vue实现多用户登录

实现多用户登录的基本思路 在Vue中实现多用户登录通常需要结合后端API完成身份验证,并通过前端路由、状态管理(如Vuex或Pinia)和本地存储(如localStorage)来管理用户会话。以下是关…

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…

vue实现分屏

vue实现分屏

Vue 实现分屏的方法 分屏功能通常用于展示多个独立内容区域,以下是几种常见的实现方式: 使用 CSS Grid 布局 通过 CSS Grid 可以轻松创建分屏布局,在 Vue 组件中直接应用样式…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…