首页 > 其他分享 >vue实现水平时间轴拖拽功能

vue实现水平时间轴拖拽功能

时间:2024-02-19 10:23:48浏览次数:29  
标签:__ 00 vue return let split initDates 拖拽 时间轴

需求介绍

  • 因为公司项目中有个摄像头历史录像回放需求功能,需要对过往任意时间段的历史影像进行查看,需要做一个水平方向范围可以拖拽的时间轴,默认所选时间区域为早8点晚18点,左右在拖拽结束的时候直接获取所选区域的开始和结束时间,当拖拽到当天的24点的时候默认tootip展示下一天的00:00点

技术实现-(代码如下参考)

  • 结合element UI中的Slider 滑块进行相应的改造
<template>
  <div class="block">
    <el-date-picker :clearable="false" value-format="yyyy-MM-dd" v-model="value1" type="date" @change="dateChanged"
      :picker-options="pickerOptions" placeholder="选择日期">
    </el-date-picker>
    <el-slider :format-tooltip="formatTooltip" :max="1440" v-model="value" range :step="1" @change="gang"
      :marks="marks" />
  </div>
</template>
<script>

import moment from 'moment'
export default {
  name: 'HomeView',
  components: {
  },
  data() {
    return {
      dateList: [],
      value1: moment(new Date()).format('yyyy-MM-DD'),
      value: [480, 1080],
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() > Date.now();
        },
      },
      initDate: [],
      marks: {
        0: '00:00',
        60: '01:00',
        120: '02:00',
        180: '03:00',
        240: '04:00',
        300: '05:00',
        360: '06:00',
        420: '07:00',
        480: '08:00',
        540: '09:00',
        600: '10:00',
        660: '11:00',
        720: {
          style: {
            color: '#000000'
          },
          label: this.$createElement('strong', '12:00')
        },
        780: '13:00',
        840: '14:00',
        900: '15:00',
        960: '16:00',
        1020: '17:00',
        1080: '18:00',
        1140: '19:00',
        1200: '20:00',
        1260: '21:00',
        1320: '22:00',
        1380: '23:00',
        1440: '00:00',
      }

    }
  },
  created() {
    let eventList = this.getDragDate();
    console.log(eventList, '当前区域的开始结束时间');
  },
  methods: {
    initDates(flag) {
      if (flag) {
        // 时间到达24h时,需要对展示时间的日期/小时/分钟做处理
        let out_24 = String(Number(this.value1.split(' ')[0].split('-')[2]) + 1)
        return this.value1.split(' ')[0].split('-')[0] + '-' + this.value1.split(' ')[0].split('-')[1] + '-' + (out_24 < 10 ? out_24.padStart(2, '0') : out_24) + ' ' + '00:00'
      } else {
        return this.value1.split(' ')[0].split('-')[0] + '-' + this.value1.split(' ')[0].split('-')[1] + '-' + this.value1.split(' ')[0].split('-')[2] + ' ';
      }
    },
    dateChanged() {
      this.value = [480, 1080];
      let eventList = this.getDragDate();
      console.log(eventList, '当前区域的开始结束时间');
    },
    getDragDate() {
      let dateResult = this.initDates();
      let arr = [dateResult + '' + '08:00', dateResult + '' + '18:00'];
      return arr
    },
    convertToTime(decimalHours) {
      const hours = Math.floor(Math.floor(decimalHours) / 60);
      const minutes = Math.round((decimalHours) % 60);
      const formattedHours = hours.toString().padStart(2, '0');
      let formattedMinutes = (minutes < 10 ? '0' + minutes : minutes);
      const timeStr = `${formattedHours}:${formattedMinutes}`;
      return timeStr;
    },
    formatTooltip(val) {
      const timeStr = this.convertToTime(val)
      if (val !== 1440) {
        return this.initDates() + timeStr
      } else {
        return this.initDates(true)
      }
    },
    gang(val) {
      const startTime = this.convertToTime(val[0]);
      const endtTime = this.convertToTime(val[1]);
      let left = this.initDates() + startTime;
      let right = this.initDates() + endtTime;
      if (val[1] == 1440) {
        right = this.initDates(true)
      }
      this.dateList = [left, right]
      console.log(this.dateList, '手动触发');
    },
  },
}
</script>
<style lang="scss" scoped>
.block {
  ::v-deep(.el-slider__runway) {
    height: 36px;
    width: 90%;
    margin: 20px auto;

    .el-slider__bar {
      height: 36px;
      background-color: #8ebbc5;
    }

    .el-slider__stop {
      top: 26px;
      width: 2px;
      height: 10px;
      background-color: #d3d1d1
    }

    .el-slider__button-wrapper {
      top: 0px;

      .el-slider__button {
        border-color: #8ebbc5;
        border-radius: 0px;
        height: 32px;
        width: 5px;
      }
    }

    .el-slider__marks {
      .el-slider__marks-text {
        margin-top: 40px;
      }
    }
  }
}
</style>
![](/i/l/?n=24&i=blog/2485085/202402/2485085-20240219101121820-787467902.jpg)

标签:__,00,vue,return,let,split,initDates,拖拽,时间轴
From: https://www.cnblogs.com/xqy183011/p/18020514

相关文章

  • vue报错: error:0308010C:digital envelope routines::unsupported
    问题解决参考:https://blog.csdn.net/m0_65933139/article/details/130690790问题描述:报错:Error:error:0308010C:digitalenveloperoutines::unsupported报错原因:因为node.jsV17版本中最近发布的OpenSSL3.0,而OpenSSL3.0对允许算法和密钥大小增加了严格的......
  • 如何实现基于vue技术的管理系统的用户是否登录
    问题:在进行前后端分离开发时候,我们会处理一些前端用户的登录状态。如果用户没有进行登录,则不允许用户访问某些页面一、登录方式首先可以先了解一下前后端分离后的登录方式(1)Cookie+Session(2)Token二、Cookie+SessionHTTP是一种无状态的协议,客户端每次发送请求时,首先要和服务......
  • Vue3实现加入购物车抛物线效果组件
    前言在前几天的一次迭代中,我遇到了这么一个需求,模仿支付宝首页应用中心的编辑功能,支持编辑首页展示的应用,在支付宝应用首页编辑功能中,我注意到一种独特而细致的设计。无论是增加还是移除某个应用,都会引发一个精美的移动动画效果。这种贴心的设计在用户体验中起到了微妙而关键的作......
  • 解决vue2中el-table表格组件的空状态过小的问题
    问题当我们使用element的表格组件的时候,空状态会变的非常瘪,就会造成页面非常难看这样很不美观解决办法可以使用插槽设置空状态,并通过css来调整空状态的样式新建一个空表格<template><div><el-table:data="tableData"stripestyle="width:100%">......
  • 25个常见的python系统设计源码(python+mysql+vue)
    收集整理了25个常见的python系统设计源码。可以用于课程作业或者毕业设计。所有系统都带源码和文档。1.网上商城系统这是一个基于python+vue开发的商城网站,平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。......
  • Vue.js前端框架之vite+vue+naive前端项目模板
    1.搭建Vue示例项目npmcreatevue cdvue-demo:进入项目目录npminstall:安装所有依赖npmrundev:启动项目2.了解Vue开发和工作原理2.1package.json类似于Python项目中pyproject.toml,包含了项目名称、版本、命令、依赖、设定2.2index.html浏览器访问到的HTML文件 ......
  • 【Vue前端】vue使用笔记0基础到高手第2篇:Vue进阶知识点介绍(附代码,已分享)
    本系列文章md笔记(已分享)主要讨论vue相关知识。Vue.js是前端三大新框架:Angular.js、React.js、Vue.js之一,Vue.js目前的使用和关注程度在三大框架中稍微胜出,并且它的热度还在递增。Vue.js是一个轻巧、高性能、可组件化的MVVM库,同时拥有非常容易上手的API。Vue.js是一个构建数据驱动......
  • vue基础知识和原理(二)
    1.13列表渲染v-for指令用于展示列表数据语法:v-for="(item,index)inxxx":key="yyy"可遍历:数组、对象、字符串(用的很少)、指定次数(用的很少)<divid="root"><!--v-for指令:1.用于展示列表数据......
  • [Vue] CSS中的v-bind
    在Vue中说到v-bind大多数时候都是想到template中动态绑定script中的响应式数据。但其实在单文件组件(SFC)中,<style>标签内也可以使用v-bind函数绑定数据。如上图第18行代码,使用v-bind(color)绑定了数据。当数据变化时,css样式随之变化:原理:(截取自Vue官方文档)实际的值会被编......
  • 启动vue-element-admin遇到问题解决方案
    概述从https://github.com/PanJiaChen/vue-element-admin下载代码,按照文档执行,期间遇到一些列问题。1#clonetheproject2gitclonehttps://github.com/PanJiaChen/vue-element-admin.git34#entertheprojectdirectory5cdvue-element-admin67#insta......