使用CSS Flexbox创建简洁时间轴

使用CSS Flexbox创建简洁时间轴

在网页设计中,时间轴是一种常见且有效的方式来展示事件的顺序和进程。本文将介绍如何使用CSS Flexbox创建一个简洁优雅的时间轴,无需复杂的JavaScript代码。
在这里插入图片描述

基本HTML结构

首先,我们需要创建基本的HTML结构:

html复制<div class="timeline"><div class="events"><div class="event life"><svg class="marker" xmlns="http://www.w3.org/200![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d6842b409144c9f99fd8aa5bdc24d89.png#pic_center)
0/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>1989</time><div class="text"><p>I was born in the north of Sweden</p></div></div></div><!-- 更多事件... --></div>
</div>

CSS样式

1. 创建时间线

使用::before伪元素创建时间线:

css复制.events {position: relative;
}.events::before {content: "";position: absolute;top: 0;height: 100%;width: 1px;background: white;
}

2. 事件对齐

使用Flexbox对齐事件:

css复制.event {display: flex;align-items: baseline;
}.event .marker {position: relative;left: -6px;
}

3. 垂直间距

使用Flexbox控制事件间的垂直间距:

css复制.events {display: flex;flex-direction: column;row-gap: 1em;
}

4. 响应式设计

使用媒体查询实现响应式设计:

css复制@media (min-width: 700px) {.events::before {left: 50%;}.event .marker {order: 1;}.event .content {width: 50%;text-align: right;padding-inline: 1em;}.event:nth-child(even) {flex-direction: row-reverse;}.event:nth-child(even) .content {text-align: left;}.event:nth-child(even) .marker {left: 6px;}
}

完整CSS代码

以下是完整的CSS代码:

css复制.events::before {content: "";position: absolute;top: 0;height: 100%;width: 1px;background: var(--color-hr);
}.events {position: relative;display: flex;margin-block: 0.5em;flex-direction: column;row-gap: 1em;
}.event {display: flex;align-items: baseline;
}.event .marker {position: relative;left: -6px;
}.event.life .marker {fill: var(--melange_b_yellow);
}.event.programming .marker {fill: var(--melange_b_magenta);
}.event.family .marker {fill: var(--melange_b_red);
}.content time {font-family: concourse_4, Helvetica, sans-serif;font-weight: bold;
}@media (min-width: 700px) {.events::before {left: 50%;}.event .marker {order: 1;}.event .content {width: 50%;text-align: right;padding-inline: 1em;}.event:is(.programming, .work, .projects) {flex-direction: row-reverse;}.event:is(.programming, .work, .projects) .content {text-align: left;}.event:is(.programming, .work, .projects) .marker {left: 6px;}
}

通过这些CSS样式,我们创建了一个简洁、响应式的时间轴。在小屏幕上,事件垂直排列;在大屏幕上,事件分布在时间线的两侧。这种设计既美观又实用,能够有效地展示事件的顺序和重要性。

使用Flexbox使得创建这样的时间轴变得相对简单,它简化了许多曾经复杂的布局任务。通过调整颜色、字体和间距,你可以进一步自定义时间轴以适应你的网站设计。

demos实现

HTML实现

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>交互式时间轴演示</title><style>/* CSS 样式将在这里 */</style>
</head>
<body><h1>交互式时间轴演示</h1><div class="controls"><label>时间轴颜色:<input type="color" id="lineColor" value="#ffffff"></label><label>事件间距:<input type="range" id="eventSpacing" min="0.5" max="3" step="0.1" value="1"></label><label>响应式布局宽度:<input type="number" id="responsiveWidth" min="300" max="1200" step="50" value="700">px</label></div><div class="timeline"><div class="events"><div class="event life"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>1989</time><div class="text"><p>我出生在瑞典北部</p></div></div></div><div class="event programming"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2005</time><div class="text"><p>开始学习编程</p></div></div></div><div class="event life"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2010</time><div class="text"><p>搬到瑞典南部</p></div></div></div><div class="event programming"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2015</time><div class="text"><p>开始职业编程生涯</p></div></div></div><div class="event family"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2020</time><div class="text"><p>组建家庭</p></div></div></div></div></div><script>// JavaScript 代码将在这里</script>
</body>
</html>

CSS实现

body {font-family: Arial, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f0f0f0;color: #333;
}h1 {text-align: center;
}.controls {background-color: #e0e0e0;padding: 10px;margin-bottom: 20px;border-radius: 5px;
}.controls label {display: block;margin-bottom: 10px;
}.timeline {background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}.events::before {content: "";position: absolute;top: 0;height: 100%;width: 2px;background: var(--line-color, #fff);
}.events {position: relative;display: flex;margin-block: 0.5em;flex-direction: column;row-gap: var(--event-spacing, 1em);
}.event {display: flex;align-items: baseline;
}.event .marker {position: relative;left: -6px;
}.event.life .marker { fill: #ffd700; }
.event.programming .marker { fill: #ff00ff; }
.event.family .marker { fill: #ff0000; }.content time {font-weight: bold;
}@media (min-width: 700px) {.events::before {left: 50%;}.event .marker {order: 1;}.event .content {width: 50%;text-align: right;padding-inline: 1em;}.event:nth-child(even) {flex-direction: row-reverse;}.event:nth-child(even) .content {text-align: left;}.event:nth-child(even) .marker {left: 6px;}
}

js实现

document.addEventListener('DOMContentLoaded', function() {const lineColor = document.getElementById('lineColor');const eventSpacing = document.getElementById('eventSpacing');const responsiveWidth = document.getElementById('responsiveWidth');const timeline = document.querySelector('.timeline');const events = document.querySelector('.events');function updateTimeline() {timeline.style.setProperty('--line-color', lineColor.value);events.style.setProperty('--event-spacing', `${eventSpacing.value}em`);document.body.style.setProperty('--responsive-width', `${responsiveWidth.value}px`);}lineColor.addEventListener('input', updateTimeline);eventSpacing.addEventListener('input', updateTimeline);responsiveWidth.addEventListener('input', updateTimeline);updateTimeline();
});

完整demo

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>交互式时间轴演示</title><style>body {font-family: Arial, sans-serif;max-width: 800px;margin: 0 auto;padding: 20px;background-color: #f0f0f0;color: #333;}h1 {text-align: center;}.controls {background-color: #e0e0e0;padding: 10px;margin-bottom: 20px;border-radius: 5px;}.controls label {display: block;margin-bottom: 10px;}.timeline {background-color: #fff;padding: 20px;border-radius: 5px;box-shadow: 0 2px 5px rgba(0,0,0,0.1);}.events::before {content: "";position: absolute;top: 0;height: 100%;width: 2px;background: var(--line-color, #fff);}.events {position: relative;display: flex;margin-block: 0.5em;flex-direction: column;row-gap: var(--event-spacing, 1em);}.event {display: flex;align-items: baseline;}.event .marker {position: relative;left: -6px;}.event.life .marker { fill: #ffd700; }.event.programming .marker { fill: #ff00ff; }.event.family .marker { fill: #ff0000; }.content time {font-weight: bold;}@media (min-width: var(--responsive-width, 700px)) {.events::before {left: 50%;}.event .marker {order: 1;}.event .content {width: 50%;text-align: right;padding-inline: 1em;}.event:nth-child(even) {flex-direction: row-reverse;}.event:nth-child(even) .content {text-align: left;}.event:nth-child(even) .marker {left: 6px;}}</style>
</head>
<body><h1>交互式时间轴演示</h1><div class="controls"><label>时间轴颜色:<input type="color" id="lineColor" value="#ffffff"></label><label>事件间距:<input type="range" id="eventSpacing" min="0.5" max="3" step="0.1" value="1"></label><label>响应式布局宽度:<input type="number" id="responsiveWidth" min="300" max="1200" step="50" value="700">px</label></div><div class="timeline"><div class="events"><div class="event life"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>1989</time><div class="text"><p>我出生在瑞典北部</p></div></div></div><div class="event programming"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2005</time><div class="text"><p>开始学习编程</p></div></div></div><div class="event life"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2010</time><div class="text"><p>搬到瑞典南部</p></div></div></div><div class="event programming"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2015</time><div class="text"><p>开始职业编程生涯</p></div></div></div><div class="event family"><svg class="marker" xmlns="http://www.w3.org/2000/svg" width="12" height="12"><circle cx="6" cy="6" r="6"></circle></svg><div class="content"><time>2020</time><div class="text"><p>组建家庭</p></div></div></div></div></div><script>document.addEventListener('DOMContentLoaded', function() {const lineColor = document.getElementById('lineColor');const eventSpacing = document.getElementById('eventSpacing');const responsiveWidth = document.getElementById('responsiveWidth');const timeline = document.querySelector('.timeline');const events = document.querySelector('.events');function updateTimeline() {timeline.style.setProperty('--line-color', lineColor.value);events.style.setProperty('--event-spacing', `${eventSpacing.value}em`);document.body.style.setProperty('--responsive-width', `${responsiveWidth.value}px`);}lineColor.addEventListener('input', updateTimeline);eventSpacing.addEventListener('input', updateTimeline);responsiveWidth.addEventListener('input', updateTimeline);updateTimeline();});</script>
</body>
</html>

参考文章: Jonas Hietala: A simple timeline using CSS flexbox

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

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

相关文章

Ansible自动化工具

一、Ansible概述 1.1 什么是Ansible Ansible 是一个开源的自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件&#xff08;剧本&#xff0c;Playbooks&#xff09;&#xff0c;轻松管理和配置多个服务器。Ansible 的特点是无…

第十七周:机器学习笔记

第十七周周报 摘要Abstratc一、机器学习——生成式对抗网络&#xff08;Generative Adversarial Networks | GAN&#xff09;——&#xff08;中&#xff09;1. GAN 的理论介绍2. 用JS散度训练存在的问题3. WGAN 算法4. 拓展——流体 总结 摘要 本周周报主要对GAN进行了详细的…

学习笔记——交换——STP(生成树)工作原理

三、工作原理 STP的基本原理是在一个有二层环路的网络中&#xff0c;交换机通过运行STP&#xff0c;自动生成一个没有环路的网络拓扑。这个无环网络拓扑也叫做STP树(STP Tree)&#xff0c;树节点为某些交换机&#xff0c;树枝为某些链路。当网络拓扑发生变化时&#xff0c;STP…

js简单基础笔记

一 . js特点 1. Js是一门解释型语言&#xff0c;不用编译&#xff0c;而是直接执行 2. js是一门动态语言&#xff0c;其中的任何内容都是不确定的 3. 语法结构和Java&#xff0c;c都很像 4. ​ js是一门面向对象的语言 5.js严格区分大小写 二 . js使用 1…

TiDB 新版本:更稳、更快、更好的数据库体验

作者&#xff1a; TiDB社区小助手 原文来源&#xff1a; https://tidb.net/blog/2d33d7db 本文内容出自&#xff1a;PingCAP 高级顾问 蓝功儒老师 在 9 月 21 日 TiDB 新版本 Meetup 中&#xff0c;PingCAP 高级顾问蓝功儒老师为我们带来了关于 TiDB 新版本的深入分享。TiD…

基于LORA的一主多从监测系统_数据发送

数据上传我这里使用了问询的方式&#xff0c;这样的好处一是可以用来统计节点的存活状态&#xff0c;二是可以避免冲突&#xff0c;主节点通过向从节点发送问询帧&#xff0c;从节点收到问询帧后开始向主节点发送数据&#xff0c;同时我们也可以加入不同的帧类型&#xff0c;比…

4.three.js网格模型介绍和绘制基础点、线、面

4.three.js网格模型介绍和绘制基础点、线、面 1、计算机中3D世界的组成 在计算机世界里&#xff0c;3D世界是由点组成&#xff0c;两个点能够组成一条直线&#xff0c;三个不在一条直线上的点就能够组成一个三角形面&#xff0c;无数三角形面就能够组成各种形状的物体&#x…

Linux基础项目开发day05:量产工具——页面系统

文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统&#xff0c;现在我们就来实现页面的…

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…

Python学习的自我理解和想法(15)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第15天&#xff0c;从今天开始&#xff0c;每天一到两个常用模块&#xff0c;更完恢复到原来的&#xff0c;开学了&#xff0c;时间不多&am…

Java 直接获取 pom.xml 配置的属性值

Java 直接获取 pom.xml 配置的属性值 1.需求描述2.代码示例3.结果演示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在开发一个 SpringBoot 项目的时候&#xff0c;需要从 pom.xml 中获取配置的 artifactId&#xff0c;name&#xf…

vscode配置ssh远程连接服务器

注意&#xff1a;重启软件或重启电脑&#xff0c;解决很多问题 一. vscode配置ssh vscode通过ssh连接服务器&#xff08;吐血总结&#xff09;_vscode ssh-CSDN博客 二. VScode无法远程连接主机问题 VSCode远程连接服务器报错&#xff1a;Could not establish connection to…

HCIP-HarmonyOS Application Developer 习题(十六)

&#xff08;判断&#xff09;1、HiLink通过分布式软总线的方式连接所有设备&#xff0c;强能力设备可对弱能力设备进行设备虚拟化&#xff0c;将弱设备当做本机设备直接调用。 答案&#xff1a;错误 分析&#xff1a;HiLink 主要针对的是应用开发者与第三方设备开发者&#xf…

力扣 中等 143.重排链表

文章目录 题目介绍题解 题目介绍 题解 class Solution {public void reorderList(ListNode head) {ListNode mid middleNode(head);ListNode head2 reverseList(mid);while (head2.next ! null) {ListNode nxt head.next;ListNode nxt2 head2.next;head.next head2;head2.…

Linux-正则表达式

正则表达式 定义DRE模式-纯文本/特殊字符 定义DRE模式-锚字符/点号字符 定义DRE模式-字符组/排除型字符组 定义DRE模式-区间 定义DRE模式-特殊字符组 定义DRE模式-星号 扩展正则表达式-问号 扩展正则表达式-加号 扩展正则表达式-使用花括号 扩展正则表达式-管道符号/表达式分组…

如何通过CDN优化网站服务器访问速度?

CDN&#xff0c;即内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;在现代互联网中起着重要作用。它可以显著提升网站服务器的访问速度。以下是CDN在加速网站访问方面的主要优势及其工作原理。 1. 全球分布的服务器节点 CDN通过在全球范围内布设多个…

【Router】路由器中NAT、NAPT、NPT是什么?

参考链接 NAT vs. NAPT: What’s the Difference? IPv6 Network Prefix Translation (NPt) | pfSense Documentation (netgate.com) 趣谈NAT/NAPT的原理&#xff0c;这篇不可不读&#xff01; - 知乎 (zhihu.com) NAT (Network Address Translation) NAT说明 NAT&#x…

成都睿明智科技有限公司电商服务可靠不?

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们娱乐消遣的首选平台&#xff0c;更是众多商家竞相追逐的电商新蓝海。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以其独到的洞察力和专业的服务&#xff0c;助力无数品牌在这片沃…

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具

微信小程序&#xff1a;miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具 背景介绍 一直都是本地电脑运行微信开发者工具打包上传。多项目中新老版本对node版本要求不一致&#xff0c;老是切来切去。而且同一个人开发上传需要打包…

pandas-使用技巧

pandas-使用技巧 简单技巧 仅个人笔记使用&#xff0c;感谢点赞关注 简单技巧 pd.to_dict()&#xff1a;Dataframe格式数据转字典数据pd.dropna()&#xff1a;去nan值& | ~&#xff1a;pd逻辑运算符pd.isnan()&#xff1a;判断是否为nan值pd.concat&#xff1a;多个pd拼接…