首页 > 其他分享 >Vue2——监听页面滚动实现菜单和页面对应

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

时间:2023-09-12 10:57:46浏览次数:40  
标签:activeIndex 菜单 title top item href Vue2 sections 页面

前言

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

内容

元素内容

主要是添加相应的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>

标签:activeIndex,菜单,title,top,item,href,Vue2,sections,页面
From: https://www.cnblogs.com/wangyang0210/p/17695566.html

相关文章

  • js实现页面打印功能实例代码(附去页眉页脚功能代码)
    <html><head></head><styletype="text/css"media="screen">@mediaprint{.print{display:block;}.notPrint{display:none;}}</style><scriptlanguage="javascript">functionprevi......
  • 删除百度网盘windows右键菜单的脚本
    以下代码保存为任意文件名.bat,然后右键“以管理员身份运行”即可regdeleteHKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\YunShellExt/fregdeleteHKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\YunShellExt/fpause     原文链接https://zhu......
  • 过滤器:禁止浏览器缓存所有动态页面
    禁止浏览器缓存所有动态页面意味着阻止浏览器在访问网站上的动态生成内容时将这些内容存储在本地缓存中。动态页面通常是那些在每次加载时都会根据用户请求或其他因素而生成不同内容的页面,而不是静态页面,其内容在每次访问时都保持不变。禁止浏览器缓存动态页面可以确保用户在访问......
  • 基于PHP vue2+element+ laravel8+ mysql开发的不良事件管理系统源码
    技术架构:PHP vue2+element+laravel8+mysql5.7+vscode不良事件上报系统通过“事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、以及“事后的原因分析和工作持续优化”,结合预存上百套已正在使用的模板,帮助医院从对护理事件、药品事件、医疗器械事件、......
  • vue 页面导出为pdf与word
    vue页面导出为pdf与word一.导出为word 基于 docxtemplater 来导出word文档的方法1.安装引用依赖//安装docxtemplaternpminstalldocxtemplaterpizzip--save//安装jszip-utilsnpminstalljszip-utils--save//安装jszipnpminstalljszip--save//安装......
  • 使用Github Action在Github Pages上部署vue页面
    GithubAction部分:name:NodeJSon:push:branches:["master"]#SetspermissionsoftheGITHUB_TOKENtoallowdeploymenttoGitHubPagespermissions:contents:write#Allowonlyoneconcurrentdeployment,skippingrunsqueuedbetwee......
  • Vue2x的自定义指令
    在某些情况下,我们需要对底层DOM进行操作,而内置的指令不能满足需求,就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义,钩子函数会接收到指令所绑定的元素作为参数。定义指令常用两种方式进行自定义指令,一种是全局定义,另一种在当前组件中定义//局......
  • vue2打包组件发布到npm
    1.使用vuecreateprojectName新建一个项目2.将src的文件夹名称改为example,便于我们调试代码3.增加packages文件夹,其下面的index.js代码如下importpanelfrom'./panel/index.vue'constcomponents=[panel]constinstall=function(Vue){if(install.i......
  • 给鼠标右键增加可执行程序菜单
    问题在文件夹下按住shift+鼠标右键,即可出现在此处打开cmd窗口选项,如何添加一个自定义命令呢,比如打开git添加方案右键菜单分为在空白处右键(桌面右键)在文件上右键在文件夹上右键对应的目录地址:空白处右键:HKEY_CLASSES_ROOT/Directory/background/shell文件夹右键:HKEY_CLA......
  • Django管理后台访问和登录页面访问数据不一致的问题
    Django管理后台访问和登录页面访问数据不一致的问题问题现象我再创建商品购物车功能后,发现这个功能页面需要放在管理后台。在测试功能时是直接配置路由访问http://localhost:8088/view_cart/是可以正常加载购物车的相关功能的,然后将购物车功能加到管理后台,添加之后发现没有查到......