纯CSS数据图表制作教程
小伙伴们有没有觉得学习文章很有意思?有意思就对了!今天就给大家带来《纯CSS制作数据图表教程》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
用纯CSS可以制作简单静态的数据统计图表,如柱状图、饼图和进度条等,通过HTML元素与CSS3特性实现。1. 柱状图利用flex布局和CSS变量控制高度与颜色,结合transition实现动画效果;2. 饼图可用conic-gradient定义各部分比例,但动态更新困难;3. 进度条通过控制内层div的宽度展示进度,支持简单的动画。优势包括轻量、高性能、易于定制和响应式设计,适用于静态站点或博客;局限在于交互性差、数据更新不便、图表类型受限且维护复杂,不适用于实时数据或高级交互需求。提升可维护性可通过CSS变量、语义化HTML和模块化CSS,增强可访问性则需关注颜色对比度、替代文本及键盘导航支持。
用纯CSS来制作数据统计图表,这事儿听起来有点“反直觉”,毕竟我们习惯了用JavaScript库来处理数据可视化。但实际上,对于一些相对简单、静态的数据展示,CSS确实能做到,而且效果往往出人意料地好。它主要通过巧妙地运用HTML元素的尺寸、颜色、定位以及一些CSS3的特性(比如transform
、conic-gradient
)来模拟图表的视觉效果,省去了JavaScript的开销,让页面加载更快,也更容易集成到纯静态的网站里。

解决方案
要用纯CSS制作图表,最直观的例子就是柱状图了。它的核心思路就是把每个数据点表示成一个HTML元素,然后用CSS控制它们的高度来反映数值大小。

想象一下,我们有一组数据,比如不同产品的销售额。我们可以用一个无序列表
来包裹这些数据项,每个代表一个柱子。
<div class="chart-container"> <ul class="bar-chart"> <li style="--height: 70%; --color: #4CAF50;"><span>产品A</span></li> <li style="--height: 55%; --color: #2196F3;"><span>产品B</span></li> <li style="--height: 90%; --color: #FFC107;"><span>产品C</span></li> <li style="--height: 40%; --color: #9C27B0;"><span>产品D</span></li> <li style="--height: 80%; --color: #FF5722;"><span>产品E</span></li> </ul> </div>
这里我用了CSS变量--height
和--color
来动态设置每个柱子的高度和颜色。这种做法,我个人觉得比直接在CSS里写死要灵活得多,虽然数据还是写在HTML里,但至少样式和结构稍微分开了点。

接下来是CSS部分,让这些真正变成柱子:
.chart-container { width: 100%; max-width: 600px; margin: 40px auto; padding: 20px; background: #f9f9f9; border-radius: 8px; box-shadow: 0 4px 8px rgba(0,0,0,0.1); box-sizing: border-box; /* 避免padding导致宽度溢出 */ } .bar-chart { display: flex; align-items: flex-end; /* 柱子从底部开始生长 */ height: 250px; /* 图表总高度 */ list-style: none; padding: 0; margin: 0; border-bottom: 1px solid #ccc; /* X轴线 */ position: relative; /* 用于定位标签 */ } .bar-chart li { flex-grow: 1; /* 每个柱子等宽 */ margin: 0 5px; background-color: var(--color, #666); /* 使用自定义颜色,或默认色 */ height: var(--height, 0); /* 使用自定义高度 */ position: relative; border-radius: 4px 4px 0 0; transition: height 0.5s ease-out; /* 动画效果,让它看起来更生动 */ } .bar-chart li span { position: absolute; bottom: -25px; /* 放在柱子下方 */ left: 50%; transform: translateX(-50%); white-space: nowrap; font-size: 0.8em; color: #555; } /* 可以加个hover效果,增加交互感 */ .bar-chart li:hover { filter: brightness(1.1); cursor: pointer; }
这样,一个基本的纯CSS柱状图就出来了。你甚至可以给它加上响应式设计,让flex-wrap
在小屏幕上自动换行,或者调整flex-basis
。数据标签我放在了柱子下方,当然也可以放在柱子内部顶部,或者通过伪元素显示具体数值。
纯CSS图表在实际项目中的优势与局限性?
说实话,纯CSS图表在实际项目中的地位挺微妙的。它有自己独特的优势,但局限性也相当明显。
优势方面:
- 轻量与高性能: 这是它最大的卖点。没有JavaScript库的引入,文件体积小,加载速度快,对网络和设备性能要求低。对于那些内容为主、对交互性要求不高的静态站点或博客,这简直是福音。
- 易于主题化和定制: 所有的样式都写在CSS里,你可以通过修改几行CSS变量或者替换样式表,就能彻底改变图表的外观。这比去研究一个JS库的API来定制主题要直接得多。
- 脱离JavaScript依赖: 在某些特定环境下,比如内容安全策略(CSP)非常严格,或者JavaScript被禁用时,纯CSS图表依然能正常显示。这在一些政府或企业内网应用中可能有用。
- SEO友好: 毕竟数据和标签都在HTML结构里,搜索引擎抓取起来毫无压力,有利于内容的索引和排名。
- 响应式设计: 结合Flexbox或Grid布局,纯CSS图表天生就能很好地适应不同屏幕尺寸,无需额外的JS代码来处理布局变化。
局限性方面:
- 交互性缺失: 这是硬伤。你无法轻松实现复杂的鼠标悬停提示(tooltip)、点击事件触发数据筛选、数据钻取、拖拽缩放等高级交互功能。虽然可以利用
:hover
和:focus
做一些简单的视觉反馈,但离真正的交互式图表还差得很远。 - 数据绑定与动态更新困难: 数据通常需要硬编码在HTML或通过CSS变量注入,这意味着数据更新时需要重新生成HTML或CSS。对于实时数据或频繁变化的数据,这几乎不可行。JavaScript库在这方面有天然优势,能直接绑定数据模型。
- 图表类型受限: 纯CSS能做的图表类型非常有限。柱状图、简单的条形图、进度条、两三段的饼图(用
conic-gradient
实现多段饼图虽然理论可行,但复杂度和兼容性是个问题)是比较容易实现的。但折线图、散点图、堆叠图、雷达图、漏斗图这些,几乎不可能纯CSS实现,或者说实现起来的代价和复杂度远超其价值。 - 可维护性挑战: 当图表变得稍微复杂一点,比如需要显示多组数据、有复杂的刻度线或网格时,纯CSS代码会变得非常冗长和难以管理。HTML结构也可能为了适应CSS样式而变得不够语义化。
- 动画效果有限: 虽然CSS3的
transition
和animation
可以实现不错的入场动画或状态切换动画,但相比JS库提供的流畅、复杂、基于数据变化的动画,还是有差距。
所以,我的建议是,如果你的项目需要展示的数据量不大,图表样式相对固定,且对交互性要求不高,那么纯CSS图表是一个值得考虑的方案。但如果涉及到大数据、实时更新、复杂交互,或者需要多种图表类型,那还是老老实实选择ECharts、Chart.js、D3.js这些专业的JavaScript图表库吧。
如何用CSS实现不同类型的图表?
除了上面提到的柱状图,纯CSS还能勉强应付一些其他类型的图表,但难度和复杂度会直线上升。
1. 柱状图/条形图 (Bar/Column Charts):
这个上面已经详细说了,核心就是display: flex
或display: grid
配合height
或width
来控制柱子/条的长度。
/* 柱状图,上面已给出 */ /* 条形图(横向柱状图)类似,只是把height换成width,flex-direction换成column */ .bar-chart.horizontal { flex-direction: column; /* 垂直排列条形 */ height: auto; width: 100%; /* 容器宽度 */ } .bar-chart.horizontal li { height: 30px; /* 条的高度固定 */ width: var(--width, 0); /* 宽度由数据决定 */ margin: 5px 0; border-radius: 0 4px 4px 0; /* 圆角在右侧 */ } .bar-chart.horizontal li span { top: 50%; left: 10px; /* 标签在条形左侧 */ transform: translateY(-50%); }
2. 饼图 (Pie Charts): 这个稍微有点意思,但实现起来有点“魔法”。最常见的两种纯CSS饼图是:
- 两段式饼图: 用两个半圆(或一个圆的两个部分)通过
transform: rotate
和overflow: hidden
来模拟。一个圆,一半用一个颜色,另一半用另一个颜色,然后旋转其中一个半圆来表示比例。这种方式,说实话,只适用于两段数据,再多就麻烦了。 - 多段式饼图 (使用
conic-gradient
): 这是目前纯CSS实现多段饼图最优雅的方式,但需要浏览器支持conic-gradient
(现代浏览器基本都支持了)。
/* 示例:使用conic-gradient的饼图 */ .pie-chart { width: 200px; height: 200px; border-radius: 50%; background: conic-gradient( #FFC107 0% 25%, /* 25% 的黄色 */ #2196F3 25% 60%, /* 从25%到60%的蓝色 (35%) */ #4CAF50 60% 100% /* 从60%到100%的绿色 (40%) */ ); margin: 40px auto; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
这种方式,数据需要手动计算百分比和起始/结束角度,并直接写在conic-gradient
里。虽然简洁,但动态性几乎没有。如果数据变化,你得手动改CSS,这显然不是一个好主意。
3. 进度条 (Progress Bars):
这个相对简单,一个外层div
作为容器,一个内层div
作为进度条,通过控制内层div
的width
来显示进度。
<div class="progress-bar-container"> <div class="progress-bar" style="--progress: 75%;"></div> </div>
.progress-bar-container { width: 100%; max-width: 400px; height: 20px; background-color: #e0e0e0; border-radius: 10px; overflow: hidden; /* 确保内部进度条不溢出 */ margin: 20px auto; } .progress-bar { height: 100%; width: var(--progress, 0); /* 进度 */ background-color: #4CAF50; border-radius: 10px; transition: width 0.6s ease-out; /* 动画效果 */ }
4. 折线图 (Line Charts):
这个是纯CSS图表里最难搞的。你几乎不可能用CSS画出平滑的曲线,因为CSS没有路径绘制能力(SVG可以,但那就不是纯CSS了)。能做的,顶多是模拟阶梯状的折线图,或者用伪元素在数据点上放置标记,然后用边框或者transform
来连接,但效果往往差强人意,而且非常依赖特定的HTML结构。我个人觉得,折线图如果不是SVG或者Canvas,纯CSS做出来几乎没有实用价值。
提升纯CSS图表可维护性与可访问性的技巧?
既然决定要用纯CSS做图表,那么在可维护性和可访问性上多花点心思,绝对是值得的。不然,随着项目的发展,它可能很快变成一个难以触碰的“雷区”。
提升可维护性:
- 拥抱CSS变量(Custom Properties): 就像我上面柱状图的例子,把颜色、高度基准、间距等可变参数定义成CSS变量。这样,修改图表样式时,只需要改动变量的值,而不是在多处查找替换。这对于主题切换或快速调整样式非常有用。
- 语义化的HTML结构: 尽量让HTML结构本身就带有意义。例如,用
和来表示一组数据项,用
和
来包裹图表和标题。这不仅有助于CSS选择器更清晰,也方便未来可能需要引入的JavaScript或屏幕阅读器理解内容。 - 模块化CSS: 不要把所有图表的CSS都堆在一个文件里。可以为每种图表类型创建独立的CSS模块,或者使用BEM(Block Element Modifier)等命名约定来组织你的CSS类名,避免样式冲突和提高可读性。
- 清晰的注释: 尤其是在一些巧妙的CSS技巧(比如饼图的
conic-gradient
或者复杂的定位)旁边,留下清晰的注释,解释你的意图和实现原理。这对于后续的维护者(甚至未来的你自己)来说,都是巨大的帮助。 - 数据嵌入方式: 尽量通过
data-*
属性将数据嵌入到HTML元素中,而不是直接写在CSS变量里。虽然CSS变量能直接用,但data-*
属性更符合HTML的数据存储语义,未来如果需要JavaScript来增强图表功能,这些数据也更容易被JS读取和处理。
提升可访问性:
- 语义化HTML是基础: 再次强调,使用正确的HTML标签至关重要。屏幕阅读器会根据这些标签来理解页面的结构和内容。
- 提供替代文本: 对于纯视觉的图表,必须提供替代文本或描述。
- 使用
和
:
可以作为图表的标题或简要描述。 - 在图表容器上使用
aria-label
或aria-describedby
:aria-label
提供一个简洁的描述,aria-describedby
可以指向页面中一个更详细的描述元素。 - 如果数据点有标签,确保它们是可读的,并且与视觉效果一致。
- 使用
- 颜色对比度: 确保图表中的颜色(背景色、数据条颜色、文本颜色等)具有足够的对比度,以便色盲用户或视力不佳的用户也能清晰地辨认。可以使用WCAG(Web Content Accessibility Guidelines)推荐的对比度工具进行检查。
- 键盘导航考虑: 虽然纯CSS图表本身通常不具备交互性,但如果你的图表元素(比如每个柱子)是可聚焦的(例如,你给它们加了
:hover
效果,并希望用户能通过键盘tab键聚焦),那么要确保它们能够被键盘正确访问到,并且有可见的焦点指示器(:focus
样式)。 - 避免纯视觉传达信息: 不要仅仅通过颜色或形状来传达关键信息。例如,如果某个柱子代表“警告”,除了颜色变红,最好也通过文字标签、图标或模式来明确指示。
总的来说,纯CSS图表是Web开发中一个有趣的技巧,它在特定场景下能发挥优势。但选择它,就意味着你要接受它在功能和交互上的限制,并需要在可维护性和可访问性上付出额外的努力。
终于介绍完啦!小伙伴们,这篇关于《纯CSS数据图表制作教程》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

- 上一篇
- Java中error用法及两大区别详解

- 下一篇
- 多模态AI识别特殊材质,材料科学新突破
-
- 文章 · 前端 | 1分钟前 |
- BOM如何获取设备用户信息?
- 390浏览 收藏
-
- 文章 · 前端 | 6分钟前 |
- BOM本地存储操作技巧详解
- 495浏览 收藏
-
- 文章 · 前端 | 17分钟前 |
- HTML文件怎么在浏览器打开?默认设置方法
- 348浏览 收藏
-
- 文章 · 前端 | 20分钟前 |
- 纯CSS数据图表制作教程
- 210浏览 收藏
-
- 文章 · 前端 | 25分钟前 | websocket 前端框架 AJAX轮询 数据冲突 HTML表格数据同步
- HTML表格数据同步技术解析与方法
- 352浏览 收藏
-
- 文章 · 前端 | 26分钟前 |
- CSS中margin是什么?详解外边距属性功能
- 501浏览 收藏
-
- 文章 · 前端 | 32分钟前 |
- 表格日志记录方法:JS监听与数据变更追踪
- 242浏览 收藏
-
- 文章 · 前端 | 33分钟前 |
- JS实现页面打印的5种方式!
- 185浏览 收藏
-
- 文章 · 前端 | 52分钟前 |
- JS中Promise是什么?如何使用?
- 209浏览 收藏
-
- 文章 · 前端 | 55分钟前 |
- JavaScript策略模式解析与实战案例
- 447浏览 收藏
-
- 文章 · 前端 | 58分钟前 |
- JS中map方法详解与使用技巧
- 130浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 509次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 边界AI平台
- 探索AI边界平台,领先的智能AI对话、写作与画图生成工具。高效便捷,满足多样化需求。立即体验!
- 28次使用
-
- 免费AI认证证书
- 科大讯飞AI大学堂推出免费大模型工程师认证,助力您掌握AI技能,提升职场竞争力。体系化学习,实战项目,权威认证,助您成为企业级大模型应用人才。
- 51次使用
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 176次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 252次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 194次使用
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览
-
- UI设计中为何选择绝对定位的智慧之道
- 2024-02-03 501浏览