甘特图(Javascript实现)

JavaScript多功能甘特图组件 - jsGantt jsGantt是一个可定制的、灵活的、多语言的甘特图组件,由原生 JavaScript 构建。它使用客户端渲染以获得快速的性能和动态的交互性。非常适用于任何需要交互式时间线或时间表显示的项目。 阅读详情
简介

笔者在开发一个基于Web的应用程序提供对人物和项目事件的管理。项目需要一个甘特图 控件可视化表示任务列表,笔者尝试寻找自由可用的解决方案(因为不想增加开销)。笔者找到了一些例子,不过并不满意。于是,决定创建一个自己的甘特图控件。此次是笔者工作的最初成果。这个SIcon的最初版本只做了几个小时,所以仍会有些问题。尽管如此,笔者还是希望与各位分享,希望能帮助大家。

SICon现在支持FireFox浏览器!

背景

掌握和使用这个示例需要Jscript和 CSS知识。

使用代码

代码并不是很复杂,所以我在这里将展示全部:

脚本代码
  1.   1 /* --------- SICON GANTT CHART -----------------------------------------------------------
  2.   2  * AUTHOR        : Dathq - ICT Service Engineering Jsc, - [email]dathq@ise.com.vn[/email]
  3.   3  * LICENSE        : Free
  4.   4  * DESCRIPTION    : Create a new task item with these info
  5.   5  *        - from: start date (format: mm/dd/dddd)
  6.   6  *        - to: deadline of task (format: mm/dd/dddd)
  7.   7  *        - task: name of the task, what has to be solved (not includes ')
  8.   8  *        - resource: who have to solve this task (not includes ')
  9.   9  *        - progress: how is it going? (format: integer value from 0 to 100, not includes %)
  10. 10  *----------------------------------------------------------------------------------------*/
  11. 11 function Task(from, to, task, resource, progress)
  12. 12 {
  13. 13    var _from = new Date();   
  14. 14    var _to = new Date();
  15. 15    var _task = task;
  16. 16    var _resource = resource;                       
  17. 17    var _progress = progress;
  18. 18    var dvArr = from.split('/');
  19. 19    _from.setFullYear(parseInt(dvArr[2], 10), parseInt(dvArr[0], 10) - 1, parseInt(dvArr[1], 10));
  20. 20    dvArr = to.split('/');
  21. 21    _to.setFullYear(parseInt(dvArr[2], 10), parseInt(dvArr[0], 10) - 1, parseInt(dvArr[1], 10));       
  22. 22   
  23. 23    this.getFrom = function(){ return _from};
  24. 24    this.getTo = function(){ return _to};
  25. 25    this.getTask = function(){ return _task};
  26. 26    this.getResource = function(){ return _resource};
  27. 27    this.getProgress = function(){ return _progress};
  28. 28 }
  29. 29
  30. 30 function Gantt(gDiv)
  31. 31 {
  32. 32    var _GanttDiv = gDiv;
  33. 33    var _taskList = new Array();       
  34. 34    this.AddTaskDetail = function(value)
  35. 35    {
  36. 36        _taskList.push(value);
  37. 37       
  38. 38    }
  39. 39    this.Draw = function()
  40. 40    {
  41. 41        var _offSet = 0;
  42. 42        var _dateDiff = 0;
  43. 43        var _currentDate = new Date();
  44. 44        var _maxDate = new Date();
  45. 45        var _minDate = new Date();   
  46. 46        var _dTemp = new Date();
  47. 47        var _firstRowStr = "<table border=1 style='border-collapse:collapse'><tr><td rowspan='2' width='200px' style='width:200px;'><div class='GTaskTitle' style='width:200px;'>Task</div></td>";
  48. 48        var _thirdRow = "";
  49. 49        var _gStr = "";       
  50. 50        var _colSpan = 0;
  51. 51        var counter = 0;
  52. 52       
  53. 53        _currentDate.setFullYear(_currentDate.getFullYear(), _currentDate.getMonth(), _currentDate.getDate());
  54. 54        if(_taskList.length > 0)
  55. 55        {
  56. 56            _maxDate.setFullYear(_taskList[0].getTo().getFullYear(), _taskList[0].getTo().getMonth(), _taskList[0].getTo().getDate());
  57. 57            _minDate.setFullYear(_taskList[0].getFrom().getFullYear(), _taskList[0].getFrom().getMonth(), _taskList[0].getFrom().getDate());
  58. 58            for(i = 0; i < _taskList.length; i++)
  59. 59            {
  60. 60                if(Date.parse(_taskList.getFrom()) < Date.parse(_minDate))
  61. 61                    _minDate.setFullYear(_taskList.getFrom().getFullYear(), _taskList.getFrom().getMonth(), _taskList.getFrom().getDate());
  62. 62                if(Date.parse(_taskList.getTo()) > Date.parse(_maxDate))
  63. 63                    _maxDate.setFullYear(_taskList.getTo().getFullYear(), _taskList.getTo().getMonth(), _taskList.getTo().getDate());                       
  64. 64            }
  65. 65           
  66. 66            //---- Fix _maxDate value for better displaying-----
  67. 67            // Add at least 5 days
  68. 68           
  69. 69            if(_maxDate.getMonth() == 11) //December
  70. 70            {
  71. 71                if(_maxDate.getDay() + 5 > getDaysInMonth(_maxDate.getMonth() + 1, _maxDate.getFullYear()))                   
  72. 72                    _maxDate.setFullYear(_maxDate.getFullYear() + 1, 1, 5); //The fifth day of next month will be used
  73. 73                else
  74. 74                    _maxDate.setFullYear(_maxDate.getFullYear(), _maxDate.getMonth(), _maxDate.getDate() + 5); //The fifth day of next month will be used
  75. 75            }
  76. 76            else
  77. 77            {
  78. 78                if(_maxDate.getDay() + 5 > getDaysInMonth(_maxDate.getMonth() + 1, _maxDate.getFullYear()))                   
  79. 79                    _maxDate.setFullYear(_maxDate.getFullYear(), _maxDate.getMonth() + 1, 5); //The fifth day of next month will be used
  80. 80                else
  81. 81                    _maxDate.setFullYear(_maxDate.getFullYear(), _maxDate.getMonth(), _maxDate.getDate() + 5); //The fifth day of next month will be used
  82. 82            }
  83. 83           
  84. 84            //--------------------------------------------------
  85. 85           
  86. 86            _gStr = "";
  87. 87            _gStr += "</tr><tr>";
  88. 88            _thirdRow = "<tr><td> </td>";
  89. 89            _dTemp.setFullYear(_minDate.getFullYear(), _minDate.getMonth(), _minDate.getDate());
  90. 90            while(Date.parse(_dTemp) <= Date.parse(_maxDate))
  91. 91            {   
  92. 92                if(_dTemp.getDay() % 6 == 0) //Weekend
  93. 93                {
  94. 94                    _gStr += "<td class='GWeekend'><div style='width:24px;'>" + _dTemp.getDate() + "</div></td>";
  95. 95                    if(Date.parse(_dTemp) == Date.parse(_currentDate))                       
  96. 96                        _thirdRow += "<td id='GC_" + (counter++) + "' class='GToDay' style='height:" + (_taskList.length * 21) + "'> </td>";
  97. 97                    else
  98. 98                        _thirdRow += "<td id='GC_" + (counter++) + "' class='GWeekend' style='height:" + (_taskList.length * 21) + "'> </td>";
  99. 99                }
  100. 100                else
  101. 101                {
  102. 102                    _gStr += "<td class='GDay'><div style='width:24px;'>" + _dTemp.getDate() + "</div></td>";
  103. 103                    if(Date.parse(_dTemp) == Date.parse(_currentDate))                       
  104. 104                        _thirdRow += "<td id='GC_" + (counter++) + "' class='GToDay' style='height:" + (_taskList.length * 21) + "'> </td>";
  105. 105                    else
  106. 106                        _thirdRow += "<td id='GC_" + (counter++) + "' class='GDay'> </td>";
  107. 107                }
  108. 108                if(_dTemp.getDate() < getDaysInMonth(_dTemp.getMonth() + 1, _dTemp.getFullYear()))
  109. 109                {
  110. 110                    if(Date.parse(_dTemp) == Date.parse(_maxDate))
  111. 111                    {                           
  112. 112                        _firstRowStr += "<td class='GMonth' colspan='" + (_colSpan + 1) + "'>T" + (_dTemp.getMonth() + 1) + "/" + _dTemp.getFullYear() + "</td>";                           
  113. 113                    }
  114. 114                    _dTemp.setDate(_dTemp.getDate() + 1);
  115. 115                    _colSpan++;
  116. 116                }                   
  117. 117                else
  118. 118                {
  119. 119                    _firstRowStr += "<td class='GMonth' colspan='" + (_colSpan + 1) + "'>T" + (_dTemp.getMonth() + 1) + "/" + _dTemp.getFullYear() + "</td>";
  120. 120                    _colSpan = 0;
  121. 121                    if(_dTemp.getMonth() == 11) //December
  122. 122                    {
  123. 123                        _dTemp.setFullYear(_dTemp.getFullYear() + 1, 0, 1);
  124. 124                    }
  125. 125                    else
  126. 126                    {
  127. 127                        _dTemp.setFullYear(_dTemp.getFullYear(), _dTemp.getMonth() + 1, 1);
  128. 128                    }
  129. 129                }                   
  130. 130            }
  131. 131            _thirdRow += "</tr>";               
  132. 132            _gStr += "</tr>" + _thirdRow;               
  133. 133            _gStr += "</table>";
  134. 134            _gStr = _firstRowStr + _gStr;               
  135. 135            for(i = 0; i < _taskList.length; i++)
  136. 136            {
  137. 137                _offSet = (Date.parse(_taskList.getFrom()) - Date.parse(_minDate)) / (24 * 60 * 60 * 1000);
  138. 138                _dateDiff = (Date.parse(_taskList.getTo()) - Date.parse(_taskList.getFrom())) / (24 * 60 * 60 * 1000) + 1;
  139. 139                _gStr += "<div style='position:absolute; top:" + (20 * (i + 2)) + "; left:" + (_offSet * 27 + 204) + "; width:" + (27 * _dateDiff - 1 + 100) + "'><div title='" + _taskList.getTask() + "' class='GTask' style='float:left; width:" + (27 * _dateDiff - 1) + "px;'>" + getProgressDiv(_taskList.getProgress()) + "</div><div style='float:left; padding-left:3'>" + _taskList.getResource() + "</div></div>";
  140. 140                _gStr += "<div style='position:absolute; top:" + (20 * (i + 2) + 1) + "; left:5px'>" + _taskList.getTask() + "</div>";
  141. 141            }
  142. 142            _GanttDiv.innerHTML = _gStr;
  143. 143        }
  144. 144    }
  145. 145 }       
  146. 146
  147. 147 function getProgressDiv(progress)
  148. 148 {
  149. 149    return "<div class='GProgress' style='width:" + progress + "%; overflow:hidden'></div>"
  150. 150 }
  151. 151 // GET NUMBER OF DAYS IN MONTH
  152. 152 function getDaysInMonth(month, year) 
  153. 153 {
  154. 154   
  155. 155    var days;       
  156. 156    switch(month)
  157. 157    {
  158. 158        case 1:
  159. 159        case 3:
  160. 160        case 5:
  161. 161        case 7:
  162. 162        case 8:
  163. 163        case 10:
  164. 164        case 12:
  165. 165            days = 31;
  166. 166            break;
  167. 167        case 4:
  168. 168        case 6:
  169. 169        case 9:
  170. 170        case 11:
  171. 171            days = 30;
  172. 172            break;
  173. 173        case 2:
  174. 174            if (((year% 4)==0) && ((year% 100)!=0) || ((year% 400)==0))               
  175. 175                days = 29;               
  176. 176            else                               
  177. 177                days = 28;               
  178. 178            break;
  179. 179    }
  180. 180    return (days);
  181. 181 }               
  182. 182 /*----- END OF MY CODE FOR Gantt CHART GENERATOR -----*/
复制代码
如何使用这段脚本

在你的HTML, ASCX, ASPX或PHP文档的Body部分,把下面几行代码拷贝到你想表示甘特图的地方。
  1. 1 <body>   
  2. 2    <h3>Diagram</h3>   
  3. 3    <div style="position:relative" class="Gantt" id="GanttChart"></div>
  4. 4 </body>
  5. 5 <script>
  6. 6    var g = new Gantt(document.all.GanttChart);
  7. 7    g.AddTaskDetail(new Task('2/11/2008', '2/12/2008',
  8. 8                    '<b>Sample task 1 1</b>', 'Dathq', 50));
  9. 9    g.AddTaskDetail(new Task('2/16/2008', '2/19/2008',
  10. 10                    ' Sample task 1.1', 'Dathq, Thanhdd', 30));
  11. 11    g.AddTaskDetail(new Task('2/12/2008', '3/4/2008', 'Sample task 2', 'Hanhnd', 60));
  12. 12    g.AddTaskDetail(new Task('2/11/2008', '2/16/2008', 'Sample task 3', 'Dathq', 50));
  13. 13   
  14. 14    g.Draw();   
  15. 15 </script>
复制代码
使用var g = new Gantt(document.all.GanttChart);语句指定你要显示的甘特图到命名为"GanttChart"的DIV元素(你可以在body中看到它)。

g.AddTaskDetail()方法添加任务到任务列表。你可以使用AJAX或任何你喜欢的方式来生成这些命令以添加任务的集合。

使用g.Draw()来渲染基于追加到甘特图对象的任务列表的甘特图。

如何改变组件外观

这里笔者定义了一些类用来自定义甘特图的样式,为此提供了全部代码。你可以定义更多的类并且更轻易地改变甘特图控件的外观。

通过改变样式表,并且在代码中添加属性到任务对象,你可以为你自己创建更加智能的甘特图。例如:为任务条设置不同的颜色,漂亮的背景图片,更好的图标提示等等。

样式表
  1. 1    /*----- SICON GANTT CHART STYLE CLASSES --------------------------
  2. 2      * DESCRIPTION    : Theses class is required for SIcon Gantt Chart
  3. 3      * NOTE            : Should change the color, the text style only
  4. 4      *----------------------------------------------------------------*/
  5. 5    .Gantt
  6. 6    {
  7. 7        font-family:tahoma, arial, verdana;
  8. 8        font-size:11px;
  9. 9    }
  10. 10   
  11. 11    .GTaskTitle
  12. 12    {
  13. 13        font-family:tahoma, arial, verdana;
  14. 14        font-size:11px;
  15. 15        font-weight:bold;
  16. 16    }
  17. 17   
  18. 18    .GMonth
  19. 19    {
  20. 20        padding-left:5px;
  21. 21        font-family:tahoma, arial, verdana;
  22. 22        font-size:11px;
  23. 23        font-weight:bold;   
  24. 24    }
  25. 25   
  26. 26    .GToday
  27. 27    {
  28. 28        background-color: #FDFDE0;   
  29. 29    }
  30. 30   
  31. 31    .GWeekend
  32. 32    {
  33. 33        font-family:tahoma, arial, verdana;
  34. 34        font-size:11px;
  35. 35        background-color:#F5F5F5;
  36. 36        text-align:center;
  37. 37    }
  38. 38   
  39. 39    .GDay
  40. 40    {
  41. 41        font-family:tahoma, arial, verdana;
  42. 42        font-size:11px;
  43. 43        text-align:center;
  44. 44    }
  45. 45   
  46. 46    .GTask
  47. 47    {
  48. 48        border-top:1px solid #CACACA;
  49. 49        border-bottom:1px solid #CACACA;
  50. 50        height:14px;
  51. 51        background-color:yellow;
  52. 52    }
  53. 53   
  54. 54    .GProgress
  55. 55    {
  56. 56        background-color:black;
  57. 57        height:2px;
  58. 58        overflow: hidden;
  59. 59        margin-top:5px;
  60. 60    }
复制代码
图表

Code
  1. 1    var g = new Gantt(document.all.GanttChart);
  2. 2    g.AddTaskDetail(new Task('2/11/2008', '2/19/2008', '<b>Sample task 1 1</b>', 'Dathq', 50));
  3. 3    g.AddTaskDetail(new Task('2/16/2008', '2/19/2008', ' Sample task 1.1', 'Dathq, Thanhdo', 30));
  4. 4    g.AddTaskDetail(new Task('2/12/2008', '3/2/2008', 'Sample task 2', 'Hanhnd', 60));
  5. 5    g.AddTaskDetail(new Task('2/11/2008', '2/16/2008', '<i>Sample task 3<i>', 'Dathq', 50));
  6. 6    g.AddTaskDetail(new Task('2/11/2008', '2/19/2008', '<b>Sample task 1 1</b>', 'Dathq', 50));
  7. 7    g.AddTaskDetail(new Task('2/16/2008', '2/19/2008', ' Sample task 1.1', 'Dathq, Thanhdo', 30));
  8. 8    g.AddTaskDetail(new Task('2/12/2008', '3/2/2008', 'Sample task 2', 'Hanhnd', 60));
  9. 9    g.AddTaskDetail(new Task('2/11/2008', '2/16/2008', '<i>Sample task 3<i>', 'Dathq', 50));
  10. 10    g.AddTaskDetail(new Task('2/11/2008', '2/19/2008', '<b>Sample task 1 1</b>', 'Dathq', 50));
  11. 11    g.AddTaskDetail(new Task('2/16/2008', '2/19/2008', ' Sample task 1.1', 'Dathq, Thanhdo', 30));
  12. 12    g.AddTaskDetail(new Task('2/12/2008', '3/2/2008', 'Sample task 2', 'Hanhnd', 60));
  13. 13    g.AddTaskDetail(new Task('2/11/2008', '2/16/2008', '<i>Sample task 3<i>', 'Dathq', 50));
  14. 14
  15. 15    g.AddTaskDetail(new Task('2/11/2008', '2/19/2008', '<b>Sample task 1 1</b>', 'Dathq', 50));
  16. 16    g.AddTaskDetail(new Task('2/16/2008', '2/19/2008', ' Sample task 1.1', 'Dathq, Thanhdo', 30));
  17. 17    g.AddTaskDetail(new Task('2/12/2008', '3/2/2008', 'Sample task 2', 'Hanhnd', 60));
  18. 18    g.AddTaskDetail(new Task('5/11/2008', '5/16/2008', '<i>Sample task 3<i>', 'Dathq', 50));
  19. 19
  20. 20    g.Draw();
复制代码

兴趣点

你会先注意到图标运行起来速度很快。

SIcon甘特图是通过Javascript创建的,这意味着你可以在众多的Web开发环境中使用它。我比较喜欢ASP.NET,所以我会把此控件和ASP.NET一起使用。另外,你可以使用AJAX创建更酷的应用。你可以自定义CSS类得到更好看的甘特图。我将试图添加链接到任务用来描述他们的关系,并将显示一个父任务,就像我们在MS Project中看到的一样。

甘特图通过HTML显示,因为它使用的是轻量级结构,所以你可以添加更多的功能到图表。例如,提示、链接、图片等,在JScript中使用一些基本的变化就可以获得。

最后,它是全免费的,编码愉快!

原文地址: http://www.codeproject.com/KB/scripting/SIcon_Gantt_Chart.aspx     http://www.pin5i.com/showtopic-20094.html

 



 

基于JS实现简单甘特图 基于JS实现简单甘特图 最近同事求助到一个小小的需求,写一个时间甘特图,主要想表现一个车在一天的不同的时间点里,停靠的站点, 先来看一下效果吧,这里的需求是从早上的5点为开始时间,到第二天到凌晨5点 前期准备 其实网上有很多甘特图的实现方式,但是他们都只能具象到天,不能具体到某个时间点,而且每一个具体的时间段中的描述是不能自定义的,所以准备自己写一下了。 实现逻辑 我们可以先模拟一些demo... 阅读详情

相关推荐

甘特图(Gantt Chart)绘制方法

甘特图(Gantt chart) 又称为横道图、条状图(Bar chart)。其通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。一般情况下,横轴表示时间,纵轴表示各个项目,线条表示期间计划和实际完成的情况。样例如下:甘特图(Gantt Chart)样例那么接下来,小编就告诉大家如何使用Python和R绘制甘特图(Gantt Chart)。今天小编给大家简单的介绍甘特图(Gantt Chart) 的绘制方法,希望对大家有所帮助。

J_Giser的博客 2万+

苦苦寻找的原生JS甘特图,终于找到啦

在项目管理中,甘特图的可视化操作界面,可以让项目规划与风险把控更便捷与清晰,同时该插件是一款基于HTML5、原生javasrcipt的一款js插件,支持在当前主流的前端框架中无缝接入使用,项目管理系统必备。

adamlee520的博客 7328

在前端实现甘特图的方法探索

甘特图是一种常用于项目管理和进度跟踪的图表,它以时间为轴展示任务的开始和结束时间,并以条形表示任务的持续时间。通过在前端开发中实现甘特图,我们可以有效地展示任务的时间安排和进度,提供更直观的项目管理工具。通过以上步骤,我们已经成功地在前端实现了一个简单的甘特图。除了基本的任务安排和时间轴展示外,SpreadJS 还提供了丰富的功能和选项,例如任务的依赖关系、资源分配和进度更新等。总结起来,通过使用 SpreadJS 库,我们可以轻松地在前端实现甘特图,为项目管理和进度跟踪提供强大的工具和可视化效果。

GmhVue的博客 604

大叔程序员,纯JS开发的甘特图插件

MZGantt是一款纯js开发的甘特图插件,可以快速应用于您的web项目。支持拖拽编辑,支持列自定义,支持多段展示,支持自定义日历,样式可调,使用简单,可参数化配置,并提供丰富配置参数和接口满足项目需求

alistguy的博客 4600

全JavaScript实现的甘特图指南

简介:纯JavaScript甘特图是一种Web图表,用于展示项目时间线和进度,无需依赖外部库如jQuery。它由多个条形图组成,代表任务的开始和结束时间,适用于项目管理、任务调度。实现甘特图需要掌握关键知识点:数据结构设计、DOM操作、布局计算、事件处理、动画效果、时间轴绘制以及提供可扩展性和自定义选项。同时,还需要考虑性能优化、兼容性和响应式设计。

weixin_35950531的博客 1461

深入探索JavaScript甘特图组件的实现与应用

任务对象是构成任务管理软件的基础,每一个任务都是一个独立的对象。任务对象通常包含以下基本属性:id: 唯一标识一个任务。name: 任务的名称,用于在用户界面上展示。: 任务的描述,详细说明任务内容。duration: 任务预计需要的时间。startDate: 预计开始日期。endDate: 预计结束日期。status: 任务当前的状态,如:未开始、进行中、已完成等。

weixin_29885875的博客 1001

js实现甘特图

      /**       *   Title:                 甘特图       *   Description:     Javascript中使用表格实现甘特图       *   Copyright:         Copyright   (c)   2002       *   Company:             weide       *   @autho

haitun0921的专栏 8598

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

ACGkaka的博客 6984

PHP+Javascript 实现甘特图

选择工厂、年份、月份生成甘特图 Gantt.blade.php <link rel="stylesheet" href="{{ \Illuminate\Support\Facades\URL::asset('common/common.css') }}"> <link rel="stylesheet" href="{{ \Illuminate\Support\Facades\URL::asset('vendor/myGantt/dhtmlxgantt.css?v=7.0.3') }}"&.

懒虫的博客 1138

Excel数据透视表实战:分组折线图制作与动态分析指南

数据可视化是数据分析的关键环节,其核心原理在于将抽象数据转化为直观图形,以揭示趋势、对比差异。在众多图表类型中,折线图因其能清晰展示连续数据随时间或其他序列的变化趋势,而成为趋势分析的利器。其技术价值在于通过视觉编码,将多维数据关系降维呈现,从而辅助决策。在业务分析、运营监控等应用场景中,常需对比不同分组(如产品线、销售区域)在同一时间序列上的表现,这正是分组折线图要解决的核心问题。本文聚焦于利用Excel数据透视表这一强大工具,高效构建动态分组折线图,并深入探讨数据透视表在数据重塑和图表自动化中的实战应用

weixin_29057237的博客 381

别再纠结了!车规MCU选M7还是R52?一张图看懂你的车身控制器/域控制器该用谁

本文深入探讨车规MCU选型中Cortex-M7与Cortex-R52的核心差异,提供基于安全等级与实时性需求的选型决策图。通过对比ASIL认证、实时性能及成本效益,帮助工程师在车身控制器/域控制器设计中做出精准选择,避免潜在风险与隐性成本。

weixin_42628688的博客 397

重生之--js原生甘特图实现

一个树形结构,根据子节点的时间范围显示显示进度 ,不同的时间范围对应不同的颜色。首先要计算所有节点的 最大时间和最小时间。然后再计算每个甘特图的宽度。数据类型大概是这个样子的。

ping 562

极具性价比的步进电机驱动芯片-TMC2226/TMC2209使用小结

TMC2226/2209相对于TMC2660C、TMC5160来说,价格低了很多,同时功能并没有太多阉割。对比TMC5160,少了内部加减速曲线,电流足够(Ipeak = 2.8A),相对5160而言功能也很足够,所以毫无疑问TMC2226是极具性价比的步进驱动芯片。

Trinamic_TMC的博客 7009

JavaScript实现的甘特图组件

JavaScript实现的甘特图组件 去发现同类优质开源项目:https://gitcode.com/ 简介 此仓库包含一个使用JavaScript开发的甘特图组件,它具有丰富的功能和高度的实用性。该组件能够帮助用户以直观的方式展示项目的时间规划和进度管理。 功能 动态数据绑定:组件支持与动态数据源绑定,使得甘特图能够实时反映项目进度变化。 交互操作:提供拖拽、缩放等交互功能,方便用户调整任务时...

gitblog_06739的博客 452

如何在RT-DETR-R18中修改ultralytics的yaml文件(附完整代码)

本文详细指导如何在RT-DETR模型中,通过修改Ultralytics框架的yaml配置文件,将Backbone从ResNet50轻量化替换为ResNet18。核心步骤包括自定义ResNet18基础模块、调整HybridEncoder的expansion参数至0.5,并协同修改检测头Decoder层数,最终提供完整的配置文件代码,助力开发者在资源受限环境下部署轻量级实时目标检测模型。

weixin_29091445的博客 288

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 322

使用JQuery、js的实现甘特图

1. JQuery plugin  jQuery.ganttView jQuery.ganttView plugin is a very lightweight plugin for creating a Gantt chart in plain HTML...no vector graphics or images required. The plugin supports draggi

技术心得总结 1万+

YOLO11改进-注意力-引入Deformable Large Kernel Attention (DLKA) 解决多尺度、小目标、遮挡等问题

Deformable Large Kernel Attention (DLKA) 是一种用于视觉任务的注意力机制,旨在提升模型在处理不同尺寸和形状对象时的灵活性和性能。DLKA 的设计灵感源自传统的注意力机制,但通过引入可变形核(deformable kernel)来增强对局部特征的适应能力。

qq_64693987的博客 4042

PHP JS echarts 实现甘特图

1、引入js文件: <script type="text/javascript" src="jQuery存放路径/jquery.min.js"></script> <script type="text/javascript" src="echarts存放/echarts.min.js"></script> 2、存放甘特图的容器 <div id="container"></div><!--其他样式自行加上即可--> ...

懒虫的博客 1244

ABAP Cloud 开发教程的文章目录

本教程涵盖 ABAP 云端 Client 处理、多租户架构、ABAP Cloud开发、动态编程优化、SQL语法改进等技术主题。最新版本1.0.0(更新至2025-12-12),包含197篇文章,重点文章包括《ABAP Client Handling与隔离机制》《ABAP Platform 2021泛型编程》《SAP BTP ABAP多租户应用开发》等,为开发者提供从基础到进阶的实战指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1806

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JavaScript实现的甘特图组件:项目管理利器

JavaScript实现的甘特图组件:项目管理利器 去发现同类优质开源项目:https://gitcode.com/ 项目核心功能/场景 直观展示项目时间规划与进度管理。 项目介绍 在项目管理领域,甘特图是一种不可或缺的工具,它能帮助项目管理者清晰掌握项目的时间线和进度状态。今天,我们介绍一个使用JavaScript开发的甘特图组件,这个组件不仅具有高度的可定制性,还具备动态数据绑定和丰富的交互功...

gitblog_06719的博客 350

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最优的JS甘特图插件【转载】

甘特图

meteorites的博客 4528

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

原生JS甘特图插件MZGantt:多选下拉列表实现详解

摘要:MZGantt实现多选下拉列表需在列定义中配置type: "DropDownList"和multiSelect: true属性,选项数据需为包含value和text的对象数组。前端渲染时下拉框会显示多选标记和已选项样式,适用于需要多选的业务场景。详细配置可参考MZGantt官网文档。(98字)

alistguy的博客 73

基于JS简单甘特图

基于JS简单甘特图 最近同事求助到一个小小的需求,写一个时间甘特图,主要想表现一个车在一天的不同的时间点里,停靠的站点, 先来看一下效果吧,这里的需求是从早上的5点为开始时间,到第二天到凌晨5点 前期准备 其实网上有很多甘特图的实现方式,但是他们都只能具象到天,不能具体到某个时间点,而且每一个具体的时间段中的描述是不能自定义的,所以准备自己写一下了。 实现逻辑 我们可以先模拟一些demo数据...

weixin_34220834的博客 2201

如何快速实现交互式JavaScript甘特图:Frappe Gantt完全指南

Frappe Gantt是一款轻量级、现代化的开源JavaScript甘特图库,专为Web应用设计。它提供直观的项目时间线可视化,支持任务拖拽、进度调整和交互式操作,帮助开发者轻松构建专业的项目管理界面。无论是小型团队协作工具还是企业级项目管理系统,Frappe Gantt都能提供高效的时间线展示解决方案。 ## 📊 什么是Frappe Gantt? Frappe Gantt(项目路径:gh

gitblog_00844的博客 1025

【React甘特图】基于React纯js编码实现的甘特图插件easy-gant-beta

modal、popover、tree、以及基于antd表单实现的noForm配置具体使用可参考README.md。

qq_41325032的博客 771
下一篇: Ext Gantt Web甘特图控件 >> Web甘特图文档
uncle_p
博客等级 码龄15年 4粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值