vue+element ui实现锚点定位


Posted in Vue.js onJune 29, 2021

本文实例为大家分享了vue + element ui 实现锚点定位的具体代码,供大家参考,具体内容如下

vue

<el-row :gutter="20">
   <el-col :span="3">
    <!--导航选择事件-->
    <el-menu :default-active="activeStep" @select="jump">
     <el-menu-item v-for="(item,index) in menuData" :index="`${index}`" :key="item.subjectId">
      <i class="el-icon-menu"></i>
      <span slot="title">{{item.subjectName}}</span>
     </el-menu-item>
    </el-menu>
   </el-col>
   <!--绑定scroll事件需要监听-->
   <el-col :span="21" class="scroll_cls" @scroll="onScroll">
    <div v-for="(item,index) in tableObject" :key="index" style="height:500px">
     <div class="title scroll-item" :id="item.name">{{item.name}}</div>
     <el-table :data="item.rows" :key="index">
      <el-table-column label="序号" type="index" width="50"></el-table-column>
      <el-table-column prop="channelId" label="渠道/团队id"></el-table-column>
      <el-table-column prop="channelName" label="渠道/团队"></el-table-column>
      <el-table-column prop="ruleCode" label="分配方案id"></el-table-column>
      <el-table-column prop="ruleName" label="分配方案名称"></el-table-column>
      <el-table-column prop="ruleVersion" label="版本号"></el-table-column>
      <el-table-column prop="hierarchy" label="级别">
       <template slot-scope="scope">
        <span>{{scope.row.hierarchy == 1 ? '项目' : '渠道团队'}}</span>
       </template>
      </el-table-column>
      <el-table-column label="有效期">
       <template slot-scope="scope">
        <span>{{scope.row.beginTime + '-' + scope.row.endTime}}</span>
       </template>
      </el-table-column>
      <el-table-column prop="creatorName" label="操作人"></el-table-column>
      <el-table-column prop="createTime" label="操作时间"></el-table-column>
      <el-table-column prop="orderCnt" label="关联订单">
       <template slot-scope="scope">
        <el-button
         @click="orderHandleClick(scope.row.orderCnt)"
         type="text"
         size="small"
        >{{scope.row.orderCnt}}</el-button>
       </template>
      </el-table-column>
      <el-table-column label="操作">
       <template slot-scope="scope">
        <el-button @click="settingHandleClick(scope.row)" type="text" size="small">设置分配方案</el-button>
       </template>
      </el-table-column>
     </el-table>
     <el-pagination
      v-if="item.total > 5"
      style="margin-top: 15px"
      size="small"
      @size-change="handleSizeChange($event,index)"
      @current-change="handleCurrentChange($event,index)"
      :current-page="ruleForm.ageNum"
      :page-sizes="[10, 30, 50, 100]"
      :page-size="ruleForm.pageSize"
      layout="total, sizes, prev, pager, next"
      :total="item.total"
     ></el-pagination>
    </div>
   </el-col>
</el-row>

js

// 滚动触发按钮高亮
methods: {
  onScroll(e) {
            let scrollItems = document.querySelectorAll(".scroll-item");
            console.log(scrollItems)
            console.log(e)
   for (let i = scrollItems.length - 1; i >= 0; i--) {
    // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
    let judge =
     e.target.scrollTop >=
     scrollItems[i].offsetTop - scrollItems[0].offsetTop;
    if (judge) {
                    console.log(i)
     this.activeStep = i.toString();
     break;
    }
   }
  },
  jump(index) {
            console.log(index)
   let target = document.querySelector(".scroll_cls");
   let scrollItems = document.querySelectorAll(".scroll-item");
   // 判断滚动条是否滚动到底部
   if (target.scrollHeight <= target.scrollTop + target.clientHeight) {
                console.log(index)
                console.log(typeof index)
    this.activeStep = index;
   }
            let total = scrollItems[index].offsetTop - scrollItems[0].offsetTop; // 锚点元素距离其offsetParent(这里是body)顶部的距离(待滚动的距离)
            console.log(total)
            let distance = document.querySelector(".scroll_cls").scrollTop; // 滚动条距离滚动区域顶部的距离
            console.log(distance)
   // let distance = document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset // 滚动条距离滚动区域顶部的距离(滚动区域为窗口)
   // 滚动动画实现, 使用setTimeout的递归实现平滑滚动,将距离细分为50小段,10ms滚动一次
   // 计算每一小段的距离
   let step = total / 50;
   if (total > distance) {
    smoothDown(document.querySelector(".scroll_cls"));
   } else {
    let newTotal = distance - total;
    step = newTotal / 50;
    smoothUp(document.querySelector(".scroll_cls"));
   }

   // 参数element为滚动区域
   function smoothDown(element) {
    if (distance < total) {
     distance += step;
                    element.scrollTop = distance;
     setTimeout(smoothDown.bind(this, element), 10);
    } else {
     element.scrollTop = total;
    }
   }

   // 参数element为滚动区域
   function smoothUp(element) {
    if (distance > total) {
     distance -= step;
     element.scrollTop = distance;
     setTimeout(smoothUp.bind(this, element), 10);
    } else {
     element.scrollTop = total;
    }
   }

   document.querySelectorAll('.scroll-item').forEach((item, index1) => {
     if (index === index1) {
       item.scrollIntoView({
         block: 'start',
         behavior: 'smooth'
       })
     }
   })
  },
  },
 mounted() {
       this.$nextTick(() => {
           console.log(1)
           window.addEventListener('scroll', this.onScroll,true)
       })
    },

css

.scroll_cls {
    height: 500px;
 overflow: auto;
}

转载自:原文链接点击这里

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

Vue.js 相关文章推荐
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
关于vue中如何监听数组变化
Apr 28 Vue.js
SSM VUE Axios详解
Oct 05 Vue.js
如何用vue实现网页截图你知道吗
Nov 17 Vue.js
Vue elementUI表单嵌套表格并对每行进行校验详解
Feb 18 Vue.js
vue3获取当前路由地址
Feb 18 Vue.js
vue使用echarts实现折线图
Mar 21 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
Vue OpenLayer 为地图绘制风场效果
Apr 24 Vue.js
vue项目如何打包之项目打包优化(让打包的js文件变小)
Apr 30 Vue.js
vue ant design 封装弹窗表单的使用
Jun 01 Vue.js
vue实现锚点定位功能
Vue实现tab导航栏并支持左右滑动功能
Vue3.0写自定义指令的简单步骤记录
vue.js Router中嵌套路由的实用示例
Jun 27 #Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
vue-router中hash模式与history模式的区别
Vue-Element-Admin集成自己的接口实现登录跳转
You might like
PHP7之Mongodb API使用详解
2015/12/26 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
python之验证码生成(gvcode与captcha)
2019/01/02 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
jupyter实现重新加载模块
2020/04/16 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
python 如何快速复制序列
2020/09/07 Python
python 实现&quot;神经衰弱&quot;翻牌游戏
2020/11/09 Python
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
运动会致辞稿50字
2014/02/04 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
广场舞大赛策划方案
2014/05/31 职场文书
学校党的群众路线教育实践活动整改措施
2014/10/25 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
工会经费申请报告
2015/05/15 职场文书
2015年教务工作总结
2015/05/23 职场文书
小学校本教研总结
2015/08/13 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
Python类方法总结讲解
2021/07/26 Python