<el-table> 表头的字数多于5时,表头单元格的字符串的行、列数按近似黄金分割比例 (√5 - 1)/2 排列

以下是基于Element UI的<el-table>组件的实现方式:

  1. 在<el-table-column>中添加自定义的表头模板,并给表头模板绑定一个ref。
html 复制代码
<el-table-column prop="name">
  <template slot="header">
    <div ref="tableHeader" class="custom-header">
      {{ $column.label }}
    </div>
  </template>
</el-table-column>
  1. 在 mounted 钩子中获取表头单元格的行、列数,并根据黄金分割比例进行排列。
js 复制代码
mounted() {
  this.$nextTick(() => {
    const tableHeader = this.$refs.tableHeader;
    const headerWidth = tableHeader.offsetWidth;
    const headerHeight = tableHeader.offsetHeight;

    // 黄金分割比例
    const ratio = (Math.sqrt(5) - 1) / 2;

    // 计算行数和列数
    const rowCount = Math.ceil(1 / ratio);
    const colCount = Math.ceil(ratio);

    // 计算每个单元格的宽度和高度
    const cellWidth = headerWidth / colCount;
    const cellHeight = headerHeight / rowCount;

    // 将单元格位置设置为绝对定位
    tableHeader.style.position = 'relative';

    // 遍历每个单元格并设置它的位置
    let row = 0;
    let col = 0;
    Array.from(tableHeader.childNodes).forEach((cell) => {
      cell.style.position = 'absolute';
      cell.style.left = `${col * cellWidth}px`;
      cell.style.top = `${row * cellHeight}px`;
      col++;
      if (col === colCount) {
        col = 0;
        row++;
      }
    });
  });
}

完整的代码示例可以参考以下代码片段:

html 复制代码
<template>
  <el-table :data="tableData">
    <el-table-column prop="name">
      <template slot="header">
        <div ref="tableHeader" class="custom-header">
          {{ $column.label }}
        </div>
      </template>
    </el-table-column>
    <el-table-column prop="age" label="Age"></el-table-column>
    <el-table-column prop="gender" label="Gender"></el-table-column>
  </el-table>
</template>

<script>
export default {
  data() {
    return {
      tableData: [
        { name: 'John Doe', age: 30, gender: 'Male' },
        { name: 'Jane Doe', age: 25, gender: 'Female' },
        { name: 'Bob Smith', age: 40, gender: 'Male' },
      ],
    };
  },
  mounted() {
    this.$nextTick(() => {
      const tableHeader = this.$refs.tableHeader;
      const headerWidth = tableHeader.offsetWidth;
      const headerHeight = tableHeader.offsetHeight;

      // 黄金分割比例
      const ratio = (Math.sqrt(5) - 1) / 2;

      // 计算行数和列数
      const rowCount = Math.ceil(1 / ratio);
      const colCount = Math.ceil(ratio);

      // 计算每个单元格的宽度和高度
      const cellWidth = headerWidth / colCount;
      const cellHeight = headerHeight / rowCount;

      // 将单元格位置设置为绝对定位
      tableHeader.style.position = 'relative';

      // 遍历每个单元格并设置它的位置
      let row = 0;
      let col = 0;
      Array.from(tableHeader.childNodes).forEach((cell) => {
        cell.style.position = 'absolute';
        cell.style.left = `${col * cellWidth}px`;
        cell.style.top = `${row * cellHeight}px`;
        col++;
        if (col === colCount) {
          col = 0;
          row++;
        }
      });
    });
  },
};
</script>

<style scoped>
.custom-header {
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: bold;
  font-size: 18px;
}
</style>
相关推荐
threerocks8 小时前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
ly768910 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
剑胆琴心静水深流11 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
沙盘客11 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
默_笙13 小时前
👍 我的代码被 ESLint 抓包了:单引号、var、没分号——全被当场点名
前端·javascript
oh,huoyuyan13 小时前
JS 动态网页抓不到?试试火车采集器网页抓取工具
开发语言·javascript·ecmascript
汉堡大王952715 小时前
用 Trae Work 自动化任务,6 分钟生成一份前端生态周报
前端·javascript·人工智能
章鱼小丸子逃跑中15 小时前
【2025最新版】如何将fnm与node.js安装在D盘?【保姆级安装及人性话理解教程】
前端·javascript·npm·node.js
CAD老兵17 小时前
在浏览器里对比 DWG/DXF 图纸 —— @mlightcad/cad-diff-viewer
前端·javascript·github
WL_arm17 小时前
Vibe Coding(氛围编程)入门
javascript·css·人工智能·html5