时间轴 - 基于vue2, 可以拖动和滚轮缩放

参考文档:手摸手带你实现一个时间轴组件

说明:实现思路来源于上面的文档,在此基础上做了一些调整,以符合项目需求

完成代码在github上,大家可以自行下载,喜欢的麻烦点个赞

另外也可以去npm直接下载插件

  • 下载插件
    yarn add v-time-shaft
    
  • 全局引入
    import TimerShaft from 'v-time-shaft'
    ......
    Vue.use(TimerShaft)
    
  • 组件中使用
    <template>
      <div id="app">
        <div class="timer-shaft-content">
          <!-- 不限制时间范围,只初始化默认展示哪天的时间 -->
          <v-time-shaft date="2024-05-29"></v-time-shaft>
        </div>
        <div class="timer-shaft-content">
          <!-- 限制时间范围的有用法 -->
          <v-time-shaft isLimit :date="date" :dateRange="dateRange"></v-time-shaft>
        </div>
      </div>
    </template>
    

效果图:

  • 成品效果图
    在这里插入图片描述
  • 放大后,查看时间片段在这里插入图片描述
  • 不限制范围拖动到前一天在这里插入图片描述
  • 时间指示器【鼠标移入,产生的蓝色线条和时间点】在这里插入图片描述

开发环境

node v16.18.0
yarn v1.22.19

vue 模版

事件绑定在canvas的容器上,方便进行canvas分层绘制

<template>
  <div 
    class="canvas-contain"
    ref="canvasContain"
    @mousedown="onMousedown"
    @mouseup="onMouseup"
    @mouseout="onMouseout"
    @mousemove="onMousemove"
    @mousewheel="onMousewheel"
  >
    <canvas ref="canvas"></canvas>
    <canvas class="canvas-line" ref="canvasLine"></canvas>
  </div>
</template>
<style lang="less" scoped>
.canvas-contain {
     
  width: 100%;
  height: 100%;
  position: relative;
  .canvas-line {
     
    position: absolute;
    left: 0;
    top: 0;
  }
}
</style>
  1. 一个canvas用于绘制时间轴,一个处理鼠标移动绘制时间指示器
  2. 模版和样式表都非常简单,不做赘述

实现步骤

实现逻辑:在一个缩放等级下,确定用多少根刻度线画出所有对应的时间范围
如:缩放等级下24小时的时间轴,则要在canvas范围内绘制多根刻度线表示24小时

开始开发

初始化

  1. 创建一个init方法
  2. 设置浏览器变化的resize事件
this.init();
window.addEventListener('resize', this.init)
  1. 设置一下画布的宽高及获取画布上下文:
init() {
   
  this.contain = this.$refs.canvasContain
  if (!this.contain) return
  this.canvas = this.$refs.canvas
  this.canvasLine = this.$refs.canvasLine
  let {
   width, height} = this.contain.getBoundingClientRect()
  // 缓存width,height
  Object.assign(this, {
   width, height})
  // 设置canvas width,height
  Object.assign(this.canvas, {
   width, height})
  Object.assign(this.canvasLine, {
   width, height})
  // 获取画布上下文
  this.ctx = this.canvas.getContext('2d')
  this.ctxLine = this.canvasLine.getContext('2d')
  // 开始绘制
  this.draw()
},

可传参数说明:
timeSegmentsData
  • Array[object] 时间范围片段数据,
// 基本结构如下:
[{
   
  id,
  beginTime,          // 片段开始时间,时间戳,单位毫秒
  finishTime,         // 片段结束时间,时间戳,单位毫秒
  active,             // 是否选中状态
  lineWidth,          // 片段边框的线宽
  y,                  // 片段在canvas上距离顶部距离
  h,                  // 片段在canvas上的高度
  bgColor,            // 片段背景颜色
  borderColor,        // 片段边框颜色
  bgColorActive,      // 片段选中状态背景颜色
  borderColorActive,  // 片段选中状态边框颜色
  ...
}]
gridStyles
  • Object 时间刻度样式
// 支持属性:
{
   
  lineColor,  // 刻度线条颜色
  lineWidth,  // 刻度线条宽度
  lineHeight  // 刻度线条高度
  color,      // 刻度上时间的文字颜色
  dateColor,  // 刻度上的日期文字颜色
  bgColor,    // 刻度条背景颜色
  bgHeight,   
### Vue 时间轴组件中的拖动功能实现 为了实现在Vue项目中带有拖动功能的时间轴,`TimelineSliderVue` 是一个合适的选择。此库提供了时间线滑块的功能,允许用户通过拖拽来调整时间位置[^1]。 安装 `timeline-slider-vue` 可以通过 npm 完成: ```bash npm install timeline-slider-vue --save ``` 接着,在Vue文件里引入并注册该组件: ```javascript // main.js or any entry file of your project import { createApp } from 'vue'; import App from './App.vue'; import TimelineSliderVue from 'timeline-slider-vue'; const app = createApp(App); app.component('TimelineSlider', TimelineSliderVue); app.mount('#app'); ``` 对于希望在已有时间轴上增加拖动特性的开发者来说,如果现有组件不提供原生的支持,则可能需要手动编码实现这一特性。这通常涉及到监听鼠标事件(mousedown, mousemove mouseup),以及更新DOM元素的位置或状态。然而,考虑到复杂性维护成本,推荐优先考虑像 `TimelineSliderVue` 这样的第三方库,它们已经实现了这些交互逻辑,并经过了充分测试。 另外,也有其他一些较为通用的时间轴组件可供选择,比如支持多种布局方式高度可配置选项的 vue-timeaxis 组件[^2]。虽然这类组件本身未必内置拖放能力,但是其良好的扩展性使得添加此类行为变得更加容易。当结合使用类似 vuedraggable 的工具时,就可以轻松赋予时间轴条目之间的顺序重新排列的能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值