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+iview分页组件的封装
Nov 17 Vue.js
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
vue添加自定义右键菜单的完整实例
Dec 08 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 Vue.js
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
vue-element-admin项目导入和导出的实现
May 21 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
windows下升级PHP到5.3.3的过程及注意事项
2010/10/12 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php去除字符串中空字符的常用方法小结
2015/03/17 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python中static相关知识小结
2018/01/02 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
jupyter notebook运行命令显示[*](解决办法)
2020/05/18 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
CSS3 简写animation
2012/05/10 HTML / CSS
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
某公司.Net方向面试题
2014/04/24 面试题
出生医学证明书
2014/09/15 职场文书
2014年护理工作总结范文
2014/11/14 职场文书