首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CSS 实现时间轴、背景图 Loading 和渐变边框

CSS 实现时间轴、背景图 Loading 和渐变边框

作者头像
Cell
发布于 2024-11-21 10:29:26
发布于 2024-11-21 10:29:26
5210
举报
文章被收录于专栏:Cell的前端专栏Cell的前端专栏

注意

本文最后更新于 2024-07-28,文中内容可能已过时。

本文将通过一个实际应用场景,展示如何使用现代 CSS 实现时间轴、背景图 loading 效果、渐变边框等效果。

1 背景

最近在调整 FixIt 主题的官方文档,调整过程中总觉得首页空荡荡的少了些内容,然后就在脑海里构思了如本文封面图所示的效果,希望引导用户阅读文档。

需求分析:

  1. 整体布局:左右两栏,左侧为主题文档大纲,右侧为网站预览图
  2. 左侧需要显示时间轴,时间轴带有跑马灯动画效果(暗指文档阅读顺序)
  3. 右侧加载网站预览图时,需要有 loading 效果
  4. 整体边框需要渐变效果

第一点很简单,一个 flex 布局就能搞定了,这里不再展开。

接下来我们重点看看如何实现时间轴、背景图 loading 效果和渐变边框。

2 时间轴

先睹为快,效果如下:

时间轴动画
时间轴动画

时间轴动画

我不希望时间轴的实现和其他 UI 框架一样拥有复杂的 DOM 结构,所以使用最简单的 ulli 即可,关键代码如下:

1 2 3 4 5 6

<ul class="docs-outline"><br> <li><a href="{{ $page1.Permalink }}">{{ $page1.LinkTitle }}</a></li><br> <li><a href="{{ $page2.Permalink }}">{{ $page2.LinkTitle }}</a></li><br> <li><a href="{{ $page3.Permalink }}">{{ $page3.LinkTitle }}</a></li><br> <li><a href="{{ $page4.Permalink }}">{{ $page4.LinkTitle }}</a></li><br></ul>

DOM 结构就这么简单,重点在于 CSS 的实现,实现思路如下:

  • 先把 ul 设置 list-style: none,去掉默认的 li 样式
  • 利用 ::before::after 伪元素实现时间轴的小圆点和连接线
  • 动画效果:四个小圆点默认和连接线一样灰色,然后依次点亮,可以使用 animation-delay 属性实现

动画效果关键帧代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

li::before { border: var(--timeline-width) solid var(--timeline-color); animation-name: border-color-fade; animation-duration: 2s; animation-iteration-count: infinite; animation-delay: calc(var(--timeline-index) * 0.3s); @keyframes border-color-fade { 0% { border-color: var(--timeline-color); } 50% { border-color: var(--timeline-circle-color); } 100% { border-color: var(--timeline-color); } } }

通过 nth-child 选择器来设置 --timeline-index 来线性增加每个小圆点的动画延迟时间,从而在视觉上出现依次点亮的效果。

如果使用 SCSS 可以简化代码,如下:

1 2 3 4 5 6 7 8 9

@for $i from 1 through 4 { li:nth-child(#{$i}) { --timeline-index: #{$i}; &::before { content: '#{$i}'; } } }

如果需要在小圆点的内部显示序号,可以像设置 --timeline-index 一样依次设置 content

然后在小圆点点亮动画过程中同时转变 color: transparent 到具体的颜色即可。

3 背景图 loading 效果

背景图 loading 效果
背景图 loading 效果

背景图 loading 效果

如果只是想实现图片的 loading 效果其实很简单,之前在「浏览器 IMG 图片原生懒加载 Loading=“lazy”」中有介绍过,但是这次我是把图片当作背景图片使用的,那问题来了,不通过 JS 背景图片的 loading 效果怎么实现呢?

还是可以利用 ::before::after 伪元素,一个伪元素用来显示 loading 图,另一个伪元素用来显示背景图片。

原理:利用两张图片加载的时间差,由于 loading 图片很小,所以加载很快,而背景图片加载较慢,然后默认不设置 z-index 的情况下,后面的元素会在上层,所以在背景图片加载完成前,loading 图片会一直显示。

关键代码如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

.docs-preview { &::before, &::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-position: center; background-repeat: no-repeat; } &::before { background-color: rgba(204, 204, 204, 0.1); background-image: url(/images/loading.min.svg); background-size: 60px; data-theme='dark' & { background-color: rgba(0, 0, 0, 0.1); } } &::after { background-image: url(/images/apple-devices-preview.webp); background-size: 130%; } }

4 全尺寸带圆角渐变边框

最后实现一个全尺寸带圆角渐变边框效果,一句话概括为利用线性渐变 linear-gradient 分别设置 padding-boxborder-box 的背景,然后 border 颜色设置为透明即可实现。

1 2 3 4 5

.docs-navigation { border-radius: 2.5px; background: linear-gradient(#fff, #fff) padding-box, linear-gradient(45deg, #42d392, #FF7359) border-box; border: 0.25rem solid transparent; }

值得一提的是,这里面利用到的一个核心概念是 background-clip 属性,详见 background-clip - CSS: Cascading Style Sheets | MDN

  • padding-box 表示背景延伸到内边距边界
  • border-box 表示背景延伸到边框边界。

另外,如果想实现渐变边框的动画效果,用 SCSS 可以这样做(虽然我不认为这是一个好的做法):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

.docs-navigation { border-radius: 2.5px; background: linear-gradient(#fff, #fff) padding-box, linear-gradient(var(--gradient-angle), #42d392, #FF7359) border-box; border: 0.25rem solid transparent; transition: background-color 0.5s, border-color 0.5s; --gradient-angle: 45deg; animation: gradient-angle-change 10s infinite linear; // 分的越细,动画效果越平滑 @keyframes gradient-angle-change { @for $i from 0 through 100 { #{$i * 1%} { --gradient-angle: #{45 + $i * 4}deg; } } } }

5 最后的效果

为了方便使用 FixIt 主题的用户在自己的笔记内插入 FixIt 官方文档的书签,我把这个效果封装成了一个独立的组件,你可以在 hugo-fixit/shortcode-docs-bookmark 中找到完整代码及食用方法。

6 总结

很多时候都感觉写 CSS 就像在写诗,相同的效果 CSS 实现往往会比 JS 更加优雅。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-07-142,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CSS3背景与渐变
一、CSS3 背景图像区域 background-clip(指定背景绘制区域) ackground-clip: border-box / padding-box / content-box; /*没有padding的时候,content-box和padding-box效果一样*/ 兼容性:IE9+、FireFox、Chrome、Safari、Opera 二、CSS3 背景图像定位 background-position (背景定位) background-position: px / %
Leophen
2019/08/23
1.2K0
CSS实用技巧总结
全名Don't Repeat Yourself,该原则适用于所有编程语言而不限于css。
Nealyang
2020/04/22
1.7K0
CSS实用技巧总结
CSS背景属性知多少?
本文想通过简单的属性介绍和代码实践,给大家一个更加直观的CSS规则和表现的认识,同时领略CSS神奇的表现能力,以提升我们在UI开发过程中的效率。
小东同学
2022/07/29
1.2K0
CSS背景属性知多少?
02-移动端开发教程-CSS3新特性(中)
1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸、背景裁切区域、背景定位参照点、多重背景等。 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比例,保证图片始终填充满背景区域,如有溢出部分则会被隐藏。 contain会自动调整缩放比例,保证图片始终完整显示在背景区域。 也可以使用长度单位或百分比,可以是两个值第一个是水平方向第二个是垂直方向。 .box { width: 300px; height: 200px; border: 1px s
老马
2018/04/02
1.5K0
02-移动端开发教程-CSS3新特性(中)
CSS3与页面布局学习总结(六)——CSS3新特性(阴影、动画、渐变、变形、伪元素等)
CSS3在CSS2.1的基础上新增加了许多属性,这里选择了较常用的一些功能与大家分享,帮助文档中有很详细的描述,可以在本文的示例中获得帮助文档。 一、阴影 1.1、文字阴影 text-shadow <
张果
2018/01/04
3.4K0
CSS3与页面布局学习总结(六)——CSS3新特性(阴影、动画、渐变、变形、伪元素等)
《CSS揭秘》读书总结:背景与边框
假设我们想给一个容器设置一层白色背景和一道半透明白色边框,body 的背景会从它的半透明边框透上来。我们最开始的尝试可能是这样的:
逆葵
2019/04/25
1.9K0
《CSS揭秘》读书总结:背景与边框
02-移动端开发教程-CSS3新特性(中)
根据文章内容,撰写摘要总结。
老马
2017/12/20
2.4K0
CSS相关
1. rem 默认字号 rem是相对html根元素来说的;浏览器默认的font-size为16px,也就是说默认 1rem为16px。 鉴于此,一些网页定义 根元素 font-size为10/16 = 0.675em,那么这个时候1rem为10px。 16px为继承值 而使用rem前,一般都需要加入一些js代码,通过判断屏幕宽度去计算根[html]的font-size,代码为: (function() { function autoRootFontSize() { doc
六个周
2022/10/28
1.8K0
【前端】CSS背景属性详解
background-color 属性用于定义元素的背景颜色,可以是任何合法的 CSS 颜色值,包括十六进制颜色代码、RGB、RGBA、HSL 等。元素的默认背景颜色是 transparent(透明),这意味着没有显式的背景颜色。
CSDN-Z
2025/06/01
2580
【前端】CSS背景属性详解
纯CSS时间轴列表
需要实现时间轴列表,左边一串小圆点,右边是列表内容,需要小圆点位置与列表项对应,最终效果如下:
ayqy贾杰
2023/03/15
3.2K0
纯CSS时间轴列表
前端学习(8)~css学习(二):背景属性
光学显示器中,每个像素都是由三原色的发光原件组成的,靠明亮度不同调成不同的颜色的。r、g、b的值,每个值的取值范围0~255,一共256个值。
Vincent-yuan
2020/02/25
1.5K0
前端学习(8)~css学习(二):背景属性
【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )
地图 是 一张 png 格式的 半透明 背景图片 , 图片大小为 747 x 617 像素 ;
韩曙亮
2023/10/15
7350
【CSS3】CSS3 动画 ④ ( 使用动画制作地图热点图 )
HTML5简明教程(三)使用CSS3
HTML是骨架,CSS是装饰,CSS使得网页丰富多彩,它也是Web开发不可或缺的一部分。
娜姐
2021/01/14
1.8K0
HTML5简明教程(三)使用CSS3
css3线性、径向渐变
背景线性渐变 background: linear-gradient(); 第一个参数: (角度 或者是一个线性的方向)可选的 默认的是(to bottom) 旋转的方向是顺时针的 第二个参数: 开始颜色 color 或者是百分比 或者是长度 第三个参数: 结束颜色
河湾欢儿
2018/09/06
7020
重温CSS3
基础不牢,地动山摇!没办法,只能重温“经典”! 1.CSS3边框:border-radius;  box-shadow;  border-image border-radius:r1,r2,r3,r4;(边框圆角!) r1~r4:分别为左上角,右上角,右下角,左下角半径(顺时针!缺省时:左上角、右下角相同;右上角,左下角相同) border-radius: 30px; box-shadow: x-shadow y-shadow blur spread color insert;(盒阴影) x-shadow
用户1149564
2018/01/11
2K0
重温CSS3
html+css学习笔记017-H5新背景属性0颜色0倒影0遮罩
Author:Mr.柳上原 付出不亚于任何的努力 愿我们所有的努力,都不会被生活辜负 不忘初心,方得始终 深刻的感觉到一个强大的文案就是一家公司的营销精髓 比如: 《卫龙》 《阅后即瞎》 《网易论坛》 《vivo商城客服》 ...... <!DOCTYPE html> <!-- 文档类型:标准html文档 --> <html lang='en'> <!-- html根标签 翻译文字:英文 --> <head> <!-- 网页头部 --> <meat charset='UTF-8'/> <!-- 网页字
Mr. 柳上原
2018/09/05
7650
Web - CSS3浮动定位与背景样式
这篇文章主要介绍了 CSS3 中的浮动定位、背景样式、变形效果等内容。包括 BFC 规范与创建方法、浮动的功能与使用要点、定位的多种方式及特点、边框与圆角的设置、背景的颜色、图片等属性、多种变形效果及 3D 旋转等,还提到了浏览器私有前缀。
stark张宇
2025/02/04
2530
CSS3实现多种背景效果
重复平铺的几何图案很美观,但看起来可能有一些呆板。其实自然界中的事物都不是以无限平铺的方式存在的。即使重复,也往往伴随着多样性和随机性。因此为了更自然一些,我们可能需要实现的背景随机一些,这样就显得自然一点。
laixiangran
2018/07/25
9160
CSS3实现多种背景效果
《精通CSS》第5章 漂亮的盒子
前面我们了解过了盒模型,知道盒子由外边距、边框、内边距和内容区组成。对于整个盒子,我们可以通过一系列的手段来美化,如指定盒子的背景、边框以及盒子的阴影。
歪马
2020/04/07
1.9K0
《精通CSS》第5章 漂亮的盒子
CSS3背景
在CSS3中,背景定位得到了扩展,它允许我们指定背景图片在距离任意角的偏移量,只需要在偏移量前面指定关键字
踏浪
2019/07/31
8620
相关推荐
CSS3背景与渐变
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档