table表格列宽动态调整方案

在前端开发中,遇到表格列宽因数据过长而换行的问题。由于ElementUI组件未提供此功能,作者通过自定义方法实现了动态调整表格列宽,确保内容不换行并能根据字体大小变化调整宽度。方法原理是将列数据拆分,计算最大宽度作为列宽。使用时需将函数引入,并指定相关参数,如表列名、表格数据、字段名、当前字体尺寸和单位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在做表格的时候,设置好的列宽却因为数据太长导致换行,想让它自己调整宽度,但是现在elementUI组件好像还没有这个功能。所以自己写了一个方法实现它。

一个动态改变表格列宽的方法

该方法实现了自适应列内容长度不换行,另外改变字体大小也会改变列宽,也实现了自适应字体大小列宽调整。
这个方法的思路是将列数据拆成单个字母或者单个中文字或其他单个符号放入数组中,对不同类型设置不同宽度,接着算出所有列数据的宽度,取最大宽度的一个设置为表格列宽。

  • 自动调节表格列宽 :flexColumnWidth ,返回值为宽度值,只有数字没有单位
  • title:表列名 (例:‘名字’,‘性别’,‘手机号码’)
  • tableData:表格数据
  • str:字段名 (例:tableData[0].name 中的’name’, tableData[0].phone,的’phone’,
  • currentfontsz:当前字体尺寸(填数字就好)
  • sizetype:字体尺寸的单位(是px还是rem)
flexColumnWidth(
      title,
      str,
      tableData,
      currentfontsz,
      sizetype,
      flag = "max"
    ) {
      //可能tableData里面的是个object对象,把它里面的name取出来替换它,传参时只需传对象名就好了。
      if (tableData == null) return;
      let tb = JSON.parse(JSON.stringify(tableData));
      for (let i = 0; i < tb.length; i++) {
        if (typeof tb[i][str] == "object") {
          tb[i][str] = tb[i][str].name;
        }
      }
        //外部字体尺寸变化的时候,这里进行了适配,以求宽度会随着字体尺寸变化而动态调整
      let flexperson;
      if (sizetype == "rem") {
        let basesize = document.documentElement.style.fontSize;
        flexperson =
          (Number(basesize.slice(0, basesize.length - 2)) * currentfontsz) / 14;
      } else if (sizetype == "px") {
        flexperson = currentfontsz / 14;
      }

      console.log(flexperson);
      str = str + "";
      let columnContent = "";
      if (!tb || !tb.length || tb.length === 0 || tb === undefined) {
        return;
      }
      if (!str || !str.length || str.length === 0 || str === undefined) {
        return;
      }
      if (flag === "equal") {
        // 获取该列中第一个不为空的数据(内容)
        for (let i = 0; i < tb.length; i++) {
          if (tb[i][str].length > 0) {
            // console.log('该列数据[0]:', tableData[0][str])
            columnContent = tb[i][str];
            break;
          }
        }
      } else {
        // 获取该列中最长的数据(内容)
        let index = 0;
        for (let i = 0; i < tb.length; i++) {
          if (tb[i][str] === null) {
            tb[i][str] = "";
          }
          const now_temp = tb[i][str] + "";
          const max_temp = tb[index][str] + "";
          if (now_temp.length > max_temp.length) {
            index = i;
          }
        }
        //表头标题的长度可能比值还长,这时就用表头长度作为基础设计列宽。
        columnContent =
          tb[index][str].length > title.length ? tb[index][str] : title;
      }
      columnContent += "";
      console.log(columnContent);
      let co = columnContent.split("");
      // console.log('该列数据[i]:', columnContent)
      // 以下分配的单位长度可根据实际需求进行调整
      let flexWidth = 20;

      for (const char of columnContent) {
        if ((char >= "A" && char <= "Z") || (char >= "a" && char <= "z")) {
          // 如果是英文字符,为字符分配8个单位宽度
          flexWidth += 9;
        } else if (char >= "\u4e00" && char <= "\u9fa5") {
          // 如果是中文字符,为字符分配15个单位宽度
          flexWidth += 18;
        } else {
          // 其他种类字符,为字符分配8个单位宽度
          flexWidth += 9;
        }
      }
      if (flexWidth < 65) {
        // 设置最小宽度
        flexWidth = 65;
      }
      // if (flexWidth > 300) {
      //   // 设置最大宽度
      //   flexWidth = 300
      // }
      
      return flexWidth * flexperson;
    }

使用方式

这里使用的是elementUI,别的ui组件需要表格列下的width属性也能动态赋值才能下面那样写。先把这个函数引入到能调用到的地方,例放到vue组件methods: {}对象里。使用的话就是给width,把那些必要参数填上就行。参数不多 啊。

<el-table :data="tdata" style="font-size:12px">
  <el-table-column
        prop="conversionTime"
        align="left"
        :width="flexColumnWidth('转正日期', 'conversionTime', tdata, 12, 'px')"
        label="转正日期"
      >
  </el-table-column>
</el-table>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值