在xpyjs/gantt项目中实现当前时间指示线的技术方案
gantt An easy-to-use Gantt component. 持续更新,中文文档 项目地址: https://gitcode.com/gh_mirrors/gantt/gantt
背景介绍
在甘特图(Gantt)应用中,显示当前时间指示线是一个常见的需求,它可以帮助用户快速定位当前时间在时间轴上的位置。xpyjs/gantt作为一款开源的甘特图组件,虽然当前版本尚未原生支持此功能,但开发者可以通过CSS技巧实现这一效果。
实现原理
核心思路是利用CSS的线性渐变(linear-gradient)特性,在甘特图的时间轴上绘制一条垂直线来表示当前时间。具体实现分为以下几个步骤:
-
计算当前时间位置:首先需要计算当前时间在24小时时间轴上所占的比例,然后映射到甘特图的实际宽度上。
-
创建渐变背景:使用CSS的linear-gradient函数,在计算出的位置绘制一条窄线,其余部分保持透明。
-
应用样式:将计算好的渐变样式应用到甘特图的日期线上。
具体实现代码
以下是基于Vue 3的组合式API实现方案:
// 计算当前时间在时间轴上的偏移量
const getCurrentTimeOffset = (widthPx = 85) => {
const now = new Date()
const totalMinutes = 24 * 60
const currentMinutes = now.getHours() * 60 + now.getMinutes()
return (currentMinutes / totalMinutes) * widthPx
}
// 计算当前时间线的CSS渐变值
const currentBackgroundLine = computed(() => {
const offset = getCurrentTimeOffset(85)
const lineWidth = 2 // 线宽2像素
const start = offset.toFixed(2)
const end = (offset + lineWidth).toFixed(2)
return `linear-gradient(to right,
transparent ${start}px,
var(--secondary) ${start}px,
var(--secondary) ${end}px,
transparent ${end}px
)`
})
对应的样式定义:
:deep(.xg-gantt-body-date-line) {
&.weekend {
background-color: var(--white) !important;
background-image: repeating-linear-gradient(
45deg,
var(--color-border-secondary) 14px,
var(--color-border-secondary) 16px,
transparent 12px,
transparent 20px
);
}
&.today {
background-color: transparent !important;
background-image: v-bind(currentBackgroundLine);
z-index: 999; // 确保时间线在最上层显示
}
}
技术要点解析
-
时间计算:
getCurrentTimeOffset
函数将当前时间转换为分钟数,然后计算其在24小时(1440分钟)中的比例,最后映射到实际宽度上。 -
CSS渐变技巧:通过定义渐变在特定位置的颜色变化,可以创建一条窄线效果。这里使用透明→颜色→颜色的→透明的渐变,形成一条垂直线。
-
响应式设计:使用Vue的computed属性确保时间线位置会随着时间变化自动更新。
-
样式穿透:使用
:deep()
选择器可以穿透scoped样式的限制,修改组件内部的样式。
效果展示
实现后,甘特图上会显示一条垂直的当前时间线,用户可以清晰地看到当前时间在项目时间轴上的位置。这条线会随着时间推移自动移动,保持与系统时间同步。
注意事项
-
时间线的宽度(85px)需要根据实际甘特图的列宽进行调整。
-
如果甘特图显示的时间范围不是24小时,需要相应调整时间计算逻辑。
-
在大型项目中,可以考虑将此功能封装为可复用的组件或混入(mixin)。
-
未来xpyjs/gantt的新版本可能会原生支持此功能,届时可以简化实现方式。
这种实现方式虽然简单,但效果明显,能够很好地满足用户快速定位当前时间的需求,提升了甘特图的使用体验。
gantt An easy-to-use Gantt component. 持续更新,中文文档 项目地址: https://gitcode.com/gh_mirrors/gantt/gantt
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考