基于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,这样表头就会固定在顶部。同时,我们还将表头单元格的背景色设置为白色,以便与表格内容区分开来。

目录
相关文章
|
5月前
|
JavaScript 前端开发 开发者
Vue 动态添加 HTML 元素组件封装使用方法及长尾关键词优化指南
本文详细介绍了Vue中动态添加HTML元素的使用方法与组件封装技巧。内容涵盖条件渲染(v-if/v-show)、列表渲染(v-for)、动态组件(:is)、手动操作DOM及动态创建组件实例等核心方法。同时,通过动态表单、弹窗组件和动态加载组件的封装示例,展示如何提升代码复用性和可维护性。最后,总结性能优化策略与注意事项,如批量更新DOM、懒加载大型组件及避免直接操作DOM等,帮助开发者在实际项目中灵活应用Vue动态元素管理功能。
119 15
|
9月前
|
存储 数据采集 JSON
你知道吗?html_table可以提取的不止是表格
`html_table` 是一种强大的工具,不仅用于HTML表格解析,还在现代爬虫技术中发挥重要作用。它可以提取、整合、分析和传输多种类型的关键数据。本文从四个方面探讨其功能:关键数据提取(如财经网站的股票信息)、零散信息整合(如电商网站的产品详情)、数据对比分析(如手机性能参数对比)和数据存储与传输(如转换为CSV/JSON格式)。通过Python代码示例,展示了如何利用代理IP、多线程和自定义请求头提高爬虫效率,实现对复杂网页数据的全面抓取和利用。
300 12
你知道吗?html_table可以提取的不止是表格
|
5月前
|
JavaScript 前端开发 开发者
Vue 动态添加 HTML 元素组件封装使用方法及长尾关键词优化指南
本文详细介绍了Vue中动态添加HTML元素的多种方法与组件封装技巧,涵盖条件渲染(v-if/v-show)、列表渲染(v-for)、动态组件(:is)、手动DOM操作及动态创建组件实例等内容。同时提供了性能优化建议,如批量更新DOM、使用v-show代替v-if以及懒加载大型组件等。通过合理封装组件,可提高代码复用性和维护性。文中还附有具体示例代码,帮助开发者更好地理解和应用相关技术。适用于前端开发人员学习和实践Vue动态元素处理与组件设计。
128 19
|
5月前
|
缓存 JavaScript 前端开发
Vue 项目中动态添加 HTML 元素的方法与实践
本文探讨了 Vue 中动态添加 HTML 元素的多种技术方案,包括条件渲染(v-if/v-show)、动态组件(component :is)、手动挂载($mount)及 Vuex 状态管理等方法。通过实例分析,如动态表单生成器与全局模态框服务,展示了这些方案在实际开发中的应用。同时提供了性能优化建议和注意事项,帮助开发者根据需求选择最佳方式,在保持 Vue 响应式特性的同时实现灵活交互。附带代码示例,便于理解和实践。
121 2
|
10月前
|
数据采集 前端开发 数据挖掘
利用 html_table 函数轻松获取网页中的表格数据
本文介绍了如何使用 R 语言中的 `html_table` 函数结合代理 IP 技术,轻松提取网页表格数据并规避反爬机制。通过设置代理和请求头,示例代码展示了如何从 58 同城采集租房信息并保存为 CSV 文件。该方法适用于需要频繁采集数据的场景,确保数据采集的高效和稳定性。
361 2
利用 html_table 函数轻松获取网页中的表格数据
|
12月前
|
JavaScript 前端开发 安全
vue -- 指令 -- v-text/html/on/show/if/bind/for/model
【10月更文挑战第17天】Vue 指令是构建 Vue 应用的基础工具,掌握它们的特性和用法是成为一名优秀 Vue 开发者的重要一步。通过深入理解和熟练运用这些指令,可以打造出更加出色的前端应用。
144 50
|
11月前
|
移动开发 JavaScript 前端开发
html table+css实现可编辑表格的示例代码
html table+css实现可编辑表格的示例代码
309 12
|
11月前
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;` 分别定义表格的页眉、主体和页脚。
|
11月前
HTML 表格2
本示例展示了如何使用 HTML 的 `&lt;table&gt;` 标签和 `border` 属性创建一个带有边框的简单表格。表格包含两行两列,每行有两个单元格,通过设置 `border=&quot;1&quot;` 显示边框。
|
11月前
|
前端开发
HTML 表格1
HTML 表格是用于展示结构化数据的标记语言元素,由 `&lt;table&gt;` 标签定义。表格包含行(`&lt;tr&gt;`)、单元格(`&lt;td&gt;`)和表头(`&lt;th&gt;`)。表格可细分为 `&lt;thead&gt;`(标题部分)和 `&lt;tbody&gt;`(主体部分),支持合并单元格、跨行/跨列操作及 CSS 样式定制。

热门文章

最新文章