vue3 手写甘特图

这篇具有很好参考价值的文章主要介绍了vue3 手写甘特图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

封装的组件

(gantt-chart/index.vue)文章来源地址https://www.toymoban.com/news/detail-518681.html

<template>
    <div class="ganttChartClass">
        <!-- 顶部标题 -->
        <div class="topTitle">
            <div style="position:relative" :style="{ width: leftTitleWidth + 'px' }">
                <div style="font-size: 12px;margin-left:58px;margin-top:-10px;">年份</div>
                <div class="diagonalLine"></div>
                <div style="font-size: 12px;margin-left:-54px;margin-top:-30px;">项目</div>
            </div>
            <div v-for="(item, i) in props.data.title" :key="i"
                :style="{ width: 'calc(' + '( 100% - ' + leftTitleWidth + 'px)' + ' * (1 / ' + props.data.title.length + ')' + ')' }">
                {{ item }}年
            </div>
        </div>
        <div v-for="(item, i) in props.data.data" :key="i" class="content">
            <!-- 左侧标题 -->
            <div :style="{ width: leftTitleWidth + 'px' }" class="leftTitle">
                <!-- 只有一级题目 -->
                <!-- <div>
                    {{ item.title }}
                </div> -->
                <div style="display:flex;width:100%;height:100%;text-align: center;">
                    <!-- 一级题目 -->
                    <div style="display: flex;justify-content: center;align-items: center;font-size: 16px;"
                        :style="{ width: item.children[0].subTitle === '' ? '100%' : '40%', paddingRight: item.children[0].subTitle === '' ? '10px' : '0px' }"
                        class="firstTitleArea">
                        <div style="display:inline-block;text-align:left;">
                            {{ item.title }}
                        </div>
                    </div>

                </div>
            </div>
            <div
                :style="{ width: 'calc(' + '( 100% - ' + leftTitleWidth + 'px)' + ' * (1 / ' + props.data.title.length + ')' + ')' }">
                <!-- {{item}} -->
                <!-- <div style="height:100%;width:20px;background:red;position: relative;z-index:20;">
                </div> -->
                <div v-for="(item2, i2) in item.children" :key="i2"
                    style="width:100%;display: flex;justify-content: flex-start;">


                    <!-- 二级标题展示 -->
                    <div style="width:0px;">
                        <div style="width:84px;height:100%;position:relative;left:-84px;align-items: center;justify-content: center;padding:0 5px; color: #585D79;font-size: 14px;font-weight:600;"
                            :style="{ borderTop: (0 === i2) ? 'none' : '1px solid #FFE1C5',display:item2.subTitle===''?'none':'flex' }" >
                            {{ item2.subTitle }}
                        </div>
                    </div>

                    <div style="width:100%;">
                        <div v-for="(item3, i3) in  item2.children" :key="i3" class="lineRow"
                            style="display:flex;width:100%;">
                            <div v-for="(ele2, index2) in item3" :key="index2" style="width:100%;flex-shrink:0">

                                <!-- 这行是占位 -->
                                <div :style="{ width: 'calc(' + ele2.width + ' - 1px)', background: lineDrawArr[index2 % 4] }"
                                    style="height:100%;position: relative;visibility: hidden;" class="lineDraw">
                                    {{ ele2.name }}
                                </div>


                                <!-- 这行才是真正显示 -->
                                <div :style="{ width: 'calc(' + ele2.width + ' - 1px)', left: ele2.left, background: lineDrawArr[index2 % 4] }"
                                    style="display:flex;align-items:center;justify-content:center;" class="lineDraw">
                                    <div style="text-align:left;display: inline-block;">
                                        {{ ele2.name }}
                                    </div>
                                </div>

                            </div>

                            <div></div>

                        </div>
                    </div>

                    <div></div>

                </div>
                <div></div>
            </div>
            <div v-for="item5 in props.data.title.length - 1"
                :style="{ width: 'calc(' + '( 100% - ' + leftTitleWidth + 'px)' + ' * (1 / ' + props.data.title.length + ')' + ')' }">
            </div>
        </div>
    </div>
</template>
    
<script setup lang='ts'>
import { ref } from 'vue'
let props = defineProps<{ data: any }>()


let leftTitleWidth = ref(150)

let lineDrawArr = ['#E4EFFF', '#F3F37E', '#FFDED7', '#CBEEEA']
</script>
    
<style lang="less" scoped>
@bg: #FEF9F3;
@borderColor: #FFE1C5;

.ganttChartClass {
    box-sizing: border-box;
    overflow: hidden;
    border: 1px solid @borderColor;
    border-right: 0px;

    .content {
        display: flex;
        flex-wrap: wrap;

        border-top: 1px dashed @borderColor;

        &:nth-child(2) {
            border-top: 1px solid @borderColor;
        }


        .leftTitle {
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: 600;
            padding: 10px;
            padding-right: 0px;
            background: @bg;
            color: #252631;

            .firstTitleArea {
                position: relative;

                &:after {

                    display: block;
                    content: '';
                    height: calc(100% + 20px);
                    width: 1px;
                    background: @borderColor;
                    position: absolute;
                    right: 0;
                }
            }
        }


        &>div {
            position: relative;

            // border-right: 1px solid blue;
            &::after {
                display: block;
                content: '';
                position: absolute;
                height: 100%;
                width: 1px;
                background: @borderColor;
                right: 0;
                top: 0;
            }

            .lineRow {
                // height: 30px;
                margin-top: 10px;
                margin-bottom: 10px;
                position: relative;


                .lineDraw {
                    text-align: center;
                    // line-height: 30px;
                    z-index: 5;
                    position: absolute;
                    padding: 5px 20px;
                    top: 0;
                    height: 100%;



                    .lineDrawText {
                        text-overflow: ellipsis;
                        overflow: hidden;
                        white-space: nowrap;

                        color: #585D79;
                        font-size: 14px;

                        &:hover {
                            cursor: pointer;
                        }
                    }
                }
            }

        }
    }

    .topTitle {
        display: flex;
        flex-wrap: wrap;
        background: @bg;
        color: #CE8D51;


        &>div {
            display: inline-block;
            text-align: center;
            border-right: 1px solid @borderColor;
            height: 50px;
            line-height: 50px;
            overflow: hidden;


            .diagonalLine {
                width: 200px;
                border-bottom: 1px solid @borderColor;
                transform: rotate(17.9deg);
                transform-origin: 0 0;
                position: absolute;
                z-index: 5;
                top: 0;
                left: 0;
            }
        }
    }

    div {
        box-sizing: border-box;
    }
}
</style>

甘特图组件使用

<template>
  <div style="padding:100px;width:80%;">
      <GanttChart :data="data"></GanttChart>
  </div>
</template>

<script lang="ts" setup>
import { reactive, ref } from 'vue'
import GanttChart from './components/gantt-chart/index.vue'


let data = ref({
  data: [
  {
          title: '1级标题',
          children:
              [
                  {
                      subTitle: '',
                      children: [
                          [
                              {
                                  width: '50%', // 这是占一个列宽度的百分比
                                  left: '150%', // 这是从第一列起,向右移动第一列宽度的百分比
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'  // 这个就是我们展示的文字了
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                          ],
                          [
                              {
                                  width: '100%',
                                  left: '0%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢...'
                              },
                              {
                                  width: '100%',
                                  left: '100%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏rewqtr'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性rweqrwqe'
                              },
                          ]

                      ]

                  },
                 
              ]
      },
      {
          title: '1级标题',
          children:
              [
                  {
                      subTitle: '二级标题',
                      children: [
                          [
                              {
                                  width: '50%',
                                  left: '150%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '100%',
                                  left: '0%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                          ],
                          [
                              {
                                  width: '100%',
                                  left: '0%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢...'
                              },
                              {
                                  width: '100%',
                                  left: '100%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏rewqtr'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性rweqrwqe'
                              },
                          ]

                      ]

                  },
                  {
                      subTitle: '222二级标题',
                      children: [
                          [
                              {
                                  width: '100%',
                                  left: '50%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病...'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                          ],
                          [
                              {
                                  width: '100%',
                                  left: '50%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                          ]

                      ]

                  },
              ]
      }
      ,
      {
          title: '11111级标题',
          children:
              [
                  {
                      subTitle: '二级标题',
                      children: [
                          [
                              {
                                  width: '50%',
                                  left: '0%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '50%',
                                  left: '50%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '50%',
                                  left: '100%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '50%',
                                  left: '150%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '50%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '50%',
                                  left: '250%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                          ],
                          [
                              {
                                  width: '100%',
                                  left: '50%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                          ]

                      ]

                  },
                  {
                      subTitle: '222二级标题',
                      children: [
                          [
                              {
                                  width: '100%',
                                  left: '50%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂疾病及慢性病仍缺乏有效治疗方法'
                              },
                              {
                                  width: '60%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等...'
                              },
                          ],
                          [
                              {
                                  width: '20%',
                                  left: '30%',
                                  name: '肿瘤、心脑血管疾病、212312'
                              },
                              {
                                  width: '100%',
                                  left: '200%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂4231'
                              },
                              {
                                  width: '60%',
                                  left: '100%',
                                  name: '肿瘤、心脑血管疾病、遗传病等许多复杂gerg'
                              },
                          ]

                      ]

                  },
              ]
      }

      ,

  ]
  ,
  title: [
      '2017-2020',
      '2021-2025',
      '2026-2030'
  ]
})

</script>
<style lang="less">

</style>


到了这里,关于vue3 手写甘特图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里云与Sui加深合作,为Move开发者提供人工智能、黑客松和文档翻译支持

    去年,阿里云开始提供专为Sui开发者定制的服务,包括安全基础设施和存档节点服务。近日,该公司宣布推出一系列新服务,以进一步支持Move开发者跟上Sui的快速增长步伐。 Sui网络为开发者提供了优于其他区块链的能力,包括水平扩展、高吞吐量、面向对象的编程和先进的

    2024年03月08日
    浏览(49)
  • 🔥🔥Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)

    首先,大家对Python语法的了解已经基本完成,现在我们需要开始进行各种练习。我为大家准备了一些练习题目,比如之前的向量数据库等,这些题目可以参考第三方的SDK来进行操作,文档也是比较完善的。这个过程有点像我们之前使用Java对接第三方接口的方式,所以今天我想

    2024年02月05日
    浏览(66)
  • Java开发者的Python快速实战指南:实用工具之PDF转DOCX文档(可视化界面)

    首先,大家对Python语法的了解已经基本完成,现在我们需要开始进行各种练习。我为大家准备了一些练习题目,比如之前的向量数据库等,这些题目可以参考第三方的SDK来进行操作,文档也是比较完善的。这个过程有点像我们之前使用Java对接第三方接口的方式,所以今天我想

    2024年02月05日
    浏览(66)
  • 2023 Vue开发者的React入门

    Vue 和 React 都是流行的 JavaScript 框架,它们在组件化、数据绑定等方面有很多相似之处 本文默认已有现代前端开发( Vue )背景,关于 组件化、前端路由、状态管理 概念不会过多介绍 0基础建议详细阅读 Thinking in React-官方文档 了解 React 的设计哲学 React 新文档- https://react.dev R

    2024年02月05日
    浏览(60)
  • vue的开发者工具下载『保姆级别』

    1.先进官网 极简插件_Chrome扩展插件商店_优质crx应用下载 (zzzmh.cn) 2.搜索vue devtools,点击进去  3.下载插件  4.下载到文件下你自己的文件下:我的是下载到E盘下。  5.压缩到当前目录下  6.电脑进入拓展程序(不同的浏览器操作不同!) 谷歌浏览器如下:  Edge浏览器 :右上角

    2024年02月12日
    浏览(46)
  • vue开发者vite多环境配置,终于搞明白了

    在看项目的过程中,发现有类似服务端多环境配置的配置,所以研究了下,在网上有多个方案,选了一个当前在用的吧,另外一个没验证 对于使用Vite构建的Vue项目,可以使用Vite提供的环境变量来实现多环境配置。 Vite 使用  dotenv  从  环境文件目录  中加载环境文件,默认

    2024年02月06日
    浏览(39)
  • 8年前端与众不同的Vue实战系列,助你成为前端顶级开发者

    目录 一、写这个Vue实战系列专栏的初衷 1. 帮朋友做推荐 2. 市面上卖源码的多,讲实战项目过程的少 3. 想到了自己刚毕业的时候 二、 本专栏的优势  1. 需求的适应性强 2. 技术主流  三、 读完本专栏,你可以得到什么 1. 帮朋友做推荐 我记得最初的时候,我也只是单纯的分享

    2024年02月02日
    浏览(58)
  • 在Chrome(谷歌浏览器)中安装Vue.js devtools开发者工具及解决Vue.js not detected报错

    提示:先安装谷歌助手的原因是:不安装谷歌助手无法打开谷歌应用商店,导致无法下载Vue.js devtools开发者工具。

    2024年02月15日
    浏览(71)
  • vue3 甘特图(二):甘特图时间轴切换

    点击不同按钮,切换时间轴状态 2.1 配置时间轴参数 levels里可配置多个级别。 scales展示时间轴对应多少行,下的format可自定展现方式,css属性方法可判断是否为轴,给周末添加上高亮属性。     2.2 初始化时间轴配置 2.3 改变时间轴 2.4 周末或特殊日期高亮 见:vue3 甘特图(一

    2024年02月10日
    浏览(32)
  • 如何成为一名高效的前端开发者(10X开发者)

    如今,每个人都想成为我们所说的“10倍开发者”。然而,这个术语经常被误解和高估。 本质上,一个高效或者10倍开发者,在我看来,是指那些能够充分利用所有可用工具的人,通过让这些工具处理冗余和重复的任务,使他们能够专注于复杂和创造性的工作。以下是一些成

    2024年02月05日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包