vue中 tab锚点联动

vue中 tab锚点联动 代码

<template>
  <div class="scrollDemo">
    <div class="demoNav flex-center-center">
      <div
        class="demoNavItem"
        v-for="(item, index) in demoNavItem"
        :key="index"
        :class="{ navActive: idx == index }"
        @click="changNav(index)"
      >
        {{ item }}
      </div>
    </div>
    <div class="demoContent">
      <!-- 如果内容为循环,id则定义为:id="'demoItem'+index" -->
      <div
        :class="'demoItem demoItem' + index"
        :id="'demoItem' + index"
        :key="index + '_'"
        v-for="(item, index) in demoNavItem"
      >
        {{ item }}
      </div>
    </div>
  </div>
</template>
<script>
// 引入
var VueScrollTo = require("vue-scrollto");
export default {
  data() {
    return {
      idx: 0,
      scroll: null,
      demoNavItem: [
        "谷歌浏览器",
        "uc浏览器",
        "IE浏览器",
        "火狐浏览器",
        "360浏览器",
        "猎豹浏览器",
      ],
    };
  },

  mounted() {
    // scroll代表滚动条距离页面顶部距离
    window.addEventListener("scroll", this.dataScroll);
  },
  watch: {
    //监听scroll变量,只要滚动条位置变化就会执行方法loadScroll
    scroll: function () {
      this.loadScroll();
    },
  },
  methods: {
    // 导航选中效果
    changNav(index) {
      this.idx = index;
      VueScrollTo.scrollTo(document.getElementById("demoItem" + index), 300, {
        offset: -50,
      });
    },
    // 用循环的方式将每个标题离顶部的距离与滚动条当前位置对比来确定哪个标题需要变为高亮
    loadScroll: function () {
      var self = this;
      var sections = document.getElementsByClassName("demoItem");
      for (var i = sections.length - 1; i >= 0; i--) {
        if (self.scroll >= sections[i].offsetTop - 100) {
          //我在上面规定了每个el-tab-pane标签的name属性值为tab+该标签的index值
          self.idx = i;
          break;
        }
      }
    },
    dataScroll: function () {
      this.scroll =
        document.documentElement.scrollTop || document.body.scrollTop;
    },
  },
};
</script>
<style scoped>
.flex-center-center {
  display: flex;
  align-items: center;
  justify-content: center;
}
.demoNav {
  width: 100%;
  height: 70px;
  background: rgba(0, 31, 144, 1);
  position: sticky;
  left: 0;
  top: 0;
}
.demoNavItem {
  font-size: 40px;
  color: #fff;
  margin-left: 30px;
  cursor: pointer;
}
.navActive {
  color: red;
}
.demoItem {
  width: 100%;
  height: 600px;
  font-size: 60px;
  color: #fff;
  text-align: center;
  padding: 60px 0 0 0;
}
.demoItem0 {
  background: gold;
}
.demoItem1 {
  background: red;
}
.demoItem2 {
  background: chartreuse;
}
.demoItem3 {
  background: cornflowerblue;
}
.demoItem4 {
  background: cyan;
}
.demoItem5 {
  background: darkmagenta;
}
</style>
入代码片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值