Vue实现可移动水平时间轴

Vue实现可移动水平时间轴

1. 引入样式文件

head标签内引入需要用到的样式文件,例如:

<head>
  <link rel="stylesheet" href="timeline.css">
</head>

2. 组件的结构

要实现一个时间轴,我们需要用到一个列表(<ul>),每个列表项(<li>)代表一个时间节点,包含时间信息和相关内容。我们可以使用Vue的组件特性将这些节点封装起来,例如:

<template>
  <ul class="timeline">
    <li v-for="(item, index) in timelineItems" :key="index">
      <h2>{{ item.date }}</h2>
      <p>{{ item.content }}</p>
    </li>
  </ul>
</template>

3. 样式的设置

样式文件是根据上述的组件结构进行编写的。我们可以定义整体的样式、列表项的样式、每个节点上时间和内容的样式等。例如:

.timeline {
  list-style: none;
  position: relative;
  padding: 0;
  margin: 60px 0;
}

.timeline li {
  position: relative;
  width: 100%;
  margin: 0 auto;
  padding: 50px 0;
  text-align: center;
}

.timeline li:before,
.timeline li:after {
  content: "";
  display: block;
  width: 30px;
  height: 30px;
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  border-radius: 50%;
}

.timeline li:before {
  left: -15px;
  background-color: #ffffff;
  border: 2px solid #4f86c6;
  z-index: 1;
}

.timeline li:after {
  right: -15px;
  background-color: #4f86c6;
}

.timeline li h2 {
  margin-top: 0;
  color: #333333;
  font-size: 18px;
  font-weight: 400;
}

.timeline li p {
  line-height: 1.5;
  font-size: 16px;
  font-weight: 300;
  margin-bottom: 0;
  color: #666666;
  margin-top: 20px;
}

4. 事件监听与处理

时间轴需要能够左右移动,我们可以在组件中监听用户的鼠标滚轮事件并进行响应。可以使用wheel事件监听用户鼠标滚轮的上下滑动,例如:

<script>
  export default {
    data() {
      return {
        timelineItems: [], // 时间轴节点数据
        currentIndex: 0, // 当前滑动位置对应的节点索引
      }
    },
    mounted() {
      // 监听wheel事件
      window.addEventListener("wheel", this.handleWheel);
    },
    destroyed() {
      // 移除监听
      window.removeEventListener("wheel", this.handleWheel);
    },
    methods: {
      handleWheel(event) {
        // 判断鼠标滚轮事件是上滑还是下滑
        const delta = Math.sign(event.deltaY);
        if (
          (this.currentIndex === 0 && delta < 0) || // 到达时间轴的起点时禁止上滑
          (this.currentIndex === this.timelineItems.length - 1 && delta > 0)
        ) {
          // 到达时间轴的终点时禁止下滑
          return;
        }
        // 根据滑动方向更新当前节点索引
        this.currentIndex += delta;
      },
    }
  }
</script>

5. 计算属性的设置

我们需要根据currentIndex计算出当前可视区域中应该显示的节点。可以在组件中定义computed属性计算这个节点列表,例如:

<script>
  export default {
    data() {
      return {
        timelineItems: [], // 时间轴节点数据
        currentIndex: 0, // 当前滑动位置对应的节点索引
      }
    },
    computed: {
      visibleItems() {
        let start = this.currentIndex - 2;
        start = start < 0 ? 0 : start;
        let end = start + 4;
        end = end > this.timelineItems.length ? this.timelineItems.length : end;
        return this.timelineItems.slice(start, end);
      },
    }
  }
</script>

6. 组件的渲染

根据visibleItems渲染节点列表。我们可以将上一步中计算出的列表项组成一个新的列表传递给模板代码进行渲染,例如:

<template>
  <ul class="timeline">
    <li v-for="(item, index) in visibleItems" :key="index">
      <h2>{{ item.date }}</h2>
      <p>{{ item.content }}</p>
    </li>
  </ul>
</template>

示例1:基础示例

<template>
  <div>
    <h1>Vue实现可移动水平时间轴</h1>
    <timeline :timelineItems="timelineItems"></timeline>
  </div>
</template>

<script>
import timeline from "./timeline.vue";

export default {
  components: {
    timeline,
  },
  data() {
    return {
      timelineItems: [
        {
          date: "2021-03-01",
          content:
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vitae risus pulvinar, dapibus est at, finibus tellus.",
        },
        {
          date: "2021-04-01",
          content:
            "Aliquam erat volutpat. Morbi laoreet sem eu odio efficitur, ac faucibus sapien faucibus.",
        },
        {
          date: "2021-05-01",
          content:
            "Nam bibendum diam sit amet quam hendrerit, vel rhoncus nibh semper.",
        },
        {
          date: "2021-06-01",
          content:
            "Maecenas nec erat nibh. Aliquam erat volutpat. Praesent tincidunt ac velit in lobortis.",
        },
        {
          date: "2021-07-01",
          content:
            "Curabitur sed nulla sodales, sagittis ligula at, tincidunt dolor. Ut a ipsum laoreet, tristique velit non, placerat felis.",
        },
        {
          date: "2021-08-01",
          content:
            "Aenean rhoncus nulla in elementum ullamcorper. Nunc nec diam lobortis, accumsan diam in, aliquet velit.",
        },
        {
          date: "2021-09-01",
          content:
            "Pellentesque at nunc eget magna tristique dapibus. Fusce lobortis nibh enim.",
        },
        {
          date: "2021-10-01",
          content:
            "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.",
        },
        {
          date: "2021-11-01",
          content:
            "Vestibulum nec bibendum risus. Nunc tincidunt elit in nisl finibus condimentum.",
        },
        {
          date: "2021-12-01",
          content:
            "Sed varius erat ut commodo fringilla. Aenean hendrerit, sem in rutrum tincidunt, velit mi tempus eros, vel tempus libero sapien a velit.",
        },
      ],
    };
  },
};
</script>

该示例代码中,我们定义了一个timeline组件,并将一个包含10个节点的时间轴数据传递给该组件进行渲染。

示例2:与后端交互

该示例演示了如何从后端获取时间轴数据并显示在页面中。

<template>
  <div>
    <h1>Vue实现可移动水平时间轴</h1>
    <timeline :timelineItems="timelineItems"></timeline>
  </div>
</template>

<script>
import timeline from "./timeline.vue";
import axios from "axios";

export default {
  components: {
    timeline,
  },
  data() {
    return {
      timelineItems: null, // 时间轴节点数据
    };
  },
  mounted() {
    // 在组件挂载后从后端获取时间轴数据
    axios
      .get("/api/timeline")
      .then((res) => {
        this.timelineItems = res.data;
      })
      .catch((err) => {
        console.error(err);
      });
  },
};
</script>

在上述代码中,我们使用axios库从后端获取时间轴数据。在组件挂载后,发送GET请求到/api/timeline路由,获取返回的数据并将其保存到timelineItems属性中,该属性将传递给timeline组件用于渲染。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue实现可移动水平时间轴 - Python技术站

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

相关文章

  • vue.js实现插入数值与表达式的方法分析

    下面是“vue.js实现插入数值与表达式的方法分析”的完整攻略。 1. 插入数值 在 Vue.js 中,我们通常用双花括号 {{}} 来插入一个数据的值。例如: <p>{{ message }}</p> 这里的 message 可以是 Vue 实例中的一个属性,例如: var app = new Vue({ el: ‘#app’, d…

    Vue 2023年5月27日
    00
  • Vue3父子组件传参有关sync修饰符的用法详解

    下面是详细讲解“Vue3父子组件传参有关sync修饰符的用法详解”的完整攻略。 什么是sync修饰符? 在Vue3中,我们可以使用.sync修饰符将父组件的数据属性与子组件的属性进行双向绑定。例如,我们有一个父组件和一个子组件: <!– 父组件 –> <template> <div> <h2>{{ mess…

    Vue 2023年5月28日
    00
  • Vuex给state中的对象新添加属性遇到的问题及解决

    当我们给Vuex中的state中的对象添加新属性时,可能会遇到以下问题: 添加新属性后,该属性的初始值可能不会被监听到 在异步操作中添加属性会影响组件的响应性 解决这些问题的方案是使用Vue.set()或this.$set()方法。 Vue.set()和this.$set()都是Vue框架提供的全局方法,用来在响应式对象中设置值。下面,我们分别对Vue.se…

    Vue 2023年5月28日
    00
  • 使用Vue.js实现数据的双向绑定

    使用Vue.js实现数据的双向绑定是Vue.js中非常核心的概念之一。下面是实现数据的双向绑定的完整攻略。 为什么需要双向绑定 在传统的Web开发中,当用户进行操作时,一般需要通过JavaScript手动修改DOM元素并更新数据。在实现复杂交互时,这种方式显得非常笨拙而且容易出错,因为它没有提供一种有效的方法来管理数据的变化。 因此,双向绑定是在改变数据时自…

    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
  • vue3如何实现PDF文件在线预览功能

    Vue 3是基于前端开发框架Vue.js的最新版本,其具有更强大的响应式系统和优化后的编译器,使得开发体验更加简单、高效。本文将详细讲解如何使用Vue 3实现PDF文件在线预览功能的完整攻略。 步骤1 安装pdf.js PDF.js是一个用于在Web平台上显示PDF文档的开源项目,它基于HTML5 Canvas技术,可以解析PDF文档并将其转换为可供浏览器渲…

    Vue 2023年5月28日
    00
  • 浅谈 vue 中的 watcher

    关于“浅谈 Vue 中的 Watcher”,我将分以下几个部分来详细阐述。 Watcher 概述 在 Vue 中,Watcher 是一个可以观察并响应数据变化的对象。当数据变化时,Watcher 会自动重新渲染视图。 在 Vue 中有三种 Watcher:Computed Watcher、User Watcher 和渲染 Watcher。其中,Compute…

    Vue 2023年5月28日
    00
  • Vue高版本中一些新特性的使用详解

    Vue高版本中一些新特性的使用详解 1. 静态属性 $attrs 和 $listeners 在 Vue 2.x 版本中,父组件给子组件传递 props 属性的时候,必须要在子组件中声明该属性才能够正常接收。而在 Vue 3.x 版本中,为了方便,可以使用 v-bind=”$attrs” 将所有非 prop 的属性传递给子组件,子组件可以在 $attrs 中获…

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