最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3+element-plus實現(xiàn)兩個表格同步滾動功能

 更新時間:2025年06月28日 10:54:56   作者:mini_055  
現(xiàn)在需要兩個表格,為了方便對比左右的數(shù)據(jù),需要其中一邊的表格滾動時,另一邊的表格也跟著一起滾動,并且保持滾動位置的一致性,本文給大家介紹vue3+element-plus實現(xiàn)兩個表格同步滾動功能,感興趣的朋友一起看看吧

需求:現(xiàn)在需要兩個表格,為了方便對比左右的數(shù)據(jù),需要其中一邊的表格滾動時,另一邊的表格也跟著一起滾動,并且保持滾動位置的一致性。具體如下圖所示。

實現(xiàn)步驟:

  1. 確保兩個表格的寬度一致:如果兩個表格的寬度不一致,可能會導致滾動條的位置不同步。確保兩個表格的寬度相同(數(shù)據(jù)內(nèi)容超出表格行的寬度可以省略顯示)或根據(jù)需要調(diào)整。

  2. 使用相同的滾動容器:確保兩個表格的滾動容器具有相同的高度,這樣它們的滾動行為才會同步。

  3. 同步滾動事件:在兩個表格上監(jiān)聽滾動事件,并在事件觸發(fā)時同步另一個表格的滾動位置。

HTML結(jié)構(gòu):

創(chuàng)建一個包含兩個表格的容器,然后給容器一個固定的高度(因為要實現(xiàn)滾動必須要內(nèi)容超過高度了才會滾動)。

<template>
  <div class="container-box">
    <div class="flex table-box">
      <!-- 左邊表格 -->
      <div class="left-table" ref="leftTableWrapper">
        <el-table
          :data="LeftTableData"
          border
          ref="leftTableRef"
          style="width: 100%"
          height="100%"
          :fit="true"
          header-row-class-name="header-row"
          :cell-style="{
            'font-size': '12px',
            color: '#666666',
            height: '40px',
          }"
        >
          <template #empty>
            <div class="custom-empty">
              <el-empty
                :image="`${$global.imageBaseUrl}/ledger/billProcessing/icon_nodata.png`"
                description="暫無數(shù)據(jù)"
              />
            </div>
          </template>
          <el-table-column
            label="表頭1"
            prop="left1"
            align="center"
            min-width="150"
          />
          <el-table-column
            label="表頭2"
            prop="left2"
            align="center"
            width="100"
          />
        </el-table>
      </div>
      <!-- 右邊表格 -->
      <div class="right-table" ref="rightTableWrapper">
        <el-table
          :data="rightTableData"
          border
          ref="rightTableRef"
          style="width: 100%"
          height="100%"
          :fit="true"
          header-row-class-name="header-row"
          :cell-style="{
            'font-size': '12px',
            color: '#666666',
            height: '40px',
          }"
        >
          <template #empty>
            <div class="custom-empty">
              <el-empty
                :image="`${$global.imageBaseUrl}/ledger/billProcessing/icon_nodata.png`"
                description="暫無數(shù)據(jù)"
              />
            </div>
          </template>
          <el-table-column
            label="表頭1"
            prop="right1"
            align="center"
            min-width="150"
          />
          <el-table-column
            label="表頭2"
            prop="right2"
            align="center"
            width="100"
          />
        </el-table>
      </div>
    </div>
  </div>
</template>

JavaScript邏輯:

  • 模擬左右表格的數(shù)據(jù),初始設(shè)置100條。

  • 在兩個表格上監(jiān)聽滾動事件,并在事件觸發(fā)時同步另一個表格的滾動位置。

  • 使用nextTick確保DOM更新完成后再同步滾動位置。

  • setupTableScrollSync 函數(shù)通過獲取 el-table 的 body 容器,給左右表格的滾動事件綁定同步邏輯,避免循環(huán)觸發(fā)(用 isSyncingScroll 標記)。

<script lang="ts" setup>
interface tableInfo {
  left1?: string
  left2?: string
  right1?: string
  right2?: string
}
let LeftTableData = ref<tableInfo[]>([])
let rightTableData = ref<tableInfo[]>([])
const leftTableRef = ref()
const rightTableRef = ref()
const leftTableWrapper = ref()
const rightTableWrapper = ref()
onMounted(() => {
  for (let index = 0; index < 100; index++) {
    let obj = {
      left1: `表${index + 1}`,
      left2: `表${index + 1}-1`,
    }
    let obj2 = {
      right1: `表${index + 1}`,
      right2: `表${index + 1}-1`,
    }
    LeftTableData.value.push(obj)
    rightTableData.value.push(obj2)
  }
  // 表格滾動同步
  nextTick(() => {
    setupTableScrollSync()
  })
})
// 滾動同步實現(xiàn)
let isSyncingScroll = false
function setupTableScrollSync() {
  // 獲取表格body的滾動容器
  const getTableBodyWrapper = (tableRef: any) => {
    // el-table exposes $el, then .querySelector('.el-scrollbar__wrap')
    // 兼容 el-table 2.x/3.x
    if (!tableRef?.value) return null
    // 先找新版class
    let body = tableRef.value.$el.querySelector('.el-scrollbar__wrap')
    if (!body) {
      // 舊版class
      body = tableRef.value.$el.querySelector('.el-table__body-wrapper')
    }
    return body
  }
  const leftBody = getTableBodyWrapper(leftTableRef)
  const rightBody = getTableBodyWrapper(rightTableRef)
  if (!leftBody || !rightBody) return
  // 解綁舊的監(jiān)聽,防止重復
  leftBody.onscroll = null
  rightBody.onscroll = null
  leftBody.onscroll = (e: Event) => {
    if (isSyncingScroll) return
    isSyncingScroll = true
    rightBody.scrollTop = leftBody.scrollTop
    isSyncingScroll = false
  }
  rightBody.onscroll = (e: Event) => {
    if (isSyncingScroll) return
    isSyncingScroll = true
    leftBody.scrollTop = rightBody.scrollTop
    isSyncingScroll = false
  }
}
</script>

CSS 樣式:

<style lang="scss" scoped>
.container-box {
  background-color: #fff;
  border-radius: 4px;
  margin: 16px;
  height: calc(100vh - 100px);
  padding: 24px;
  .table-box {
    height: calc(100% - 465px);
    .left-table {
      margin-right: 16px;
    }
    .left-table,
    .right-table {
      :deep(.header-row th) {
        background-color: #f5f5f5;
        text-align: center;
      }
    }
  }
}
</style>

想要實現(xiàn)表格同步滾動,其實還有一個辦法,就是用一個表格來實現(xiàn)(前提是數(shù)據(jù)是放在一個數(shù)組里的) ,然后中間想要空隙,通過CSS樣式為表格的某些行或列添加間隔,這種方法實現(xiàn)簡單,無需處理滾動邏輯。如果需要真正的固定列+滾動列效果,推薦用兩個表格來實現(xiàn);如果只是視覺分隔,一個表格來實現(xiàn)更簡單。

到此這篇關(guān)于vue3+element-plus,實現(xiàn)兩個表格同步滾動的文章就介紹到這了,更多相關(guān)vue3 element-plus表格同步滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Vue3中為路由Query參數(shù)標注類型的方法

    在Vue3中為路由Query參數(shù)標注類型的方法

    這篇文章主要介紹了在Vue3中如何為路由Query參數(shù)標注類型,我們就針對這個話題如何為路由Query參數(shù)標注類型為例,看看Composable和IOC容器的代碼風格究竟有什么不同,需要的朋友可以參考下
    2024-08-08
  • 詳解Vue使用命令行搭建單頁面應(yīng)用

    詳解Vue使用命令行搭建單頁面應(yīng)用

    本篇文章主要介紹了詳解Vue使用命令行搭建單頁面應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 深入了解Vue3 中 this的使用

    深入了解Vue3 中 this的使用

    在Vue3中,this的使用方式與Vue2存在較大差異,尤其是在引入組合式API后,本文詳細解析了Vue3中this的使用情況、底層源碼和設(shè)計理念,并提供了面試技巧,感興趣的可以了解一下
    2024-09-09
  • 關(guān)于vue-cli 3配置打包優(yōu)化要點(推薦)

    關(guān)于vue-cli 3配置打包優(yōu)化要點(推薦)

    這篇文章主要介紹了vue-cli 3配置打包優(yōu)化要點,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • vue實現(xiàn)跨頁面定位錨點區(qū)域方式

    vue實現(xiàn)跨頁面定位錨點區(qū)域方式

    這篇文章主要介紹了vue實現(xiàn)跨頁面定位錨點區(qū)域方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue3中Tree樹組件開發(fā)文檔(附使用示例)

    Vue3中Tree樹組件開發(fā)文檔(附使用示例)

    在Vue中樹形組件是一種用于展示層級結(jié)構(gòu)數(shù)據(jù)的UI組件,常用于展示如文件目錄、組織架構(gòu)等具有層級關(guān)系的數(shù)據(jù),這篇文章主要介紹了Vue3中Tree樹組件開發(fā)文檔的相關(guān)資料,需要的朋友可以參考下
    2026-03-03
  • vue修改props數(shù)據(jù)報錯的問題及解決

    vue修改props數(shù)據(jù)報錯的問題及解決

    這篇文章主要介紹了vue修改props數(shù)據(jù)報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Vue3+Spring Framework框架開發(fā)實戰(zhàn)

    Vue3+Spring Framework框架開發(fā)實戰(zhàn)

    這篇文章主要為大家介紹了Vue3+Spring Framework框架開發(fā)實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • vue生命周期和react生命周期對比【推薦】

    vue生命周期和react生命周期對比【推薦】

    本文通過實例代碼給大家介紹了vue生命周期和react生命周期對比 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • vue中axios解決跨域問題和攔截器的使用方法

    vue中axios解決跨域問題和攔截器的使用方法

    下面小編就為大家分享一篇vue中axios解決跨域問題和攔截器的使用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評論

闽清县| 襄垣县| 时尚| 昌平区| 临桂县| 雅江县| 彭泽县| 中卫市| 昆山市| 汪清县| 侯马市| 刚察县| 大埔县| 上饶市| 汕头市| 城市| 湖北省| 岱山县| 治多县| 开江县| 象州县| 东阳市| 灵山县| 项城市| 琼结县| 平定县| 威远县| 江陵县| 尼木县| 同仁县| 大安市| 芜湖市| 焉耆| 息烽县| 宝丰县| 饶平县| 龙口市| 电白县| 延庆县| 黄石市| 蒙自县|