vue实现侧边定位栏

 更新时间:2022年07月15日 16:25:16   作者:什么什么什么?  
这篇文章主要为大家详细介绍了vue实现侧边定位栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了vue实现侧边定位栏的具体代码,供大家参考,具体内容如下

实现思路:

1.通过点击侧边栏,定位到响应的内容
2.滑动滑动栏,侧边栏同步高亮对应的item

效果图如下:

1. 通过点击侧边栏,定位到响应的内容

如果是用html的话我们可以用 锚点 的办法进行定位;
在vue中,我们可以通过获取组件的高度,将滑动栏定位到对应的位置

在进入主题之前我们需要先了解3个关于获取高度的属性

1.scrollTop 滑动栏中的滑块离视区最顶部的距离

document.documentElement.scrollTop || document.body.scrollTop

2.clientHeight 视区的高度

document.documentElement.clientHeight || document.body.clientHeight

3.scrollHeight 滑动栏里面的滑动块的高度

document.documentElement.scrollHeight || document.body.scrollHeight

vue中我们可以通过this.$refs.xxx.$el.offsetTop获取组件距离页面最顶部的距离,通过赋值给document.documentElement.scrollTop选中组件距离页面最顶部的高度,控制滑动框滑到页面对应位置。相关代码如下:

页面代码

// 页面组件代码
<div>
    <btl-header />
    <div class="reports">
      <side-bar v-bind="sideBarData" />
      <div class="main">
        <live-overview-part
          ref="liveOverview"
          :shopNameOptions="allShopName"
          :dateSelectorData="dateType_0" />
        <procurenment-alert
          ref="procurenmentAlert"
          :carBrandOptions="carBrandOptions"
          :shopNameOptions="allShopName"
          :dateSelectorData="dateType_2" />
        <sales-overview
          ref="salesOverview"
          :shopNameOptions="allShopName"
          :dateSelectorData1="pardsType_0"
          :dateSelectorData2="dateType_1" />
        <inquiry-data
          ref="inquiryData"
          :shopNameOptions="allShopName"
          :dateSelectorData="dateType_2" />
        <transaction-data
          ref="transactionData"
          :carBrandOptions="carBrandOptions"
          :shopNameOptions="allShopName"
          :qualityOptions="qualityOptions"
          :colorSeries="colorSeries"
          :dateSelectorData="dateType_2" />
      </div>
    </div>

//  获取组件距离页面顶部高度 !!!
 <script>
mounted() {
    // !!注意,需要页面渲染完才能获取各个盒子的高度
    this.sideBarData.offsetTopliveOverview = this.$refs.liveOverview.$el.offsetTop;
    this.sideBarData.offsetTopprocurenmentAlert = this.$refs.procurenmentAlert.$el.offsetTop;
    this.sideBarData.offsetTopsalesOverview = this.$refs.salesOverview.$el.offsetTop;
    this.sideBarData.offsetTopinquiryData = this.$refs.inquiryData.$el.offsetTop;
    this.sideBarData.offsetToptransactionData = this.$refs.transactionData.$el.offsetTop;
   },
  </script>

侧边栏实现代码

// 侧边栏代码
<template>
  <hn-card class="sidebar">
    <ul class="nav-tabs">
      <li
        class="activeTip"
        ref="activeTip"></li>
      <li
        @click="clickanchor('liveOverview',0)"
        class="item"
        :class="active==='liveOverview'?'active':'noActive'">实时总览</li>
      <li
        class="item"
        :class="active==='procurenmentAlert'?'active':'noActive'"
        @click="clickanchor('procurenmentAlert',1)">采购预警</li>
      <li
        class="item"
        :class="active==='salesOverview'?'active':'noActive'"
        @click="clickanchor('salesOverview',2)">销售概览</li>
      <li
        class="item"
        :class="active==='inquiryData'?'active':'noActive'"
        @click="clickanchor('inquiryData',3)">询价数据</li>
      <li
        class="item"
        :class="active==='transactionData'?'active':'noActive'"
        @click="clickanchor('transactionData',4)">交易数据</li>
      <li
        class="item"
        :class="active==='top'?'active':'noActive'"
        @click="clickanchor('top')">返回顶部</li>
    </ul>
  </hn-card>
</template>

// 侧边栏js
<script>
methods: {
// 点击侧边栏item时触发
// 通过document.documentElement.scrollTop控制滑动栏位置
    clickanchor(itemName, i) {
      if (itemName === 'top') {
        document.documentElement.scrollTop = 0; // 滑动栏位置
        this.active = itemName;
        this.$refs.activeTip.style.transform = `translateY(${196}px)`;
        return;
      }
      this.$refs.activeTip.style.transform = `translateY(${i * 39}px)`;
      document.documentElement.scrollTop = this[`offsetTop${itemName}`];
      this.active = itemName;
    },
</script>

2. 滑动滑动栏,侧边栏同步高亮对应的item

通过监听滑动栏滑动,获取滑动块距离页面顶部的高度,和组件距离页面顶部的高度进行对比,反向设置滑动栏的高亮位置;

// 监听滑动栏滚动,通过监听滚动到的位置,到
    scrollChange() {
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop || 0;
      const windowHeight = document.documentElement.clientHeight || document.body.clientHeight || 0;
      const scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight || 0;
      const allContentOffsettop = [
        'offsetTopliveOverview',
        'offsetTopprocurenmentAlert',
        'offsetTopsalesOverview',
        'offsetTopinquiryData',
        'offsetToptransactionData'];
      if (scrollTop === 0) {
        if (this.active !== 'top') {
          this.active = 'top';
          this.$refs.activeTip.style.transform = `translateY(${196}px)`;
        }
      } else if (scrollTop + windowHeight > scrollHeight || scrollTop + windowHeight === scrollHeight) {
        if (this.active !== 'transactionData') {
          this.active = 'transactionData';
          this.$refs.activeTip.style.transform = `translateY(${157}px)`;
        }
      } else {
        for (let i = 0; i < allContentOffsettop.length; i++) {
          if (this[allContentOffsettop[i]] - 1 > scrollTop) {
            const contentName = allContentOffsettop[i - 1].replace('offsetTop', '');
            if (this.active !== contentName) {
              this.active = contentName;
              this.$refs.activeTip.style.transform = `translateY(${(i - 1) * 39}px)`;
            }
            break;
          }
        }
      }
    },
  },
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • vue+express+jwt持久化登录的方法

    vue+express+jwt持久化登录的方法

    这篇文章主要介绍了vue+express+jwt持久化登录的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • el-input限制输入正整数的两种实现方式

    el-input限制输入正整数的两种实现方式

    el-input框是Element UI库中的一个输入框组件,用于接收用户的输入,这篇文章主要介绍了el-input限制输入正整数,需要的朋友可以参考下
    2024-02-02
  • vue验证码组件使用方法详解

    vue验证码组件使用方法详解

    这篇文章主要为大家详细介绍了vue验证码组件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 详解Vue新增内置组件的使用

    详解Vue新增内置组件的使用

    这篇文章主要为大家介绍了Vue新增内置组件的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • Vue中的v-for循环key属性注意事项小结

    Vue中的v-for循环key属性注意事项小结

    这篇文章主要介绍了Vue中的v-for循环key属性注意事项小结,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • vue 音乐App QQ音乐搜索列表最新接口跨域设置方法

    vue 音乐App QQ音乐搜索列表最新接口跨域设置方法

    这篇文章主要介绍了vue 音乐App QQ音乐搜索列表最新接口跨域设置方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • vue2和vue3中provide/inject的基本用法示例

    vue2和vue3中provide/inject的基本用法示例

    Vue中的provide/inject是一种组件间通信的方式,它允许父组件向子组件传递数据,而不需要通过props或事件来实现,下面这篇文章主要给大家介绍了关于vue2/vue3中provide/inject的基本用法的相关资料,需要的朋友可以参考下
    2023-04-04
  • vue中filters 传入两个参数 / 使用两个filters的实现方法

    vue中filters 传入两个参数 / 使用两个filters的实现方法

    这篇文章主要介绍了vue中filters 传入两个参数 / 使用两个filters的实现方法,文中给大家提到了Vue 中的 filter 带多参的使用方法,需要的朋友可以参考下
    2019-07-07
  • 基于Vue实现手势签名

    基于Vue实现手势签名

    这篇文章主要为大家详细介绍了基于Vue实现手势签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Vue2.0父组件与子组件之间的事件发射与接收实例代码

    Vue2.0父组件与子组件之间的事件发射与接收实例代码

    这篇文章主要介绍了Vue2.0父组件与子组件之间的事件发射与接收实例代码,需要的朋友可以参考下
    2017-09-09

最新评论