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实现表格合并功能
Dec 01 Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
vue 数据操作相关总结
Dec 17 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
Jan 05 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
Feb 23 Vue.js
Vue多选列表组件深入详解
Mar 02 Vue.js
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
解读Vue组件注册方式
May 15 Vue.js
vue代码分块和懒加载非必要资源文件
Apr 11 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
PHP用户指南-cookies部分
2006/10/09 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
PhpStorm terminal无法输入命令的解决方法
2016/10/09 PHP
php strftime函数的详细用法
2018/06/21 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python 容器总结整理
2017/04/04 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
2017/07/07 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
python实现磁盘日志清理的示例
2020/11/05 Python
python使用scapy模块实现ARP扫描的过程
2021/01/21 Python
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
结婚典礼证婚词
2014/01/11 职场文书
课外小组活动总结
2014/08/27 职场文书
护士个人年度总结范文
2015/02/13 职场文书
工会工作个人总结
2015/03/03 职场文书
行政答辩状范文
2015/05/21 职场文书
gtx1650怎么样 gtx1650显卡相当于什么级别
2022/04/08 数码科技
使用Python开发冰球小游戏
2022/04/30 Python
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis