<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>
相关推荐
低代码布道师22 分钟前
Next.js 16 全栈实战(一):从零打造“教培管家”系统——环境与脚手架搭建
开发语言·javascript·ecmascript
一位搞嵌入式的 genius42 分钟前
深入 JavaScript 函数式编程:从基础到实战(含面试题解析)
前端·javascript·函数式
choke2331 小时前
[特殊字符] Python 文件与路径操作
java·前端·javascript
wqq63108551 小时前
Python基于Vue的实验室管理系统 django flask pycharm
vue.js·python·django
Deng9452013141 小时前
Vue + Flask 前后端分离项目实战:从零搭建一个完整博客系统
前端·vue.js·flask
Hello.Reader2 小时前
Flink 文件系统通用配置默认文件系统与连接数限制实战
vue.js·flink·npm
wuhen_n2 小时前
JavaScript内置数据结构
开发语言·前端·javascript·数据结构
鹿心肺语2 小时前
前端HTML转PDF的两种主流方案深度解析
前端·javascript
一个懒人懒人3 小时前
Promise async/await与fetch的概念
前端·javascript·html
EchoEcho4 小时前
深入理解 Vue.js 渲染机制:从声明式到虚拟 DOM 的完整实现
vue.js