手把手教你实现一个JavaScript时间轴组件

下面是“手把手教你实现一个JavaScript时间轴组件”的完整攻略:

1. 确定时间轴的基本结构

首先,我们需要确定时间轴的基本结构。时间轴通常由以下部分组成:

  1. 时间轴的标题,用于简要介绍时间轴的内容;
  2. 时间轴的标记,用于标注每个时间点的名称、时间、描述等信息;
  3. 时间轴的箭头,表示时间轴的方向。

时间轴的基本HTML结构如下所示:

<div class="timeline">
  <h1 class="timeline-title">时间轴标题</h1>
  <ul class="timeline-markers">
    <li class="timeline-marker">
      <div class="timeline-marker-content">
        <h2>标记标题</h2>
        <p>标记描述</p>
        <span class="timeline-marker-time">时间戳</span>
      </div>
    </li>
  </ul>
  <div class="timeline-arrow"></div>
</div>

2. 定义样式

接下来,我们需要定义时间轴的样式。这里只提供基本样式,可以根据需要自行调整。主要包括以下几个部分:

  1. 时间轴的颜色和宽度;
  2. 时间轴的标题和标记的样式;
  3. 时间轴的箭头的样式。
.timeline {
  position: relative;
  margin-bottom: 50px;
  padding: 50px 20px 0;
  border-top: 2px solid #ccc;
  border-bottom: 2px solid #ccc;
}

.timeline-title {
  font-size: 28px;
  font-weight: bold;
  margin-bottom: 30px;
  text-align: center;
}

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

.timeline-marker {
  position: relative;
}

.timeline-marker:before {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  width: 15px;
  height: 15px;
  background-color: #ccc;
  border: 2px solid #fff;
  border-radius: 50%;
  transition: all 0.3s ease-in-out;
  z-index: 1;
}

.timeline-marker:hover:before,
.timeline-marker.active:before {
  background-color: #007bff;
  border-color: #007bff;
}

.timeline-marker:after {
  content: "";
  position: absolute;
  left: 7.5px;
  top: 15px;
  width: 0;
  height: 100%;
  border-left: 2px solid #ccc;
}

.timeline-marker-content {
  position: relative;
  margin-bottom: 30px;
}

.timeline-marker-content h2 {
  font-size: 18px;
  font-weight: bold;
  margin-bottom: 20px;
}

.timeline-marker-content p {
  font-size: 14px;
  line-height: 1.5;
}

.timeline-marker-time {
  display: block;
  font-size: 14px;
  color: #ccc;
  margin-top: 10px;
}

.timeline-arrow {
  position: absolute;
  left: 50%;
  bottom: 0;
  transform: translateX(-50%);
  border: 20px solid transparent;
  border-top-color: #ccc;
  z-index: 2;
}

3. 定义JavaScript组件

最后,我们需要定义JavaScript组件,用于动态生成时间轴中的标记。主要包括以下几个功能:

  1. 初始化时间轴,设置标题和箭头;
  2. 添加标记,包括标记的标题、描述、时间等信息;
  3. 切换标记,根据用户点击的标记切换状态;
  4. 点击标记,滚动到对应标记的位置。
class Timeline {
  constructor(selector) {
    this.timeline = document.querySelector(selector);
    this.title = this.timeline.querySelector(".timeline-title");
    this.markers = this.timeline.querySelector(".timeline-markers");
    this.arrow = this.timeline.querySelector(".timeline-arrow");
    this.activeMarker = null;

    this.init();
  }

  init() {
    this.titleText = this.title.textContent;
    this.title.innerHTML = "";
    this.arrow.style.borderTopColor = getComputedStyle(this.arrow)["color"];

    window.addEventListener("resize", this.update.bind(this));
  }

  createMarker(options) {
    const marker = document.createElement("li");
    marker.classList.add("timeline-marker");

    const markerContent = document.createElement("div");
    markerContent.classList.add("timeline-marker-content");
    marker.appendChild(markerContent);

    const markerTitle = document.createElement("h2");
    markerTitle.textContent = options.title;
    markerContent.appendChild(markerTitle);

    const markerDescription = document.createElement("p");
    markerDescription.textContent = options.description;
    markerContent.appendChild(markerDescription);

    const markerTime = document.createElement("span");
    markerTime.classList.add("timeline-marker-time");
    markerTime.textContent = options.time;
    markerContent.appendChild(markerTime);

    marker.addEventListener("click", () => this.switchMarker(marker));
    this.markers.appendChild(marker);

    if (!this.activeMarker) {
      this.switchMarker(marker);
    }
  }

  update() {
    this.arrow.style.borderTopColor = getComputedStyle(this.arrow)["color"];

    if (this.activeMarker) {
      const offset =
        this.activeMarker.offsetTop - this.timeline.offsetTop - 30;
      this.timeline.scrollTop = offset;
    }
  }

  switchMarker(marker) {
    if (this.activeMarker) {
      this.activeMarker.classList.remove("active");
    }

    marker.classList.add("active");
    this.activeMarker = marker;
    this.update();
  }
}

const myTimeline = new Timeline(".timeline");

myTimeline.createMarker({
  title: "标记1",
  description: "这是标记1的描述",
  time: "2021-07-01",
});

myTimeline.createMarker({
  title: "标记2",
  description: "这是标记2的描述",
  time: "2021-07-03",
});

以上就是实现JavaScript时间轴组件的完整攻略。下面是两个示例:

示例一

const myTimeline = new Timeline(".timeline");

myTimeline.createMarker({
  title: "标记1",
  description: "这是标记1的描述",
  time: "2021-07-01",
});

myTimeline.createMarker({
  title: "标记2",
  description: "这是标记2的描述",
  time: "2021-07-03",
});

该示例创建一个时间轴,包含两个标记。第一个标记的标题为“标记1”,描述为“这是标记1的描述”,时间为“2021-07-01”;第二个标记的标题为“标记2”,描述为“这是标记2的描述”,时间为“2021-07-03”。

示例二

const myTimeline = new Timeline(".timeline");

myTimeline.createMarker({
  title: "标记1",
  description: "这是标记1的描述",
  time: "2021-07-01",
});

myTimeline.createMarker({
  title: "标记2",
  description: "这是标记2的描述",
  time: "2021-07-03",
});

myTimeline.createMarker({
  title: "标记3",
  description: "这是标记3的描述",
  time: "2021-07-05",
});

该示例创建一个时间轴,包含三个标记。第一个标记的标题为“标记1”,描述为“这是标记1的描述”,时间为“2021-07-01”;第二个标记的标题为“标记2”,描述为“这是标记2的描述”,时间为“2021-07-03”;第三个标记的标题为“标记3”,描述为“这是标记3的描述”,时间为“2021-07-05”。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:手把手教你实现一个JavaScript时间轴组件 - Python技术站

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

相关文章

  • php过滤HTML标签、属性等正则表达式汇总

    PHP过滤HTML标签、属性等正则表达式汇总 在开发网页或者Web应用的过程中,往往需要对用户提交的数据进行过滤和清理,以防止恶意脚本或病毒的注入,从而保证网站的安全性和稳定性。其中最常见的情况就是过滤HTML标签和属性。本文将介绍PHP中常用的过滤HTML标签、属性等的正则表达式汇总。 过滤HTML标签 PHP中可以使用正则表达式函数preg_replac…

    JavaScript 2023年6月11日
    00
  • JavaScript格式化日期时间的方法和自定义格式化函数示例

    JavaScript格式化日期时间的方法和自定义格式化函数示例 在JavaScript中,格式化日期时间是一个常见的需求。本文将介绍在JavaScript中格式化日期时间的方法和自定义格式化函数示例。 提供内置的日期时间格式化方法 在JavaScript中,可以使用Date对象提供的内置方法来格式化日期时间。以下是一些常见的方法及其描述: getFullYe…

    JavaScript 2023年5月27日
    00
  • javascript 出生日期和身份证判断大全

    Javascript 出生日期和身份证判断大全 简介 本文主要讲解了如何使用Javascript判断身份证号和出生日期是否符合标准。 身份证号判断 校验规则 中国大陆的身份证号码是由18位数字组成的。最后一位为校验位,前17位为身份证号码的主体部分。其中,第1-2位为行政区划代码,第3-6位为出生年份(用4位数字表示),第7-10位为出生月份和日期(用2位数…

    JavaScript 2023年5月27日
    00
  • javascript常用方法总结

    作为网站作者,我可以为您提供“Javascript常用方法总结”的完整攻略。 1. 简介 Javascript是一种广泛应用于web开发的编程语言,它具有很多强大的方法,可以对页面上的元素进行操作、获取信息、修改样式等等。在本篇攻略中,我将为大家梳理一些常用的javascript方法及其使用方法,希望能对前端开发的同学有所帮助。 2. 常用方法 2.1. g…

    JavaScript 2023年5月17日
    00
  • Jquery 快速构建可拖曳的购物车DragDrop

    下面我将介绍如何使用JQuery 快速构建可拖曳的购物车DragDrop,包括下面的内容: 安装和导入JQuery脚本文件 构建基础的HTML结构 实现拖拽操作以及购物车的添加和删除 步骤一:安装和导入JQuery脚本文件 首先,你需要下载JQuery脚本文件。你可以在官方网站下载JQuery的最新版本,也可以使用CDN服务,比如: <script s…

    JavaScript 2023年6月10日
    00
  • Vue中使用iframe踩坑问题记录 iframe+postMessage

    下面详细讲解Vue中如何使用iframe踩坑问题记录。 一、问题描述 在Vue项目中,使用iframe嵌入外部网页存在诸多问题。其中,最常见的问题就是iframe中的页面无法获取父级页面的DOM元素和数据。这是由于Vue会对DOM做出一些特殊处理,导致iframe无法获取到相应的元素。针对这种情况,我们需要使用postMessage来进行消息传递,从而让if…

    JavaScript 2023年6月11日
    00
  • js中判断Object、Array、Function等引用类型对象是否相等

    JavaScript 中判断对象是否相等比较复杂,因为对象具有引用类型的特性,即两个变量即使引用同一个对象,它们也不一定相等。 以下是一些常见的判断方法和示例: 1. 使用 Object.is() 方法 Object.is() 方法可以判断两个对象是否相等,与 === 操作符相似。它的返回值为一个布尔值。 以下是示例代码: const obj1 = { a:…

    JavaScript 2023年6月11日
    00
  • JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析

    JS常见疑难点分析之match方法 match方法是JS字符串对象中的一个常见方法,用于对字符串进行正则表达式匹配。其基本语法为: string.match(regexp) string:必选项,表示需要匹配的字符串。 regexp:必选项,表示正则表达式。 如果成功匹配,则返回一个匹配数组,否则返回null。 match方法常用示例 示例一 const s…

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