Stair rolling effect

<template>
  <div class="box">
    <ul>
      <li v-for="(item, inx) in 10" :key="inx" :class="[`lou_${inx}`, { 'active': inx == current }]">
        <a @click="navCheck(inx)">导航{
   
   { inx }}</a>
      </li>
    </ul>
    <div class="content" ref="scrollview" @scroll="onScroll">
      <section :id="[`lou_${inx}`]" v-for="(item, inx) in 10" :key="inx">
        <h6>标题{
   
   { inx }}</h6>
        <div>
          <p>内容内容内容内容内容内容内容内容内容内容内容</p>
          <p>内容内容内容内容内容内容内容内容内容内容内容</p>
          <p>内容内容内容内容内容内容内容内容内容内容内容</p>
          <p>内容内容内容内容内容内容内容内容内容内容内容</p>
        </div>
      </section>
    </div>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        current: 0,
        isNav: false,
        timer: null
      }
    },
    beforeDestroy() {
      clearTimeout(this.timer)
    },
    methods: {
      // 导航点击
      navCheck(inx) {
        this.current = inx
        this.isNav = true
        clearTimeout(this.timer)
        this.timer = setTimeout(() => {
          this.isNav = false
        }, 1000)
        let lou = `#lou_${inx}`
        document.querySelector(lou).scrollIntoView({
          behavior: "smooth",
          // block: 'center',  // 滑动到视图中间位置
        })
      },
      // 内容区域滚动
      onScroll() {
        let scrollTop = this.$refs['scrollview'].scrollTop;
        // 获取所有锚点元素
        const AllNav = document.querySelectorAll('.content section')
        // 获取所有锚点元素的 offsetTop
        const offsetTopArr = []
        AllNav.forEach(item => {
          offsetTopArr.push(item.offsetTop - 68)
        })
        for(let i = 0; i < offsetTopArr.length; i++) {
          // 内容已经完全不可见
          if(scrollTop >= offsetTopArr[i]) {
            // 导航点击时,不滚动设置
            if(!this.isNav) {
              this.current = i
            }
          }
        }
      },
    },
  }
</script>

<style lang="scss" scoped>
  .box {
    display: flex;
    height: 600px;
    ul {
      width: 80px;
      padding-top: 30px;
      li {
        line-height: 36px;
        &.active {
          background: rgba(0,102,255,0.1);
        }
        &:hover{
          background: rgba(0,102,255,0.1);
        }
        a{
          display: block;
          padding: 0 16px;
        }
      }
    }
    .content{
      width: 400px;
      overflow-y: auto;
      box-sizing: border-box;
      section{
        padding: 30px 0;
        border-bottom: 1px solid #ddd;
        h6{
          font-size: 20px;
        }
        > div{
          margin-top: 24px;
          color: #595959;
          line-height: 24px;
        }
      }
    }
  }
</style>

Guess you like

Origin blog.csdn.net/qq_42660374/article/details/132082518