基于Vue实现具有固定表头、合并单元格的Html表格

简介: 本文介绍了如何在Vue框架中创建一个具有固定表头和合并单元格功能的HTML表格,通过CSS的`position: sticky`属性实现表头固定,并通过设置`rowspan`和`colspan`属性来实现单元格合并。

前言

本文主要是通过设置`rowspan` 和`colspan` 属性来实现合并单元格,通过CSS的`position: sticky` 属性来实现固定表头。

一、示例代码

(1)/src/views/Example/HtmlTable/index.vue

<template>
  <div class="table-container">
    <table>
      <thead>
        <tr>
          <th
            colspan="2"
            style="width: auto; height: 30px;"
          >
          </th>
          <th
            style="width: auto; height: 30px; background-color: #0bc9d4; color: #fff; font-size: 14px;"
            v-for="(item, index) in teamList"
            :key="index"
          >{
  
  { item.val }}</th>
        </tr>
      </thead>
      <tbody>
        <template v-for="(map, index) in finalList" :key="index">
          <tr>
            <td style="width: auto; height: 200px; background-color: #4bbae9; writing-mode: vertical-rl; letter-spacing: 1px; color: #fff;" :rowspan="quotaList.length" v-if="map.isFirstTD">{
  
  { map.label }}</td>
            <td style="width: auto; background-color: #0bc9d4; color: #fff; font-weight: bold;">{
  
  { map.quota }}</td>
            <td>{
  
  { map.AAA }}</td>
            <td>{
  
  { map.BBB }}</td>
            <td>{
  
  { map.CCC }}</td>
            <td>{
  
  { map.DDD }}</td>
            <td>{
  
  { map.total }}</td>
          </tr>
        </template>
      </tbody>
    </table>
  </div>
</template>

<script>
export default {
    
    
  data: () => ({
    
    
    // 初始化表格列表
    tableList: {
    
    
      '阶段一': {
    
    
        AAA: {
    
     xxx: 9, yyy: 3, zzz: 2 },
        BBB: {
    
     xxx: 4, yyy: 3, zzz: 2 },
        CCC: {
    
     xxx: 7, yyy: 3, zzz: 2 },
        DDD: {
    
     xxx: 9, yyy: 3, zzz: 2 },
        total: {
    
     xxx: 9, yyy: 3, zzz: 2 },
      },
      '阶段二': {
    
    
        AAA: {
    
     xxx: 9, yyy: 3, zzz: 2 },
        BBB: {
    
     xxx: 5, yyy: 3, zzz: 6 },
        CCC: {
    
     xxx: 5, yyy: 5, zzz: 2 },
        DDD: {
    
     xxx: 5, yyy: 3, zzz: 5 },
        total: {
    
     xxx: 9, yyy: 3, zzz: 2 },
      },
      '阶段三': {
    
    
        AAA: {
    
     xxx: 4, yyy: 3, zzz: 2 },
        BBB: {
    
     xxx: 9, yyy: 3, zzz: 2 },
        CCC: {
    
     xxx: 4, yyy: 3, zzz: 2 },
        DDD: {
    
     xxx: 4, yyy: 3, zzz: 2 },
        total: {
    
     xxx: 4, yyy: 3, zzz: 2 },
      },
      '阶段四': {
    
    
        AAA: {
    
     xxx: 1, yyy: 3, zzz: 2 },
        BBB: {
    
     xxx: 3, yyy: 3, zzz: 2 },
        CCC: {
    
     xxx: 1, yyy: 3, zzz: 2 },
        DDD: {
    
     xxx: 2, yyy: 3, zzz: 2 },
        total: {
    
     xxx: 3, yyy: 3, zzz: 2 },
      },
      '阶段五': {
    
    
        AAA: {
    
     xxx: 8, yyy: 3, zzz: 2 },
        BBB: {
    
     xxx: 9, yyy: 3, zzz: 2 },
        CCC: {
    
     xxx: 8, yyy: 3, zzz: 2 },
        DDD: {
    
     xxx: 8, yyy: 3, zzz: 2 },
        total: {
    
     xxx: 8, yyy: 3, zzz: 2 },
      },
      '阶段六': {
    
    
        AAA: {
    
     xxx: 6, yyy: 3, zzz: 2 },
        BBB: {
    
     xxx: 6, yyy: 3, zzz: 2 },
        CCC: {
    
     xxx: 6, yyy: 3, zzz: 2 },
        DDD: {
    
     xxx: 9, yyy: 3, zzz: 2 },
        total: {
    
     xxx: 9, yyy: 3, zzz: 2 },
      },
    },
    // 团队列表
    teamList: [
      {
    
     key: 'AAA', val: 'A团队' },
      {
    
     key: 'BBB', val: 'B团队' },
      {
    
     key: 'CCC', val: 'C团队' },
      {
    
     key: 'DDD', val: 'D团队' },
      {
    
     key: 'total', val: '汇总' },
    ],
    // 指标列表
    quotaList: [
      {
    
     key: 'X指标', val: 'xxx' },
      {
    
     key: 'Y指标', val: 'yyy' },
      {
    
     key: 'Z指标', val: 'zzz' },
    ],
    // 加工后表格列表
    finalList: [],
  }),
  methods: {
    
    
    fn() {
    
    
      const list = []
      const targetList = this.tableList
      for (let stageName in targetList) {
    
    
        const itemMap = targetList[stageName]

        for (let i = 0; i < this.quotaList.length; i++) {
    
    
          const quotaVo = this.quotaList[i]

          const row = {
    
    }
          row.quota = quotaVo.key
          for (let teamVo of this.teamList) {
    
    
            const teamKey = teamVo.key
            row[teamKey] = itemMap[teamKey][quotaVo.val]
          }

          if (i === 0) {
    
    
            row.isFirstTD = true
            row.label = stageName
          } else {
    
    
            row.isFirstTD = false
          }
          list.push(row)
        }
      }
      this.finalList = list
      console.log(this.finalList)
    }
  },
  mounted() {
    
    
    this.fn()
  }
};
</script>

<style lang="less" scoped>
.table-container {
    
    
  position: relative;
  width: 100%;
  height: 500px;
  // background-color: aliceblue;
  overflow: auto;

  table {
    
    
    position: relative;
    width: 100%;
    min-width: 500px;
    height: auto;
    border-spacing: 0 0; // 设置表格中相邻单元格的边界之间的距离
    border-collapse: separate; // 设置表格中相邻单元格的边框为合并边框模型

    thead {
    
    

      tr {
    
    

        th {
    
    
          position: sticky;
          top: 0;
          border-top: 0;
          border-bottom: 0;
          border-left: 5px solid #fff;
          border-right: 0;
          text-align: center;
        }

        & :last-child {
    
    
          border-right: 5px solid #fff;
        }
      }
    }

    tbody {
    
    

      tr {
    
    

        td {
    
    
          border-top: 5px solid #fff;
          border-bottom: 0;
          border-left: 5px solid #fff;
          border-right: 0;
          box-shadow: 0 0 5px 1px #eee inset;
          text-align: center;
        }

        & :last-child {
    
    
          border-right: 5px solid #fff;
        }
      }
    }
  }
}
</style>

二、运行效果

具体来说,我们将表头单元格的position属性设置为sticky,并将top属性设置为 0,这样表头就会固定在顶部。同时,我们还将表头单元格的背景色设置为白色,以便与表格内容区分开来。

目录
相关文章
|
7天前
|
移动开发 JavaScript 前端开发
html table+css实现可编辑表格的示例代码
html table+css实现可编辑表格的示例代码
|
17天前
HTML 表格4
HTML 表格标签用于创建和布局表格。主要标签包括:`&lt;table&gt;` 定义表格,`&lt;th&gt;` 定义表头,`&lt;tr&gt;` 定义行,`&lt;td&gt;` 定义单元格,`&lt;caption&gt;` 定义标题,`&lt;colgroup&gt;` 和 `&lt;col&gt;` 定义列属性,`&lt;thead&gt;`、`&lt;tbody&gt;` 和 `&lt;tfoot&gt;` 分别定义表格的页眉、主体和页脚。
|
17天前
HTML 表格2
本示例展示了如何使用 HTML 的 `&lt;table&gt;` 标签和 `border` 属性创建一个带有边框的简单表格。表格包含两行两列,每行有两个单元格,通过设置 `border=&quot;1&quot;` 显示边框。
|
17天前
|
前端开发
HTML 表格1
HTML 表格是用于展示结构化数据的标记语言元素,由 `&lt;table&gt;` 标签定义。表格包含行(`&lt;tr&gt;`)、单元格(`&lt;td&gt;`)和表头(`&lt;th&gt;`)。表格可细分为 `&lt;thead&gt;`(标题部分)和 `&lt;tbody&gt;`(主体部分),支持合并单元格、跨行/跨列操作及 CSS 样式定制。
|
22天前
|
JavaScript 前端开发 安全
vue -- 指令 -- v-text/html/on/show/if/bind/for/model
【10月更文挑战第17天】Vue 指令是构建 Vue 应用的基础工具,掌握它们的特性和用法是成为一名优秀 Vue 开发者的重要一步。通过深入理解和熟练运用这些指令,可以打造出更加出色的前端应用。
10 2
|
1月前
HTML表格
HTML表格
42 4
|
17天前
HTML 表格3
HTML 表格的表头使用 `&lt;th&gt;` 标签定义,通常以粗体居中显示。
|
30天前
|
JavaScript 前端开发 容器
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
Vue生成PDF文件攻略:html2canvas与jspdf联手,中文乱码与自动换行难题攻克
81 0
|
2月前
|
移动开发 数据可视化 HTML5
Twaver-HTML5基础学习(40)表格可视化视图组件(Table)
本文介绍了如何在Twaver-HTML5中使用表格可视化视图组件(Table),包括创建表格、定义列对象、实现数据绑定和排序,以及处理表格事件和获取表格数据的方法。
40 1
|
2月前
|
前端开发 程序员
【前端web入门第二天】01 html语法实现列表与表格_合并单元格
本文介绍了HTML中的列表与表格的使用方法。列表包括无序列表(`&lt;ul&gt;`嵌套`&lt;li&gt;`)、有序列表(`&lt;ol&gt;`嵌套`&lt;li&gt;`)和定义列表(`&lt;dl&gt;`嵌套`&lt;dt&gt;`和`&lt;dd&gt;`)。
60 19

热门文章

最新文章