在xpyjs/gantt项目中实现当前时间指示线的技术方案

在xpyjs/gantt项目中实现当前时间指示线的技术方案

gantt An easy-to-use Gantt component. 持续更新,中文文档 gantt 项目地址: https://gitcode.com/gh_mirrors/gantt/gantt

背景介绍

在甘特图(Gantt)应用中,显示当前时间指示线是一个常见的需求,它可以帮助用户快速定位当前时间在时间轴上的位置。xpyjs/gantt作为一款开源的甘特图组件,虽然当前版本尚未原生支持此功能,但开发者可以通过CSS技巧实现这一效果。

实现原理

核心思路是利用CSS的线性渐变(linear-gradient)特性,在甘特图的时间轴上绘制一条垂直线来表示当前时间。具体实现分为以下几个步骤:

  1. 计算当前时间位置:首先需要计算当前时间在24小时时间轴上所占的比例,然后映射到甘特图的实际宽度上。

  2. 创建渐变背景:使用CSS的linear-gradient函数,在计算出的位置绘制一条窄线,其余部分保持透明。

  3. 应用样式:将计算好的渐变样式应用到甘特图的日期线上。

具体实现代码

以下是基于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;  // 确保时间线在最上层显示
    }
}

技术要点解析

  1. 时间计算getCurrentTimeOffset函数将当前时间转换为分钟数,然后计算其在24小时(1440分钟)中的比例,最后映射到实际宽度上。

  2. CSS渐变技巧:通过定义渐变在特定位置的颜色变化,可以创建一条窄线效果。这里使用透明→颜色→颜色的→透明的渐变,形成一条垂直线。

  3. 响应式设计:使用Vue的computed属性确保时间线位置会随着时间变化自动更新。

  4. 样式穿透:使用:deep()选择器可以穿透scoped样式的限制,修改组件内部的样式。

效果展示

实现后,甘特图上会显示一条垂直的当前时间线,用户可以清晰地看到当前时间在项目时间轴上的位置。这条线会随着时间推移自动移动,保持与系统时间同步。

注意事项

  1. 时间线的宽度(85px)需要根据实际甘特图的列宽进行调整。

  2. 如果甘特图显示的时间范围不是24小时,需要相应调整时间计算逻辑。

  3. 在大型项目中,可以考虑将此功能封装为可复用的组件或混入(mixin)。

  4. 未来xpyjs/gantt的新版本可能会原生支持此功能,届时可以简化实现方式。

这种实现方式虽然简单,但效果明显,能够很好地满足用户快速定位当前时间的需求,提升了甘特图的使用体验。

gantt An easy-to-use Gantt component. 持续更新,中文文档 gantt 项目地址: https://gitcode.com/gh_mirrors/gantt/gantt

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宁渤红Eliza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值