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/zh-tw/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

發表回復

登錄後才能評論