Vue时间轴

news2024/11/17 3:56:33

之前有这样子的需求没有用第三方插件于是自己写一个简单的时间轴

时间轴滚动条并左右切换滚动条位置相对应移动

在这里插入图片描述

<div class="time-scrollbar">
        <div v-if="timeLineData.length>0" class="scrollbar-content">
          <div class="arrow" @click="clickLeft"> <el-icon :size="40"><ArrowLeft /></el-icon></div>
          <el-scrollbar ref="timeScrollbarRef" @scroll="scrollChange"  always >
            <TimeLine ref="timeLineRef" id="timeLineId" class="time-line" direction="vertical" :stripe="true" sizeIcon="large" 
            :timelineList="timeLineData" :hollowIcon="true" :hasNameCenter="false"/>
          </el-scrollbar>
          <div class="arrow" @click="clickRight"><el-icon :size="40"><ArrowRight /></el-icon></div>
        </div>
        <div v-else class="text-info">暂无数据</div>
   </div>

const clickLeft = () => {
  if(start.value > 0) {
    start.value = start.value-1398
    end.value = end.value-10
    timeScrollbarRef.value.scrollTo(start.value, end.value)
    // 点击更改数据
     // page.value = page.value >=1? 1: page.value-1 
     // getTimeLineData()
  }
}
const scrollChange = (scrollData: any) => {
  start.value = scrollData.scrollLeft
}
const clickRight = () => {
  const contentWidth = document.getElementById('timeLineId')?.offsetWidth as number
  if((end.value + 1398) < contentWidth) {
    start.value = start.value+1398
    end.value = end.value+10
    timeScrollbarRef.value.scrollTo(start.value, end.value)
  }
  //  点击更改数据
  // page.value = page.value+1 
  // getTimeLineData()
}

//TimeLine页面

<template>
  <div class="time-line-box">
    <el-timeline
      :class="{
        timeline: true,
        'timeline-stripe': stripe,
        'timeline-vertical': direction === 'vertical',
        'name-center': hasNameCenter
      }"
      >
      <el-timeline-item
        v-for="(item, index) in timelineList"
        :key="index"
        :timestamp="!$slots.item ? item.time : undefined"
        placement="top"
        center
        :color="item.color"
        :hollow="hollowIcon"
        :size="sizeIcon"
        :icon="hasNameCenter ? () => item.name : undefined"
        :style="
          direction === 'vertical'
            ? `width: calc(${100 / timelineList.length}% - 2px)`
            : 'width: 100%'
        "
        @click="item.onClick"
      >
        <template v-if="$slots.item">
          <slot name="item" :data="item" />
        </template>
        <template v-else>
          <div v-if="!hasNameCenter" class="name">
            {{ item.name }}
          </div>
          <div class="time">
            {{ item.keepTime }}
          </div>
        </template>
      </el-timeline-item>
    </el-timeline>
  </div>
    
</template>
<script lang="ts" setup>
import { PropType } from 'vue'
import { Card } from '@/components'

defineProps({
  stripe: {
    type: Boolean,
    default: false
  },
  direction: {
    type: String as PropType<'horizontal' | 'vertical'>,
    default: 'horizontal'
  },
  timelineList: {
    type: Array as PropType<any[]>,
    default: () => []
  },
  height: {
    type: [Number, String],
    default: () => 150
  },
  hasNameCenter: {
    type: Boolean,
    default: false
  },
  hollowIcon:{
    type: Boolean,
    default: false
  },
  sizeIcon:{
    type: String as PropType<'normal' | 'large'>,
    default: 'normal'
  }
})
</script>
<style lang="scss" scoped>
.time-line-box {
  :deep(.timeline) {
    margin: 0;
    padding: 18px 0 0;
    .el-timeline-item__tail {
      border-left: 2px solid rgba(255, 255, 255, 0.3);
    }
    .el-timeline-item__timestamp {
      margin-bottom: 0;
      padding-top: 0;
    }
    .el-timeline-item__timestamp,
    .el-timeline-item__content {
      font-size: 14px;
      font-weight: normal;
      color: #fff;
    }
    // .el-timeline-item {
    //   width: 100% !important;
    //   // padding: 0 0 10px;
    // }
  }

  :deep(.timeline-vertical) {
    display: flex;
    .el-timeline-item__tail {
      border-left: none;
      border-top: 2px solid rgba(255, 255, 255, 0.3);
      width: 100%;
      position: absolute;
      top: 6px;
    }
    .el-timeline-item__timestamp {
      margin-bottom: 8px;
      padding-top: 4px;
    }
    .el-timeline-item__node {
      left: 35%;
      margin-top: 15px;
      border-color: #037DFF;
    }
    .el-timeline-item__wrapper {
      padding-left: 0;
      position: absolute;
      top: 20px;
      text-align: center;
    }
  }
  :deep(.timeline-stripe) {
    padding-top: 85px;

    .el-timeline-item {
      .el-timeline-item__wrapper {
        transform: translateY(-165%);
      }
      &:nth-child(2n) {
        .el-timeline-item__wrapper {
          transform: translateY(0%);
        }
      }
    }
  }
  :deep(.name-center) {
    .el-timeline-item__node {
      height: 20px;
      border-radius: 4px;
      width: auto;
      padding: 0 5px;
      font-size: 14px;
      font-weight: 500;
      color: #fff;
      .el-timeline-item__icon {
        width: inherit;
        height: inherit;
        line-height: 20px;
      }
    }
  }
}
</style>

记录一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1499586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NextJs教程系列(四):路由loading

loading加载 loading.js 可以帮助你使用React Suspense创建一个组件, 当你在加载路由内容时&#xff0c;它会显示该加载状态组件&#xff0c;渲染完成后&#xff0c;新的内容将会自动替换。 传统ssr渲染流程 传统的ssr渲染流程&#xff0c;当用户请求一个页面时&#xff0c;服…

入门学习Python推荐书籍

. Python作为一门易学易用的编程语言&#xff0c;在近些年得到了越来越多的关注和应用。Python的开发效率极高&#xff0c;语言特性丰富&#xff0c;拓展性强。因此&#xff0c;Python成为了众多IT工程师、科研人员、数据分析师以及爱好者的首选。 那么&#xff0c;对于初学者…

led护眼灯真的能护眼吗?五大热门护眼台灯测评,不容错过!

如今&#xff0c;儿童近视率不断攀升&#xff0c;其中用眼过度疲劳已成为近视的主要诱因。学习环境中光线的适宜与否&#xff0c;直接关乎孩子眼睛的疲劳程度。因此&#xff0c;为孩子营造一个舒适、健康的学习环境显得尤为关键。而一款优质的护眼台灯&#xff0c;正是预防近视…

Hive-源码带你看hive命令背后都做了什么

一、源码下载 下面是hive官方源码下载地址&#xff0c;我下载的是hive-3.1.3&#xff0c;那就一起来看下吧 https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-src.tar.gz 二、总结 由于篇幅太长担心占用你的时间&#xff0c;先把总结写到前面。 1、命令行输入 …

【Linux】软件管理器yum和编辑器vim

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、Linux下安装软件的方案1.1 源代码安装1.2 rpm安装1.3 yum安装 二、Linux软件…

备战2024年汉字小达人活动:历年区级样题练习和解析

今天我们来看一下汉字小达人活动的第一轮选拔的区级样题。区级样题是中文自修杂志社&#xff08;主办方&#xff09;发布的试题&#xff0c;主要是给学校老师选拔参考使用的&#xff0c;据了解&#xff0c;很多学校老师是直接用这个样卷在学校组织选拔&#xff0c;选拔成绩突出…

虚拟主播视频制作,低成本的数字人播报方案

传统的视频制作方式往往面临着成本高、周期长、人力投入大等挑战。为了满足企业对于高效、低成本视频制作的需求&#xff0c;美摄科技凭借其强大的技术研发实力&#xff0c;推出了面向企业的虚拟主播视频解决方案&#xff0c;为企业带来了全新的数字人播报视频制作体验。 美摄…

SVG 渐变边框在 CSS 中的应用

SVG 渐变边框在 CSS 中的应用 <template><div class"home"><div class"one"><svg width"100%" height"100%"><rect x"2" y"2" width"100%" height"100%" fill&q…

『 Linux 』Process Control进程控制(万字)

文章目录 &#x1f996; 前言&#x1f996; fork()函数调用失败原因&#x1f996; 进程终止&#x1f4a5; 进程退出码&#x1f4a5; 进程正常退出 &#x1f996; 进程等待&#x1f4a5; 僵尸进程&#x1f4a5; 如何解决僵尸进程的内存泄漏问题&#x1f4a5; wait( )/waitpid( )…

单链表的实现(数据结构)

本篇博客主要是单链表&#xff08;无头单项不循环&#xff09;的实现的代码分享 说明&#xff1a;因为此单链表无头&#xff08;哨兵位&#xff09;&#xff0c;可以说成没有初始化也可以说初始化时没有一个有效地址作为单链表的起始地址 例如下面代码中的plist NULL。 所以在…

MS5188N——16bit、8 通道、500kSPS、 SAR 型 ADC

产品简述 MS5188N 是 8 通道、 16bit 、电荷再分配逐次逼近型模数 转换器&#xff0c;采用单电源供电。 MS5188N 拥有多通道、低功耗数据采集系统所需的所有 组成部分&#xff0c;包括&#xff1a;无失码的真 16 位 SAR ADC &#xff1b;用于将输入配 置为单端输入…

开源爬虫技术在金融行业市场分析中的应用与实战解析

一、项目介绍 在当今信息技术飞速发展的时代&#xff0c;数据已成为企业最宝贵的资产之一。特别是在${industry}领域&#xff0c;海量数据的获取和分析对于企业洞察市场趋势、优化产品和服务至关重要。在这样的背景下&#xff0c;爬虫技术应运而生&#xff0c;它能够高效地从互…

字符串索引错误解决方案

字符串索引错误通常是由于尝试访问字符串中不存在的索引位置而引起的。我在Python编译中&#xff0c;字符串是一个不可变的序列&#xff0c;可以通过索引访问其中的字符。如果尝试访问超出字符串长度范围的索引位置&#xff0c;将引发IndexError异常。所以下面的问题如果遇到了…

运维知识点-Tomcat

Tomcat tomcat日志告警tomcat文件包含读取漏洞Tomcat ### 远程代码执行(7.0.0-7.0.81) 开启PUT,访问127.0.0.1:8080改PUT,创建x.jsp,写入shellwar后文件部署,登入特定后台,上传包含jsp写的war文件。文件解析tomcat日志告警 cat catalina.sh /usr/local/tomcat/confTo…

运维知识点-JBoss

JBoss 介绍介绍 JBoss是一个基于J2EE的开放源代码的应用服务器,也是一个运行EJB(Enterprise JavaBean)的容器和服务器。它支持EJB 1.1、EJB 2.0和EJB3的规范,体现了J2EE规范中最新的技术。JBoss遵循LGPL许可,可以在任何商业应用中免费使用,并且由开源社区开发,这使得JB…

345.反转字符串中的元音字母

题目&#xff1a;给你一个字符串 s &#xff0c;仅反转字符串中的所有元音字母&#xff0c;并返回结果字符串。 元音字母包括 a、e、i、o、u&#xff0c;且可能以大小写两种形式出现不止一次。 class Solution {//画图&#xff0c;好理解点public String reverseVowels(String…

MySQL常见的存储引擎介绍

我将为您详细讲解 MySQL 常见的存储引擎&#xff0c;以及它们的使用场景、特点、区别和优势。MySQL 支持多种存储引擎&#xff0c;每种存储引擎都有其特定的优势和局限性。了解这些存储引擎的特点和适用场景对于选择合适的存储引擎以及优化数据库性能至关重要。 1. InnoDB 存储…

搞不完的事情,大不了加班?

工作是生活的一部分&#xff0c;但当你发现搞不完的事情&#xff0c;大不了加班&#xff01;你就会陷入无限的循环。 如果你想早点下班 &#xff0c;并且好好做自己的账号&#xff0c;还是少看哪些月入5万-10万的博主&#xff01; 如果你照着大V账号模仿大概率会失败&#xff…

python统计日志中数据从开始到结束的响应时间的最大值、最小值、平均值、中位数

应用场景&#xff1a;需要根据日志文件&#xff0c;统计出数据从开始下发到收到回复所需的时间&#xff0c;包括最大值、最小值、平均值、中位数。 日志格式如图类似&#xff0c;每一行日志开始部分就是所需要截取的时间&#xff1b;1条日记是以某些关键词作为开始&#xff0c;…

R语言自定义颜色

一、创建颜色梯度&#xff08;渐变色&#xff09; 在绘热图时&#xff0c;需要将数值映射到不同的颜色上&#xff0c;这时就需要一系列的颜色梯度colorRampPalette 函数支持自定义的创建一系列的颜色梯度。 代码示例&#xff1a; library(RColorBrewer)x <- colorRampPal…