vue实现横向时间轴

下面是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日

相关文章

  • 基于vue-cli3多页面开发apicloud应用的教程详解第1/2页

    让我来为您讲解一下“基于vue-cli3多页面开发apicloud应用的教程详解第1/2页”的完整攻略。 标题 介绍 在此文档中,我们将详细讲解如何使用Vue CLI 3来开发APICloud应用。在这个过程中,我们将介绍如何创建多页面应用程序,并在其基础上使用APICloud的功能创建完整的应用程序。 前提条件 在开始本教程之前,请确保您已经熟悉Vue.j…

    Vue 2023年5月27日
    00
  • Vite打包优化之缩小打包体积实现详解

    下面就来详细讲解Vite打包优化之缩小打包体积实现的攻略。 什么是Vite? Vite是一种快速的前端构建工具,它可以使用原生ES模块作为项目源代码,通过原生ES模块的特性进行高效构建和打包。 为什么需要优化打包体积? 打包体积是指将项目中的所有代码、资源文件等打包为最终的生产环境运行时文件的大小。打包体积过大会导致项目启动缓慢、网页加载缓慢等问题,而优化打…

    Vue 2023年5月29日
    00
  • 详解Vue3中setup函数的使用教程

    那我就来详细讲解一下“详解Vue3中setup函数的使用教程”的完整攻略。 一、什么是setup函数 setup函数是Vue3中的一个核心新功能,负责替代Vue2的created、beforeCreate、mounted、beforeMount等声明周期钩子函数。 setup函数在组件实例化之前执行,可以被认为是组件的入口函数,负责初始化组件,返回data、…

    Vue 2023年5月27日
    00
  • 详解Vue的监听属性

    Vue.js 是一个流行的 JavaScript 框架,它通过响应式数据绑定,让前端开发更加简单和灵活。在 Vue 中,可以通过监听属性来监听数据的变化,并在数据变化时自动更新页面。本攻略将详细讲解 Vue 的监听属性,包括如何监听数据对象、数组和计算属性的变化。 监听属性的基本使用 在 Vue 中,可以通过 watch 函数来监听一个数据的变化。watch…

    Vue 2023年5月28日
    00
  • vue-resourse将json数据输出实例

    下面是详细讲解“vue-resource将json数据输出实例”的完整攻略: 1. 什么是vue-resource vue-resource是Vue.js官方提供的一个通信插件,它支持浏览器内置的XMLHttpRequest和JSONP,可以很方便地发起http请求并处理响应。 2. 安装vue-resource 可以使用npm命令安装vue-resourc…

    Vue 2023年5月28日
    00
  • vue中destroyed方法的使用说明

    当一个组件(component)被销毁时,Vue 会自动调用该组件的生命周期钩子函数 destroyed。destroyed 生命周期是在组件的程序和网络活动结束后被调用的,并且在其它生命周期钩子函数后执行。这意味着 Vue 实例及其数据观察者已被解绑定,所有的事件监听器和子组件已被移除,所有的计时器和异步任务已被清理。下面就详细讲解 destroyed 方…

    Vue 2023年5月28日
    00
  • Vue的模板语法以及实战案例

    关于 Vue 的模板语法以及实战案例的完整攻略,以下是具体的讲解: Vue 的模板语法 Vue 的模板语法采用了类似于 HTML 的语法,通过将模板中的标签和属性绑定到数据模型中实现了动态渲染页面的效果。具体来说,Vue 的模板语法主要包括以下几个方面: 支持的指令 v-if:条件语句,根据表达式的值选择是否渲染元素。 v-for:循环语句,用于渲染列表或集…

    Vue 2023年5月27日
    00
  • Vue项目部署上线全过程记录(保姆级教程)

    非常感谢您对Vue项目上线过程的关注。以下是我整理的“Vue项目部署上线全过程记录(保姆级教程)”的详细攻略。 确认服务器环境在开始之前,请确保您已经购买了云服务器,在服务器上安装好操作系统和需要的软件环境。推荐使用Linux系统,并保证服务器具备如下配置: 操作系统:CentOS 7/Ubuntu 14.04及以上版本; CPU:1核及以上; 内存:2GB…

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