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 相关文章推荐
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
vue使用exif获取图片旋转,压缩的示例代码
Dec 11 Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
Vue图片裁剪组件实例代码
Jul 02 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
vue里使用create, mounted调用方法
Apr 26 Vue.js
Vue Element plus使用方法梳理
Dec 24 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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
PHP4实际应用经验篇(7)
2006/10/09 PHP
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
2014/04/10 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
python多进程读图提取特征存npy
2019/05/21 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
keras 权重保存和权重载入方式
2020/05/21 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
服装设计行业个人的自我评价
2013/12/20 职场文书
银行学习十八大感想
2014/01/11 职场文书
我的五年职业生涯规划
2014/01/23 职场文书
学生会主席竞聘书
2014/03/31 职场文书
库房保管员岗位职责
2014/04/07 职场文书
学校节能减排方案
2014/06/13 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
初三数学教学反思
2016/02/17 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
Python中requests做接口测试的方法
2021/05/30 Python
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python