使用CSS Flexbox创建简洁时间轴

news2024/10/21 11:28:49

使用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.coloradmin.cn/o/2213916.html

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

相关文章

《CUDA编程》8.共享内存的合理使用

共享内存是 一种可被程序员直接操控的缓存&#xff0c;主要作用有两个&#xff1a; ①减少核函数中对全局内存的访 问次数&#xff0c;实现高效的线程块内部的通信 ②提高全局内存访问的合并度 将通过两个具体的例子阐明共享内存的合理使用&#xff0c;一个数组归约的例子和讨矩…

深入解析“低代码平台”与“零代码平台”:区别与应用场景

随着企业数字化转型的加速&#xff0c;低代码平台与零代码平台作为提升开发效率、降低IT成本的有效工具&#xff0c;正逐渐成为企业软件开发的新趋势。这两种平台虽然都旨在简化应用开发过程&#xff0c;但在功能、适用场景及用户群体上存在着显著差异。 低代码平台&#xff1a…

如何通过Chrome设置保护你的在线隐私

在当今数字时代&#xff0c;保护个人隐私和在线安全变得尤为重要。谷歌浏览器作为全球最受欢迎的网络浏览器之一&#xff0c;提供了多种功能来帮助用户保护自己的在线隐私。本教程将指导你如何通过谷歌浏览器设置来提高你的在线隐私保护水平。&#xff08;本文由https://www.li…

highcharts样式记录

图表设置 const rendChart (min, max) > {Highcharts.setOptions({global: { useUTC: false },});Highcharts.chart(hourly-chart, {chart: {spacingBottom: 0,marginLeft: 53,marginTop: 10,marginBottom: 0,marginRight: 13,style: {fontSize: 0.2rem,color: #363a44,li…

论文笔记 ICLR 2024 MogaNet: Multi-Order Gated Aggregation Network

配图中有2个分支&#xff0c;一个是subtract的输出和缩放因子&#xff08;γs&#xff09;相乘之后的结果&#xff0c;另一个是11卷积输出的结果&#xff0c;这两个分支的输出进行element-wise addition&#xff0c;这两个分支的输出分别代表什么&#xff1f; 为什么”增强局部…

1486. 数组异或操作

1486. 数组异或操作 题目含义&#xff1a;根据整数 n n n 和 s t a r t start start 构造一个数组&#xff0c;数组元素为 n u m s [ i ] 2 i s t a r t , i ∈ [ 0 , n − 1 ] nums[i] 2i start, i \in [0,n-1] nums[i]2istart,i∈[0,n−1]&#xff1b;最后返回这个数组…

电脑 WiFi 上网,开发板和电脑直连,如何才能让开发板也有网络

目录 问题 解决方法 1.设置电脑为WLAN共享模式 2、设置以太网IP 3、设置开发板IP及网关 4、测试 5、开发板重启之后会自动清空 /etc/resolv.conf文件中的内容问题解决 问题 电脑 WiFi 上网&#xff0c;开发板和电脑直连,如何才能让开发板也有网络 解决方法 1.设置电脑…

父子情深!汤姆克鲁斯已经结束英国的奢华生活搬回美国跟儿子团聚

汤姆克鲁斯似乎一直专注于在英国的奢华生活方式。过去五年里&#xff0c;他拍摄了许多电影&#xff0c;还被看到与皇室成员和一线明星一起参加派对。但消息人士称&#xff0c;他可能正在准备搬回美国&#xff0c;以便更接近他的儿子康纳。 在跨过大西洋的五年后&#xff0c;他…

使用electron+vue开发桌面应用

electron是什么 electron由Node.jsChromiumNative APIs构成。你可以理解成&#xff0c;它是一个得到了Node.js和基于不同平台的Native APIs加强的Chromium浏览器&#xff0c;可以用来开发跨平台的桌面级应用。 它的开发主要涉及到两个进程的协作——Main&#xff08;主&#x…

力扣题解(鸡蛋掉落)

887. 鸡蛋掉落 已解答 困难 相关标签 相关企业 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它…

JVM可视化监控

1 JConsole 一、介绍 JConsole 是一种 Java 监控和管理控制台工具&#xff0c;可以用于监视 Java 虚拟机&#xff08;JVM&#xff09;的性能和资源利用情况。它提供了一种图形化界面&#xff0c;可以实时查看 JVM 的运行状态、内存使用情况、线程活动、垃圾回收等信息&#xf…

Spring 实现 3 种异步流式接口,干掉接口超时烦恼

大家好&#xff0c;我是小富&#xff5e; 如何处理比较耗时的接口&#xff1f; 这题我熟&#xff0c;直接上异步接口&#xff0c;使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性&#xff0c;处理结果仅返回单个值。在某…

每日OJ题_牛客_小乐乐改数字_模拟_C++_Java

目录 牛客_小乐乐改数字_模拟 题目解析 C代码 Java代码 牛客_小乐乐改数字_模拟 小乐乐改数字_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 小乐乐喜欢数字&#xff0c;尤其喜欢0和1。他现在得到了一个数&#xff0c;想把每位的数变成0或1。如果某一位是奇数&#…

Python 工具库每日推荐【PyAutoGUI】

文章目录 引言Python桌面自动化库的重要性今日推荐:PyAutoGUI工具库主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:自动化图像识别和点击案例分析高级特性失败安全机制相对坐标操作扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 Python工…

如何远程查看孩子的电脑使用?

越来越多的家庭拥有了多台电脑和智能设备。家长们往往没有办法时刻陪伴在孩子身边&#xff0c;监督他们的上网行为。而远程控制电脑可以帮助家长在任何时间、任何地点对孩子的电脑进行监控和管理&#xff0c;确保他们能够安全、健康地使用互联网。 通过远程控制软件&#xff0c…

锦锐科技CA51F7系列笔记

1、PWM &#xff08;1&#xff09;芯片一共有6个PWM通道&#xff08;PWM0~PWM5&#xff09; &#xff08;2&#xff09;IRCH时钟&#xff08;IRCH 频率为 16MHz&#xff09; &#xff08;3&#xff09;IRCL时钟&#xff08;IRCL频率为100KHz&#xff09; &#xff08;4&…

JavaScript 命令模式实战:打造可撤销的操作命令

一. 前言 在前端开发中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;作为一种行为型设计模式&#xff0c;可以帮助我们将请求封装成一个对象&#xff0c;从而实现调用对象和执行对象之间的解耦&#xff0c;方便扩展和修改。 本文将和大家分享 JavaScript 中的…

实战子网掩码划分问题

拓扑要求总部有2个业务段&#xff0c;分部也有3个业务 还有互联地址段&#xff0c;还有管理地址段&#xff01;&#xff01;&#xff01;&#xff01; 23117 个段 192.168.1.0/24 怎么划分呢&#xff1f; 1 根据要求划分地址段 192.168.1.0/24 要划分7个网段那就…

linux------缓冲区与C库的原理

前言 一、缓冲区 缓冲区的作用是提高效率&#xff0c;因为将数据写入到设备&#xff0c;是需要调用系统接口的&#xff0c;如果每次写入缓冲区的数据就调用一次系统调用&#xff0c;涉及到系统调用这时操作系统就会介入&#xff0c;用户态转为内核态&#xff0c;这个过程需要时…

自然语言到 SQL 的曙光:我们准备好了吗?

发布于&#xff1a;2024 年 10 月 08 日 各位读者&#xff0c;国庆假期已过&#xff0c;我们打工人要开启奋斗新征程了&#xff0c;今天小编也是刚上班假期综合征还没过去&#xff0c;就被抓过来读论文&#xff0c;还好我在假期没闲着&#xff0c;整理了几篇关于 NL2SQL 的最新…