vue实现横向时间轴

yizhihongxing

下面是Vue实现横向时间轴的完整攻略。

实现思路

实现横向时间轴的关键在于CSS部分的设计。我们需要定义好每个时间点的样式以及它们之间的间隔。

在Vue中,我们可以采用循环遍历的方式,动态生成时间点列表。同时,为了实现滚动效果,我们需要监听鼠标事件,并且动态计算容器滚动的距离。

具体实现

第一步:HTML结构

我们需要先定义好HTML结构。

<div class="container">
  <div class="timeline">
    <div class="timeline-item" v-for="(item, index) in timelineList" :key="index" :style="{ left: item.left + 'px' }" >
      <div class="timeline-item-title">
        {{ item.year }}
      </div>
    </div>
  </div>
</div>

其中,container为容器,timeline为横向时间轴的包裹容器,timeline-item为每个时间点对应的元素,timeline-item-title为每个时间点的标题。

第二步:CSS样式

接下来,我们需要定义相应的CSS样式。

.container {
  overflow-x: auto;
  white-space: nowrap;
  width: 100%;
}

.timeline {
  height: 4px;
  background-color: #ddd;
  position: relative;
}

.timeline-item {
  position: absolute;
  top: -6px;
  display: inline-block;
  width: 20px;
  height: 20px;
  background-color: #fff;
  border: 2px solid #ddd;
  border-radius: 50%;
}

.timeline-item-title {
  text-align: center;
  white-space: nowrap;
  width: 60px;
  margin-left: -20px;
  font-size: 12px;
}

其中,container设置为可滚动的,同时用white-space: nowrap属性来防止换行。timeline为横向时间轴的底部,用来承载每个时间点。timeline-item为每个时间点对应的元素,设置为绝对定位,用display: inline-block来实现在同一行的效果。timeline-item-title为每个时间点的标题,用width属性来设置标题的长度,当长度超过时间点宽度时,会自动换行。

第三步:Vue逻辑

最后,我们需要用Vue来实现动态绑定时间点数据以及计算容器滚动距离。

export default {
  data() {
    return {
      timelineList: [
        { year: '2021', left: 0 },
        { year: '2022', left: 100 },
        { year: '2023', left: 200 },
        { year: '2024', left: 300 },
        { year: '2025', left: 400 },
        { year: '2026', left: 500 },
        { year: '2027', left: 600 },
        { year: '2028', left: 700 },
        { year: '2029', left: 800 },
      ],
      containerWidth: 0,
      isDragging: false,
      lastClientX: 0,
      scrollLeft: 0,
    };
  },
  computed: {
    containerStyle() {
      return {
        width: `${this.containerWidth}px`,
      };
    },
  },
  mounted() {
    this.$nextTick(() => {
      this.containerWidth = this.$refs.container.clientWidth;
    });

    window.addEventListener('mousemove', this.handleMouseMove);
    window.addEventListener('mouseup', this.handleMouseUp);
  },
  beforeDestroy() {
    window.removeEventListener('mousemove', this.handleMouseMove);
    window.removeEventListener('mouseup', this.handleMouseUp);
  },
  methods: {
    handleMouseDown(event) {
      this.isDragging = true;
      this.lastClientX = event.clientX;
      this.scrollLeft = this.$refs.container.scrollLeft;
    },
    handleMouseMove(event) {
      if (!this.isDragging) {
        return;
      }

      const deltaX = event.clientX - this.lastClientX;
      const newScrollLeft = this.scrollLeft - deltaX;
      this.$refs.container.scrollLeft = newScrollLeft;
    },
    handleMouseUp(event) {
      this.isDragging = false;
    },
  },
};

其中,timelineList为存储时间点数据的数组,left属性用来动态计算每个时间点离底部的距离。containerWidth为容器的宽度,用来计算滚动距离。isDragging、lastClientX、scrollLeft用来记录是否拖拽,上次的鼠标位置以及当前容器的滚动距离。

为了实现拖拽滚动的效果,我们需要监听鼠标事件,并且计算拖拽的距离来实现容器的滚动。

示例

以下是两个基于Vue实现的横向时间轴的示例:

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现横向时间轴 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 如何使用HBuilderX把vue项目打包成apk

    下面是使用HBuilderX将Vue项目打包成APK的攻略: 确保环境配置正确 在使用HBuilderX打包Vue项目之前,需要先确保一些环境配置已经正确安装。具体需要安装的软件如下: JDK环境:移动端应用打包需要使用到Java环境,所以首先需要下载和安装JDK。下载JDK的网址为:https://www.oracle.com/technetwork/cn…

    Vue 2023年5月28日
    00
  • Vue加载json文件的方法简单示例

    下面是“Vue加载json文件的方法简单示例”的完整攻略: 1. 安装 axios 为了能方便地加载JSON文件,我们需要安装axios,它是一个基于Promise的HTTP库,可以用于浏览器和Node.js。我们可以使用npm进行安装,命令如下: npm install axios –save 2. 创建一个JSON文件 为了演示如何通过Vue加载JSO…

    Vue 2023年5月28日
    00
  • Vue filter格式化时间戳时间成标准日期格式的方法

    下面是 “Vue filter格式化时间戳时间成标准日期格式的方法”的完整攻略: 1. 什么是Vue filter? Vue.filter是Vue提供的用于全局过滤器的机制,它可以重用一些常见的文本转换用法(包括格式化时间戳),以确保我们的代码具有更高的可读性、可维护性和可重用性。 下面我们将讲解如何使用Vue filter来格式化时间戳成标准的日期时间格式…

    Vue 2023年5月28日
    00
  • vue 下载文档乱码的解决

    Vue 下载文档乱码的解决 在 Vue.js 官方网站上,我们可以找到 Vue.js 的文档,并进行下载。然而,在某些情况下,下载下来的文档可能会出现乱码的情况。本文将为您提供一种解决乱码问题的方法。 解决方法 在下载文档前,需要在 HTTP 头部指定正确的编码方式: <meta http-equiv="Content-Type" …

    Vue 2023年5月27日
    00
  • vue如何定义全局变量和全局方法实例代码

    下面我将详细讲解Vue如何定义全局变量和全局方法的实例代码。 定义全局变量 在Vue中,定义全局变量可以通过Vue的原型挂载属性的方式,以下是具体实现步骤: 首先在Vue实例化之前,通过Vue的原型注册全局属性: Vue.prototype.$globalVariable = ‘global_variable’; 这个例子中注册了一个名为$globalVar…

    Vue 2023年5月28日
    00
  • VUE v-for中的:key详解

    当在 Vue 的模板中使用 v-for 来循环渲染一组 DOM 元素时,每个被渲染的元素都要有一个唯一的 key 属性。这个属性在 Vue 的模板编译器中扮演着非常重要的角色,它可以帮助 Vue 跟踪每个被渲染的元素的身份和状态,从而优化渲染效果。 key 的作用 一个简单的示例,我们假设一个列表,其中有一些元素是需要从列表中删除的,那么删除时就需要更新数据…

    Vue 2023年5月28日
    00
  • VueJs 搭建Axios接口请求工具

    VueJs 搭建 Axios 接口请求工具可以分为以下几个步骤: 1. 安装 Axios 首先,在 VueJs 中使用 Axios 需要先安装 Axios 库。可以使用 npm 命令进行安装(前提是已经安装了 npm): npm install axios 2. 创建请求服务 可以在 Vue 项目中新建一个 services 文件夹,在其中创建 api.js…

    Vue 2023年5月28日
    00
  • 基于cornerstone.js的dicom医学影像查看浏览功能

    下面我将为大家分享基于cornerstone.js的dicom医学影像查看浏览功能的完整攻略: 简介 DICOM(Digital Imaging and Communications in Medicine)是医学影像和相关信息的国际标准,它定义了医学影像的格式、传输协议以及元数据等信息,被广泛应用于医学领域。在web应用中,通常需要通过浏览器对DICOM医…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部