關(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)列寬了搔弄,需要的話可以再加上個(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ì)出現(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(() => {
         // 上述代碼
      })
    }
  },

可以的話在共同函數(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)看到類似的答案甚垦,所以這里提出了一種思路。
希望能幫到遇到同樣的問(wèn)題的人

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涣雕,一起剝皮案震驚了整個(gè)濱河市艰亮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挣郭,老刑警劉巖迄埃,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兑障,居然都是意外死亡侄非,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)流译,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逞怨,“玉大人,你說(shuō)我怎么就攤上這事福澡〉猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵竞漾,是天一觀的道長(zhǎng)眯搭。 經(jīng)常有香客問(wèn)我窥翩,道長(zhǎng)业岁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任寇蚊,我火速辦了婚禮笔时,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仗岸。我一直安慰自己允耿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布扒怖。 她就那樣靜靜地躺著较锡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盗痒。 梳的紋絲不亂的頭發(fā)上蚂蕴,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天低散,我揣著相機(jī)與錄音,去河邊找鬼骡楼。 笑死熔号,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸟整。 我是一名探鬼主播引镊,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篮条!你這毒婦竟也來(lái)了弟头?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涉茧,失蹤者是張志新(化名)和其女友劉穎亮瓷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體降瞳,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘱支,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挣饥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片除师。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扔枫,靈堂內(nèi)的尸體忽然破棺而出汛聚,到底是詐尸還是另有隱情,我是刑警寧澤短荐,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布倚舀,位于F島的核電站,受9級(jí)特大地震影響忍宋,放射性物質(zhì)發(fā)生泄漏痕貌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一糠排、第九天 我趴在偏房一處隱蔽的房頂上張望舵稠。 院中可真熱鬧,春花似錦入宦、人聲如沸哺徊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)落追。三九已至,卻和暖如春涯肩,著一層夾襖步出監(jiān)牢的瞬間轿钠,已是汗流浹背雹熬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谣膳,地道東北人竿报。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像继谚,于是被迫代替她去往敵國(guó)和親烈菌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

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