table自动滚动原理和优化大全

一、table自动滚动优化

1、优化原理:


function scrollTable(){
  let table = document.getElementById('table');
  let tableHeight = parseInt(window.getComputedStyle(table).height); // 获取table高度
  let rows = table.getElementsByTagName('tr');
  let firstRowHeight = parseInt(window.getComputedStyle(rows[0]).height); // 获取行高
  let rowIndex = parseInt(table.scrollTop / firstRowHeight); // 获取当前滚动到第几行  
  let visibleRowCount = parseInt(tableHeight / firstRowHeight); // 获取可见的行数
  let lastRowIndex = parseInt((tableHeight + table.scrollTop) / firstRowHeight); // 获取最后一行的索引
  let requiredRowCount = visibleRowCount * 2; // 设置缓存的最小行数
  let currentRowCount = rows.length; // 当前行数
  let bufferRowCount = requiredRowCount - currentRowCount; 
  if(bufferRowCount > 0) {
    for(let i = 0; i < bufferRowCount; i++){
      let newRow = createNewRow(); // 创建一行
      table.appendChild(newRow); // 插入新行
    }
  }
  else if(lastRowIndex >= currentRowCount - 1) {
    // 加载更多数据
  }
}

2、优化内容:

使用虚拟滚动技术将很多行文本直接放到Web页面上, 而只在用户需要滚动时才显示他们。这样可以更好地处理大量数据,而不会影响渲染性能。

3、实现方法:

将table设置为一个div的子元素,并设置固定高度和滚动条,而不是将所有行直接添加到table中。

4、代码示例:


<div style="height: 300px;overflow: auto;">
  <table>  
    <tbody id="tableBody" style="height: 100%;"></tbody>
  </table>
</div>

二、vue table滚动

1、实现原理:

使用vue的组件化思想,对table进行封装并提供滚动功能。

2、代码示例:


<template>
  <div class="scrollable-table" ref="tableWrapper">
    <table>
      <thead>
        <tr>
          <th v-for="heading in headings">{{ heading }}</th>
        </tr>
      </thead>
      <tfoot>
        <tr v-if="fetching"><td colspan="{{ headings.length }}">Loading...</td></tr>
      </tfoot>
      <tbody>
        <tr v-for="row in rows">
          <td v-for="key in Object.keys(row)">{{ row[key] }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</template>

<script>
export default {
  name: 'ScrollableTable',
  props: {
    rows: Array,
    headings: Array,
    fetchMoreRows: Function
  },
  data () {
    return {
      fetching: false
    }
  },
  mounted () {
    this.$refs.tableWrapper.addEventListener('scroll', this.handleScroll)
  },
  beforeDestroy () {
     this.$refs.tableWrapper.removeEventListener('scroll', this.handleScroll)
  },
  methods: {
    handleScroll (event) {
      const tableBody = this.$refs.tableWrapper.querySelector('table tbody')
      const distance = tableBody.getBoundingClientRect().bottom - this.$refs.tableWrapper.getBoundingClientRect().bottom
      
      if (distance < 10 && !this.fetching) {
        this.fetching = true
        this.fetchMoreRows().then((newRows) => {
          this.fetching = false
          if (newRows) {
            this.rows.push(...newRows)
          }
        })
      }
    }
  }
}
</script>

三、antd table自动滚动

1、实现原理:

借助antd的组件库,使用虚拟滚动优化,提供table滚动功能。

2、代码示例:


<Table
  columns={columns}
  dataSource={data}
  scroll={{ y: 240 }}
/>

四、table横向滚动

1、实现原理:

对于table过宽的情况,可以使用CSS样式中的overflow-x属性和white-space属性来进行水平滚动。

2、代码示例:


table {
  width: 800px;
  overflow-x: scroll;
  white-space: nowrap;
}

五、listbox自动滚动

1、实现原理:

在ListBox control 下,当用户选择某个值时,可以将listbox选项自动滚动到选中项的位置。

2、代码示例:


function selectItem (itemIndex) {
  const listItem = document.getElementById(`list-item-${itemIndex}`)
  const list = document.getElementById('list')
  const listHeight = list.offsetHeight
  const itemHeight = listItem.offsetHeight
  const itemPosition = listItem.offsetTop
  const currentScrollTop = list.scrollTop
  const scrollTop = itemPosition - (listHeight - itemHeight) / 2
  list.scrollTop = scrollTop
}

六、el table滚动加载

1、实现原理:

使用Vue的Element UI组件库中的el-table,可以用虚拟滚动优化,并且提供滚动加载数据的功能。

2、代码示例:


<el-table
  :data="tableData"
  :row-height="40"
  height="320"
  style="width: 100%"
  ref="table"
  @scroll="scrollHandler"
  :highlight-current-row="false"
>
  <el-table-column
    prop="name"
    label="Name"
    width="180"
  />
  <el-table-column
    prop="address"
    label="Address"
    width="360"
  />
</el-table>

七、layui table滚动加载

1、实现原理:

使用LayUI中的table控件,可以根据滚动条的位置动态加载数据,实现滚动加载。

2、代码示例:


var tableIns = table.render({
  elem: '#demo',
  url: '/demo/table/user/',
  page: true,
  cols: [[
    {field:'id', title:'ID', width:80},
    {field:'username', title:'用户名', width:120},
    {field:'email', title:'邮箱', width:150},
    {field:'sign', title:'签名', width:200},
    {field:'sex', title:'性别', width:80},
    {field:'city', title:'城市', width:100},
    {field:'experience', title:'积分', width:80},
    {field:'ip', title:'IP', width:120},
    {field:'logins', title:'登入次数', width:100},
    {field:'joinTime', title:'加入时间', width:120}
  ]],
  done: function(res, curr, count) {
    console.log('done');
    if (res.code !== 0) {
      layer.msg(res.msg);
      return;
    }
    if (res.count === 0) {
      $(".layui-table-main").empty();
    }
  }
});

$(document).ready(function(argument) {
  $('.layui-table-view').scroll(function () {
    console.log('scroll');
    var scrollTop = this.scrollTop;
    var scrollHeight =  $("table").height();
    var windowHeight = $(this).height();
    if (scrollTop + windowHeight == scrollHeight) {
      table.reload('demo', { // 指定表格唯一标识符
        page: {
          curr: tableIns.config.page.curr + 1
        }
      });
    }
  });
});

八、table滚动显示

1、实现原理:

对于table列数量较多的情况,可以使用CSS样式中的overflow-y属性和fixed-layout属性来进行固定列滚动。

2、代码示例:


table {
  overflow-y: scroll;
  display: block;
  table-layout: fixed;
}
td {
  width: 300px;
}

九、table虚拟滚动选取

1、实现原理:

使用虚拟滚动技术将很多行文本直接放到Web页面上, 而只在用户需要滚动时才显示他们。这样可以更好地处理大量数据,而不会影响渲染性能。

2、代码示例:


function scrollTable(){
  let table = document.getElementById('table');
  let rowHeight = parseInt(window.getComputedStyle(rows[0]).height); // 获取行高
  let rowIndex = parseInt(table.scrollTop / rowHeight); // 获取当前滚动到第几行  
  let visibleRowCount = parseInt(table.offsetHeight / rowHeight); // 获取可见的行数
  let lastRowIndex = parseInt((table.offsetHeight + table.scrollTop) / rowHeight); // 获取最后一行的索引
  let requiredRowCount = visibleRowCount * 2; // 设置缓存的最小行数
  let currentRowCount = rows.length; // 当前行数
  let bufferRowCount = requiredRowCount - currentRowCount; 
  if(bufferRowCount > 0) {
    for(let i = 0; i < bufferRowCount; i++){
      let newRow = createNewRow(); // 创建一行
      table.appendChild(newRow); // 插入新行
    }
  }
  else if(lastRowIndex >= currentRowCount - 1) {
    // 查找选中行
    for(let i = rowIndex; i < lastRowIndex; i++) {
      if(rows[i].classList.contains('selected')){
        rows[i].classList.remove('selected');
      }
    }
  }
  // 批量选取行
  rows.slice(rowIndex, lastRowIndex).forEach((row) => {
    row.classList.add('selected');
  });
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/292111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-25 14:07
下一篇 2024-12-25 14:07

相关推荐

  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • Python语法大全解析

    本文旨在全面阐述Python语法,并提供相关代码示例,帮助读者更好地理解Python语言。 一、基础语法 1、Python的注释方式 # 这是单行注释 “”” 这是多行注释,可以注…

    编程 2025-04-29
  • 二级考级舞蹈大全目录

    本文将从以下多个方面对二级考级舞蹈大全目录进行详细阐述。 一、目录结构 二级考级舞蹈大全目录主要分为三级,即一级目录、二级目录和三级目录。其中,一级目录为舞蹈类型,二级目录为舞蹈名…

    编程 2025-04-29
  • Python命令大全及说明

    Python是一种高级编程语言,由Guido van Rossum于1989年底发明。它具有良好的语法结构和面向对象的编程思想,具有简洁、易读、易学的特点,是初学者以及专业开发人员…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • Python海龟库代码大全

    Python海龟库是Python语言中一个常用的绘图库,它提供了一套海龟绘图的API,使得使用者可以通过编写相应的代码来控制海龟的行进路径,从而实现各种图形的绘制。本文将以Pyth…

    编程 2025-04-28
  • Python语句大全

    本文将详细阐述Python语句大全,并给出代码实例。 一、基本语句 Python基本语句包括赋值语句、条件语句、循环语句等,其中最基础的是赋值语句。如下: a = 1 b = 2 …

    编程 2025-04-28
  • GloVe词向量:从原理到应用

    本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。 一、原理 GloVe(Glob…

    编程 2025-04-27
  • 编译原理语法分析思维导图

    本文将从以下几个方面详细阐述编译原理语法分析思维导图: 一、语法分析介绍 1.1 语法分析的定义 语法分析是编译器中将输入的字符流转换成抽象语法树的一个过程。该过程的目的是确保输入…

    编程 2025-04-27

发表回复

登录后才能评论