Vue2——监听页面滚动实现菜单和页面对应

简介: Vue2——监听页面滚动实现菜单和页面对应

前言

如题,监听页面的滚动并激活相应的菜单,一个老项目的维护,后面反正要全部重构,这里就先实现功能就好了;

内容

元素内容

主要是添加相应的id,生成目录后直接通过锚点来跳转

监听滚动

window.addEventListener('scroll', () => {
      const sections = document.getElementsByClassName('card-item')
      for (let i = 0; i < sections.length; i++) {
        const top = sections[i].getBoundingClientRect().top
        if (top < 100 && top > 0) this.activeIndex = i
        if (i === 4 && top < 0) this.activeIndex = 6
      }
    }, true)

DEMO示例

<template>
  <div>
    <el-row :gutter="24">
      <el-col
        :span="4"
        style="position: sticky;top: 10px;"
      >
        <el-card
          class="card-item-menu"
          shadow="hover"
        >
          <div class="menu">项目计划</div>
          <ul>
            <li
              v-for="(item, index) in menu"
              :key="item.href"
              class="sub-item"
            >
              <el-link
                :class="{active: index == activeIndex}"
                :href="item.href"
                :underline="false"
              >{{ item.title }}</el-link>
            </li>
          </ul>
        </el-card>
      </el-col>
      <el-col :span="20">
        <el-form
          ref="form"
          :model="form"
          :rules="rules"
          label-width="80px"
        >
          <!-- 营销目标和场景 -->
          <el-card
            id="p1"
            class="card-item"
            shadow="hover"
            header="营销目标与场景"
          >
          </el-card>
          <!-- 投放内容与目标 -->
          <el-card
            id="p2"
            class="card-item"
            shadow="hover"
            header="投放内容与目标"
          >
          </el-card>
          <!-- 投放版位 -->
          <el-card
            id="p3"
            class="card-item"
            shadow="hover"
            header="投放版位"
          >
          </el-card>
          <!-- 投放定向 -->
          <AudienceTarget
            id="p4"
            :form-data="formData"
            @data="handleFormData"
          />
          <!-- 排期与预算 -->
          <el-card
            id="p5"
            class="card-item"
            shadow="hover"
            header="排期与预算"
          >
          </el-card>
          <!-- 搜索快投 -->
          <el-card
            id="p6"
            class="card-item"
            shadow="hover"
            header="搜索快投"
          >
          </el-card>
          <!-- 项目名称 -->
          <el-card
            id="p7"
            class="card-item"
            shadow="hover"
            header="项目名称"
          >
          </el-card>
          <el-form-item>
            <el-button
              type="primary"
              @click="onSubmit"
            >立即创建</el-button>
            <el-button>取消</el-button>
          </el-form-item>
        </el-form>
      </el-col>
    </el-row>
  </div>
</template>
<script>
export default {
  data() {
    return {
      activeIndex: 0,
      menu: [
        { href: '#p1', title: '营销目标与场景' },
        { href: '#p2', title: '投放内容与目标' },
        { href: '#p3', title: '投放版位' },
        { href: '#p4', title: '用户定向' },
        { href: '#p5', title: '排期与预算' },
        { href: '#p6', title: '搜索快投' },
        { href: '#p7', title: '项目名称' }
      ],
    }
  },
  mounted() {
    window.addEventListener('scroll', () => {
      const sections = document.getElementsByClassName('card-item')
      for (let i = 0; i < sections.length; i++) {
        const top = sections[i].getBoundingClientRect().top
        if (top < 100 && top > 0) this.activeIndex = i
        if (i === 4 && top < 0) this.activeIndex = 6
      }
    }, true)
  },
  methods: {
  }
}
</script>
<style scoped>
.card-item-menu {
    margin: 15px;
    height: 800px;
    cursor: pointer;
    .menu {
        color: #2a55e5;
        font-weight: 800;
        height: 22px;
        line-height: 22px;
    }
    .active {
          color: #2a55e5;
    }
    .sub-item {
        display: flex;
        min-height: 40px;
        padding: 8px 0px;
        color: #64666b;
        padding-left: 40px;
        padding-right: 9px;
        align-items: center;
        font-size: 14px;
        cursor: pointer;
        position: relative;
    }
    .sub-item:before {
        content: "";
        width: 4px;
        height: 4px;
        display: block;
        border-radius: 4px;
        background-color: #64666b;
        position: relative;
        right: 18px;
        transition: all 0.2s;
    }
}
.card-item {
    /* width: 800px; */
    margin: 10px;
}
:deep(.el-select .el-input__inner) {
    width: 300px;
}
:deep(.el-input__inner) {
    width: 300px;
}
</style>

学无止境,谦卑而行.

目录
相关文章
|
4月前
|
JavaScript 网络架构
vue3 Elementplus 动态路由菜单不跳转问题
vue3 Elementplus 动态路由菜单不跳转问题
127 1
|
4月前
|
JavaScript
vue滚动到页面底部时加载
vue滚动到页面底部时加载
27 1
|
3月前
|
JavaScript
vue【解决方案】页面/路由跳转后,滚动条消失,页面无法滚动
vue【解决方案】页面/路由跳转后,滚动条消失,页面无法滚动
137 0
|
5月前
|
JavaScript
Vue 路由切换时页面刷新页面重新渲染
在Vue中,路由切换并不自动重新渲染页面,这可能导致传递参数到子组件时出现问题。使用`this.$route.replace(&#39;地址&#39;)`或`this.$route.push({name:&#39;地址&#39;,params:{key:value}})`进行跳转,但子组件不会响应变化。为解决此问题,需监听`$route`对象的变化,如图所示,通过`watch: {$route}`确保页面更新。
318 5
|
5月前
Vue3实现列表的拖拽切换
Vue3实现列表的拖拽切换
|
10月前
Vue3监听页面是否全屏(监听与自动退出全屏)
Vue3监听页面是否全屏(监听与自动退出全屏)
359 0
|
JavaScript
返回顶部vue、监听页面滚动(整理)
返回顶部vue、监听页面滚动(整理)
|
前端开发
Vue3 v-for点击切换样式
Vue3 v-for点击切换样式
73 0
Vue3 通过点击按钮实现页面跳转
Vue3 通过点击按钮实现页面跳转
936 0
|
JavaScript 容器
vue项目切换页面会白屏,刷新之后才会正常显示(已解决)
vue项目切换页面会白屏,刷新之后才会正常显示(已解决)
512 0