<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>
相关推荐
user_admin_god21 小时前
基于Layui Vue Admin + Spring Boot 3.x 的企业级前后端分离管理系统
vue.js·spring boot·layui
wangbing112521 小时前
layui窗口标题
前端·javascript·layui
qq_3985865421 小时前
Utools插件实现Web Bluetooth
前端·javascript·electron·node·web·web bluetooth
李剑一21 小时前
mitt和bus有什么区别
前端·javascript·vue.js
soda_yo21 小时前
JavaScripe中你所不知道的"变量提升"
javascript
www_stdio1 天前
JavaScript 执行机制详解:从 V8 引擎到执行上下文
前端·javascript
我命由我123451 天前
HTML - 换行标签的 3 种写法(<br>、<br/>、<br />)
前端·javascript·css·html·css3·html5·js
F_Director1 天前
简说Vue3 computed原理
前端·vue.js·面试
icebreaker1 天前
重新思考 weapp-tailwindcss 的未来
前端·javascript·css
涤生啊1 天前
一键搭建 Coze 智能体对话页面:支持流式输出 + 图片直显,开发效率拉满!
javascript·html5