控制表格向上滚动距离最佳实践(以Element ui为例)

news2025/2/23 18:36:26

前言

在web开发中,有些时候使用的组件库的表格不支持滚动的属性或方法。这个时候我们就要自己去实现这一功能。在Element Plus里,组件库已经具备了支持滚动表格的属性或方法,但是在支持vue2的element ui里,Table组件本身不提供直接控制滚动距离的属性或方法。我们接下来就以element ui为例,实现表格滚动,以提供给大家实现类似功能的一些思路。

实现思路

1.我们首先需要获取表格距离浏览器顶部的高度

2.我们需要获取滚动到的指定行到浏览器顶部的高度

3.用滚动到的指定行到浏览器顶部的高度减去格距离浏览器顶部的高度获取需要滚动的高度

4.对DOM的API,scrollTop进行赋值,滚动到指定位置

Tips:借助DOM的API,getBoundingClientRect来获取指定dom到浏览器顶部的高度

核心代码

// 滚动表格
scrollTable(index = 0) {
  const tableBodyWrapper = this.$refs.dataFilterTable.bodyWrapper;
  tableBodyWrapper.scrollTop = 0;
  const tableItems = document.getElementsByClassName('el-table__row')
  const tableTop = tableBodyWrapper.getBoundingClientRect().top 
  const tableItemTop = tableItems[index].getBoundingClientRect().top
  const scrollTop = tableItemTop - tableTop

  if (tableBodyWrapper) {
    //表格滚动
    tableBodyWrapper.scrollTop = scrollTop
  }
},

 完整代码示例

<template>
  <div>
    <div class="flex mb10 justify-end">
      <el-input-number v-model="line" class="mr10" :min="1" />
      <el-button type="primary" @click="scrollTable">滚动到第{{ line }}行</el-button>
    </div>
    <el-table ref="elTable" :data="tableData" border style="width: 100%" :height="tableHeight">
      <el-table-column prop="id" label="ID" width="180" />
      <el-table-column prop="date" label="日期" width="180" />
      <el-table-column prop="name" label="姓名" width="180" />
      <el-table-column prop="address" label="地址" />
    </el-table>
  </div>
</template>

<script>
export default {
  data() {
    return {
      line: 1,
      tableHeight: 580,
      tableData: []
    }
  },
  created() {
    this.getData()
  },
  mounted() {
    window.addEventListener('resize', this.getNewTableHeight)
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.getNewTableHeight)
  },
  methods: {
    scrollTable() {
      if (this.line > this.tableData.length) return this.$message.warning('超出数据范围')

      const tableBodyWrapper = this.$refs.elTable.bodyWrapper;
      tableBodyWrapper.scrollTop = 0;
      const tableItems = document.getElementsByClassName('el-table__row')
      const tableTop = tableBodyWrapper.getBoundingClientRect().top 
      const tableItemTop = tableItems[this.line - 1].getBoundingClientRect().top
      const scrollTop = tableItemTop - tableTop

      if (tableBodyWrapper) {
        //表格滚动
        tableBodyWrapper.scrollTop = scrollTop
      }
    },
    getNewTableHeight() {
      this.tableHeight = document.documentElement.clientHeight / (695 / 580)
    },
    getData() {
      const newTableData = []
      for (let index = 0; index < 100; index++) {
        let address = ''
        if (index % 2 === 0) {
          address = '上海市普陀区金沙江路 1518 弄'
        } else {
          address =
            '上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄上海市普陀区金沙江路 1517 弄'
        }
        newTableData.push({
          id: index + 1,
          date: '2016-05-02',
          name: '王小虎',
          address
        })
      }
      this.tableData = newTableData
    }
  }
}
</script>

<style lang="scss" scoped>
.flex {
  display: flex;
}
.justify-end {
  justify-content: flex-end;
}

.mr10 {
  margin-right: 10px;
}

.mb10 {
  margin-bottom: 10px;
}
</style>

效果展示

拓展 

getBoundingClientRect是什么?

getBoundingClientRect 是一个 DOM 方法,用于返回元素的大小及其相对于视口(viewport)的位置。它提供了非常详细的布局信息,包括元素的 top、right、bottom 和 left 边缘的位置,以及宽度和高度等属性。

返回值

getBoundingClientRect 返回一个 DOMRect 对象,该对象包含以下属性:

  • top:元素上边缘相对于视口顶部的距离。
  • right:元素右边缘相对于视口左侧的距离。
  • bottom:元素下边缘相对于视口顶部的距离。
  • left:元素左边缘相对于视口左侧的距离。
  • width:元素的宽度(等于 right - left)。
  • height:元素的高度(等于 bottom - top)。
  • x:等同于 left
  • y:等同于 top

使用场景

getBoundingClientRect 在许多场景中都非常有用,例如:

  • 检测元素是否在视口中可见:通过比较 top 和 bottom 与视口的高度,可以判断元素是否完全或部分可见。
  • 实现滚动效果:根据元素的位置动态调整滚动行为。
  • 定位绝对或固定位置的元素:确保这些元素相对于其他元素或视口正确对齐。
  • 碰撞检测:在游戏中或交互式应用中检测两个元素是否重叠。

 注意事项

  • 视口依赖性getBoundingClientRect 返回的坐标是相对于视口的,而不是相对于整个文档。如果你需要相对于文档的坐标,可以使用 element.offsetLeft 和 element.offsetTop,或者将视口坐标转换为文档坐标。
  • 滚动条影响:如果页面有滚动条,getBoundingClientRect 的结果会受到滚动条的影响。你可以结合 window.scrollX 和 window.scrollY 来获取相对于整个文档的坐标。
  • 性能考虑:频繁调用 getBoundingClientRect 可能会影响性能,因为它会触发浏览器重新计算布局(reflow)。因此,在性能敏感的应用中,应该尽量减少调用次数。

动态更新 

由于 getBoundingClientRect 返回的结果是基于当前布局状态的,因此当窗口大小改变、滚动或者元素样式发生变化时,你可能需要重新调用此方法以获取最新的布局信息。

总之,getBoundingClientRect 是一个非常强大的工具,可以帮助开发者精确地了解页面元素的布局信息。通过合理使用,可以实现更加复杂和精细的前端交互效果。

scrollTop是什么?

scrollTop 是一个用于获取或设置元素滚动条垂直位置的属性。它在处理页面或元素的滚动行为时非常有用。以下是关于 scrollTop 的详细说明:

获取和设置

  • 获取scrollTop 可以用来获取某个元素内部滚动条的垂直位置,即滚动了多少像素。
  • 设置:你也可以通过设置 scrollTop 来改变元素内部滚动条的位置。

属性值

  • 返回值:当作为获取器使用时,scrollTop 返回一个整数,表示从元素顶部到视口顶部的距离(单位为像素)。
  • 设置值:当作为设置器使用时,scrollTop 接受一个整数值,表示要滚动到的目标位置(单位为像素)。

适用元素

  • document.documentElement 或 document.body:对于整个页面的滚动,可以使用 document.documentElement.scrollTop 或 document.body.scrollTop。需要注意的是,在不同的浏览器中,这两个属性的行为可能有所不同。现代浏览器通常推荐使用 document.documentElement.scrollTop
  • 任何具有滚动条的元素:如 divsection 等设置了 overflow: auto 或 overflow: scroll 的块级元素。

scrollTop 是一个非常有用的属性,可以帮助开发者精确地控制和获取元素的滚动状态。通过合理使用,可以实现更加复杂和精细的滚动效果和交互体验。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu16.04ros-用海龟机器人仿真循线系统

下载安装sudo apt-get install ros-kinetic-turtlebot ros-kinetic-turtlebot-apps ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator ros-kinetic-kobuki-ftdi sudo apt-get install ros-kinetic-rocon-*echo "source /opt/ros/kinetic/setup.bash…

6.3 Postman环境变量与全局变量

欢迎大家订阅【软件测试】 专栏&#xff0c;开启你的软件测试学习之旅&#xff01; 文章目录 前言1 变量类型2 环境变量&#xff08;Environment Variables&#xff09;3 全局变量&#xff08;Global Variables&#xff09;4 环境变量与全局变量的区别 前言 为了提高测试的灵活…

概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。

目录 1 例子1&#xff1a;最典型的&#xff0c;最简单的数组的均值&#xff0c;方差的求法 2 例子1的问题&#xff1a;例子1只是1个特例&#xff0c;而不是普遍情况。 2.1 例子1各种默认假设&#xff0c;导致了求均值和方差的特殊性&#xff0c;特别简单。 2.2 我觉得 加权…

模型 QFD(质量功能展开/质量屋)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。将客户需求转化为产品设计。 1 模型 QFD&#xff08;质量功能展开&#xff09;的应用 1.1 电信服务及网络维护过程质量改进QFD应用案例 背景介绍&#xff1a; 随着中国加入WTO和国家对电信管制的普遍…

ECharts柱状图-柱图38,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

Android XR 应用程序开发 | 从 Unity 6 开发准备到应用程序构建的步骤

在本文中 将解释为 Android XR 开发做准备的步骤&#xff0c;从下载 Unity 6 到项目和构建。 &#xff08;这次我将解释使用 Mac 的设置&#xff0c;但 Windows 的过程通常相同。 &#xff09; 如果您的许可证是 Personal&#xff0c;您仍然可以使用 Unity 开发 Android XR 应…

204页PPT金税四期监管要求与最新政策及风险防范-培训课件

这份资料是关于金税四期监管要求、最新政策及风险防范的培训课件&#xff0c;包含204页PPT内容。核心内容涉及金税四期的发展历程、与金税三期的主要变化、指挥决策系统、税务风险预警指标、重点监控行为、税务稽查重点领域、避税方法及处罚、以及企业自查和税务风险管控原理。…

比较器基本玩法

1 红外水龙头 1 比较器的工作特性 2 红外接收二极管的工作原理 1 红外发射二极管和红外接收二极管 2 红外接收二极管接收到&#xff0c;产生的电流是100uA&#xff0c;即电压等于4V 3 自动出水水龙头 4 比较器内部结构 1 有一些比较器需要加上拉电阻&#xff08;类似开漏输…

基于Qt的登陆界面设计

目标 自由发挥登录界面的应用场景&#xff0c;实现一个登录窗口的界面。 要求&#xff1a;每行代码都要有注释 代码 // 设置窗口大小为600x400像素 this->resize(600,400); // 设置窗口标题为"TheWitcher 巫师3&#xff1a;狂猎" this->setWindowTitle(&qu…

数据库建模工具 PDManer

数据库建模工具 PDManer 1.PDManer简介2.PDManer使用 1.PDManer简介 PDManer&#xff08;元数建模&#xff09;是一款功能强大且易于使用的开源数据库建模工具。它不仅支持多种常见数据库&#xff0c;如MySQL、PostgreSQL、Oracle、SQL Server等&#xff0c;还特别支持国产数据…

排序算法深度好文(图解 + 代码解析 + 误区 QA )——学排序看这一篇就够了!!!

排序算法 一、概述 1. 内部排序 (1) 冒泡排序 (2) 选择排序 a. 简单选择排序 b. 堆排序 (3) 插入排序 a. 直接插入排序 b. 希尔排序 (4) 快速排序 快速排序 hoare 版本 快速排序挖坑法 优化一随机化快速排序 优化二中位数三分法 (5) 归并排序 (6) 基数排序 2. …

【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】

目录&#x1f60b; <第1关&#xff1a;顺序结构的应用> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第2关&#xff1a;交换变量值> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第…

git stash 的文件如何找回

在Git中&#xff0c;如果你使用了git stash命令来保存你的工作进度&#xff0c;但之后想要找回这些被stash的文件&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. 查看stash列表 首先&#xff0c;使用git stash list命令来查看当前保存的所有stash记录。这个命令会列出…

【报表查询】.NET开源ORM框架 SqlSugar 系列

文章目录 前言实践一、按月统计没有为0实践二、 统计某月每天的数量实践三、对象和表随意JOIN实践四、 List<int>和表随意JOIN实践五、大数据处理实践六、每10分钟统计Count实践七、 每个ID都要对应时间总结 前言 在我们实际开发场景中&#xff0c;报表是最常见的功能&a…

基于asp.net游乐园管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

电脑上怎么运行手机APP(电脑上运行手机APP的4种方法)

玩家可能不愿意在小屏幕上使用 Android 应用程序。此外&#xff0c;某些游戏玩家可能更喜欢在更大的屏幕上寻找刺激的体验&#xff0c;例如 PC 提供的体验&#xff0c;这可以增强他们的乐趣。因此&#xff0c;他们可能对如何在 PC 上流畅地运行 Android 应用程序感到好奇。本指…

oscp学习之路,Kioptix Level1靶场小白速通教程

oscp学习之路&#xff0c;Kioptix Level1靶场小白速通教程 有意向学习oscp的可以私信我一起交流学习 1.前期准备 首先下载好靶场文件&#xff0c;通过nmap进行扫描&#xff0c;确定IP地址和开放端口 发现IP是192.168.201.129,开放的端口为22,80,111,139,443,1024这几个端口。访…

【Ubuntu】设置静态Ip

查看网卡 ifconfig | grep -A 5 -B 2 192 修改配置文件 sudo vim /etc/netplan/00-installer-config.yamlnetwork:ethernets:enp0s3:dhcp4: noaddresses:- 192.168.1.100/24gateway4: 192.168.1.1nameservers:addresses:- 8.8.8.8- 8.8.4.4​​​​​

演员念真主演电视剧《依依向北风》获奖

2024年12月17日&#xff0c;南京广播电视集团和江苏12家城市台的领导、嘉宾&#xff0c;全国其他省市电视台嘉宾&#xff0c;影视公司代表、项目主创团队代表等&#xff0c;相聚南京国际青年会议酒店&#xff0c;举行江苏城市联合公司“城市之星”项目资源推介会暨2024年度“城…

Word使用分隔符实现页面部分分栏

文章目录 Word使用分隔符实现页面部分分栏分隔符使用页面设置 Word使用分隔符实现页面部分分栏 分隔符使用 word中的分隔符&#xff1a; 前面不分栏&#xff0c;后面分栏(或前面分栏&#xff0c;后面不分栏)&#xff0c;只需要在分隔位置处插入分隔符&#xff1a;“连续”即…