關(guān)于iview Element table 自適應(yīng)列寬問(wèn)題

Vue + iview-ui 遇到 iview內(nèi)的table沒(méi)有原生table那種列寬自適應(yīng)功能,在iview table API中并沒(méi)有找到自適應(yīng)的接口

table.png

同樣,Element table雖然擁有 fit 這個(gè)屬性但是使用上并沒(méi)發(fā)現(xiàn)有任何作用,在Element官方github上
issue #4159 大部分人討論方向都是通過(guò)遍歷計(jì)算每列最大寬度,但是當(dāng)數(shù)據(jù)多的時(shí)候性能會(huì)受到影響。
后來(lái)官方關(guān)掉了這個(gè)票,需要開(kāi)發(fā)人員自行解決。
noResult.jpg

不管是Element還是iview 針對(duì)table的封裝,都會(huì)自動(dòng)加入colgroup col 標(biāo)簽,并且對(duì)table加上table-layout: fixed已達(dá)到固定列寬的功能,反之若沒(méi)有這兩個(gè)條件,那么table自然就和原生table一樣擁有自適應(yīng)列寬的功能。

  1. 從css角度上 把colgroup col標(biāo)簽要屏蔽掉并且table 的table-layout: fixed css屬性還原成auto就達(dá)到了列寬自適應(yīng)的功能。
<Table
      id="devStepTaskList"
      class="auto-column-size-table"
      ref="autoTable"
      :data="data"
      maxHeight="220"
    ></Table>
.auto-column-size-table table {
  table-layout: auto;
}
.auto-column-size-table table colgroup col {
  display: none;
}

加上這兩個(gè)css后table便可以自適應(yīng)列寬了,需要的話(huà)可以再加上個(gè)列最小寬度,防止空值情況表頭被擠。

  1. 但是 由于某些復(fù)雜功能的原因 iview和Element的 table的構(gòu)建表頭thead 和tbody是分開(kāi)的兩個(gè)table,所以會(huì)出現(xiàn)自適應(yīng)寬度頭身不等情況。有一種處理方法是在tbody自適應(yīng)后的每一列寬度賦給表頭thead的th上,具體如下
  //直接取第一行的就行,因?yàn)槊恳恍辛袑挾家粯?  let tableDom = document.getElementById('devStepTaskList')
  let tds = tableDom.getElementsByClassName('ivu-table-row')[0].children 
  let ths = tableDom.getElementsByTagName('th')
  let tdArr = []
  // 這里為了方便理解直接for循環(huán)處理
  for (let i = 0; i < tds.length; i++) {
    tdArr.push(tds[i].offsetWidth) // 把每一列循環(huán)到的width存入數(shù)組里
  }
  for (let i = 0; i < ths.length; i++) {
    ths[i].style.width = tdArr[i] + 'px' // 直接寬度賦值
  }

現(xiàn)在表現(xiàn)一致了,重點(diǎn)是dom取值找準(zhǔn)了就行,代碼里用的iviewUI,Element處理同理找這個(gè)tr.el-table__row
具體找子集可能有區(qū)別,但是核心都是找到td的offsetWidth賦給th的width。

  1. 這時(shí)還有個(gè)問(wèn)題,如果設(shè)置最大高度,出現(xiàn)滾動(dòng)條的話(huà)又會(huì)出現(xiàn)頭尾對(duì)不齊的狀態(tài),所以要先把tbody內(nèi)的table寬度減去滾動(dòng)條寬度再進(jìn)行上述賦值操作。注意是tbody內(nèi)的table
  let tableDom = document.getElementById('devStepTaskList')
  if (this.data.length > 5) { // data.length 數(shù)據(jù)量大于最大顯示數(shù)據(jù)量,出現(xiàn)滾動(dòng)條條件
    let tables = tableDom.getElementsByClassName('ivu-table-body')
    let table = tables[0].children[0]
    table.style.width = table.offsetWidth - 17 + 'px' // 減去滾動(dòng)條寬度
  }
  let tds = tableDom.getElementsByClassName('ivu-table-row')[0].children 
  let ths = tableDom.getElementsByTagName('th')
  let tdArr = []
  for (let i = 0; i < tds.length; i++) {
    tdArr.push(tds[i].offsetWidth)
  }
  for (let i = 0; i < ths.length; i++) {
    ths[i].style.width = tdArr[i] + 'px' 
  }
  1. 最后,這部分處理首先在watch data時(shí)觸發(fā),防止后續(xù)增刪改導(dǎo)致的寬度變動(dòng)
  watch: {
    data: function (newVal, oldVal) {
      this.$nextTick(() => {
         // 上述代碼
      })
    }
  },

可以的話(huà)在共同函數(shù)進(jìn)行封裝,需要表格的地方進(jìn)行調(diào)用。
然后需要監(jiān)聽(tīng)窗口變動(dòng)window.resize導(dǎo)致的表格寬度變化

window.addEventListener('resize', this.listenTableColumnResize)  // 上述代碼封裝后的函數(shù),可以在setTimeout執(zhí)行

網(wǎng)上的方法大都是計(jì)算寬度再進(jìn)行賦值,感覺(jué)像官方人員說(shuō)的,不應(yīng)該舍近求遠(yuǎn)。所以這里列寬自適應(yīng)主要就兩句css,剩下都是為了對(duì)齊。

authorAns.jpg

網(wǎng)上并沒(méi)看到類(lèi)似的答案,所以這里提出了一種思路。
希望能幫到遇到同樣的問(wèn)題的人

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • HTML標(biāo)簽解釋大全 一、HTML標(biāo)記 標(biāo)簽:!DOCTYPE 說(shuō)明:指定了 HTML 文檔遵循的文檔類(lèi)型定義(D...
    米塔塔閱讀 3,520評(píng)論 1 41
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁(yè)的形式展示給用戶(hù)的,因此網(wǎng)頁(yè)是網(wǎng)絡(luò)信息傳遞的載體。網(wǎng)頁(yè)文件是用...
    阿啊阿吖丁閱讀 4,908評(píng)論 0 0
  • 前端07班 王 對(duì)于table的使用我們會(huì)有種先入為主的厭惡。覺(jué)得頁(yè)面中不應(yīng)該出現(xiàn)表格!其實(shí)這只是針對(duì)使用HTML...
    ea203453e188閱讀 2,805評(píng)論 0 5
  • 本文將繼續(xù)上文接著介紹一些HTML常用標(biāo)簽 1:HTML全局屬性 在介紹常用常見(jiàn)的HTML標(biāo)簽之前,先以最簡(jiǎn)單的方...
    憨憨二師兄閱讀 444評(píng)論 0 0
  • thead、tfoot 以及 tbody標(biāo)簽實(shí)現(xiàn)一個(gè)表格示例,這三個(gè)標(biāo)簽分別代表表格的頭部(th)、主題、和底部,...
    手指樂(lè)閱讀 2,070評(píng)論 0 2

友情鏈接更多精彩內(nèi)容