百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

用 CSS Grid 布局制作一个响应式柱状图

myzbx 2025-03-07 22:06 21 浏览

最新一段时间比较喜欢玩弄图表,出于好奇,我想找出比较好的用 CSS 制作图表的方案。开始学习网上开源图表库,它对我学习新的和不熟悉的前端技术很有帮助,比如这个:CSS Grid。

今天和大家分享我学到的新知识:如何用 CSS Grid 布局制作一个普通的响应式柱状图。先上效果图:

这篇文章的示例只是一个试验,用来学习 CSS Grid 布局,加上本人也是现学现卖,所以本文出现的代码不具有太多的参照意义。

第一个简单版本

第一眼看上去可能会有点不知道怎么开始,因此我们先来关注如何创建一个简单的版本。首先,我们需要为图表编写 HTML 标签:

这些 bar- 开头的 div 标签将对应柱状图中的一条柱子,整篇文章所需要的 HTML 就这么多。

现在按照我的步骤和简单的解说一步一步用 CSS 把柱状图大概的样式画出来,不用过多地担心下面出现的可能对你有些陌生的 CSS 语义,稍后我们将重点介绍关于 CSS Grid 的知识。

好了,现在开始我们的 CSS 样式编写。我们先对父元素添加一些必要的样式:

* { box-sizing: border-box; }

html, body {
  margin: 0;
  background-color: #eee;
  display: flex;
  justify-content: center;
}

.chart {
  height: 100vh;
  width: 70vw;
}

我们需要在图表中有12个条形,中间有5px的间距,按此需求,我们可以对父类 .chart 编写如下 Grid 相关的样式:

.chart {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  grid-template-rows: repeat(100, 1fr);
  grid-column-gap: 5px;
}

对于熟悉 Grid 布局的人来说,这是非常简单的。上面代码表达的是:“我想要12列,每个子元素具有相同的宽度(1fr = 1 fraction),高度分为 100 等分,1 等分为一行(这样方便计算),它们之间有 5px 的间隔。”

到这里,我们的图表仍然是空的,因为我们没有告诉我们的子元素如何去占用网格中的空间。我们使用 grid-row-start 和 grid-row-end 属性来填充网格中的垂直空间,后而我们将通过改变这两个属性来定义各个子元素自己的高度。为样式类为 bar 开头子元素添加如下样:

[class*="bar"] {
  grid-row-start: 1;
  grid-row-end: 101;
  border-radius: 5px 5px 0 0;
  background-color: #ff4136;
}

现在可以得到这样的效果:

我们告诉每个柱状图从网格的顶部(1)开始,然后在底部(101)结束。上面我们把网格划分了 100 行,为什么要使用 101 作为该属性的值呢?如果你被这些 Grid 属性搞蒙了,没关系!在我们继续之前,让我们对此进行一点探讨。

理解网格线

Grid 布局的一个特殊之处就是网格线的概念,这对理解这个新的布局工具非常重要。以下是网格线在四行四列网格中绘制的示意图:

这四行四列的对应的样式是这样的(特殊的黑色区域对应的样式类为 special-col):

.grid {
  grid-gap: 5px;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
}

.special-col {
  grid-row: 2 / 4;
  background-color: #333;
}

grid-row 是 grid-row-start 和 grid-row-end 的简写属性,前者表示元素在网格中的开始位置,后者表示元素在网格中的结束位置。注意到没,黑色块是从第 2 条网格线开始的,并在第 4 条网格线结束(而不是在第 4 行)。如果我们想让那个黑盒子填满所有 4 行,那么我们需要在第 5 条网格线结束,即:1 / 5。理解这一点很重要。

换句话说,我们不应该认为子元素在一个网格中占据整个行或列,而应该只跨越这些网格线的。我花了不少时间才从概念上理解并习惯了这一点,因为我最近深入研究了Jen Simmons关于这个问题的教程。

回到示例

这就是为什么在我们上面的图表示例中,所有列都在 101 这个值结束,因为 101 代表的是第 101 条网络线,而不是第 100 行。

现在,由于我们的 .chart 使用了 vw/vh 单位,也就有了一个响应良好的图表,不需要再做其它的额外工作来支持响应式。如果你调整浏览器大小,你会发现它可以很好地压缩或延伸,它总是占据整个视窗。

理解了网络线的概念,我们就可以很轻松地为柱子调整高度了,我们需要让各柱子高度参差不一。

.bar-1 {
  grid-row-start: 55;
}
.bar-2 {
  grid-row-start: 1;
}
...(略)

最后我们使寄偶数的柱子颜色不一样:

[class*="bar"]:nth-child(odd) {
  background-color: #ff4136;
}

[class*="bar"]:nth-child(even) {
  background-color: #0074d9;
}

效果:

我们就这样制作完成了一个支持响应式的柱状图。当然,这个示例只是一个开始,距离要达到实际应用的效果还有很多事情要做。比如画标注和轴、通过 JS 来绑定真实的业务数据等。

相关推荐

任天堂Switch OLED:一块沉浸屏,点燃全家欢乐的游戏时光

在一个寻常的周末午后,客厅里弥漫着轻松惬意的氛围。电视屏幕暂时休眠,全家人的目光却聚焦在那台轻巧的掌上设备——任天堂SwitchOLED。父母与孩子挤在沙发上,指尖在Joy-Con手柄上跃动,时而因...

Switch是什么地区的版本?怎么分辨Switch普通版和续航版、OLED版

Switch有国行、港版、日版、美版、欧版、韩版,版本之间又有普通版和续航版的OLED区别。只要看掌机的序列号第二三位,第二位代表的机型,A是普通版,K是续航版,T是OLED版。第三位代表的是区域,比...

这款Switch手柄真别致!开箱体验八位堂Lite蓝牙手柄

【引言】Hi大家好,我是歌布林,今天给大家带来一款八位堂Lite蓝牙手柄的开箱报告!相信已经有不少Switch玩家已经入手了这款产品,讲真,这款手柄的颜值真的吸引到我了~双十一旗舰各大快递公...

switch 的性能提升了 3 倍,我只用了这一招

上一篇《if快还是switch快?解密switch背后的秘密》我们测试了if和switch的性能,得出了要尽量使用switch的结论,因为他的效率比if高很多,具体原因点击上文查看。既...

在对《Nintendo Switch 运动》充满期待的同时,我也有些许不安

任天堂「运动」系列的最新作《NintendoSwitch运动》即将于4月29日正式发售。在等待本作发售的日子里,笔者每一天都在掰着指头计算发售日还有几天才到来。在《NintendoSwi...

switch上最值得玩的五款JRPG(switch最值得玩的大作)

不知道为什么即使现在节奏变得这么快,人也变得浮躁,我依旧喜欢玩JPRG,喜欢沉浸入游戏的角色之中体验一场独特的冒险。JRPG的灵魂是什么?那绝对不是回合制战斗或者古旧的系统,而是令人深刻的剧情及在这漫...

那个 Vue 的路由,路由是干什么用的?

在Vue里,路由就像“页面导航的指挥官”,专门负责管理页面(组件)的切换和显示逻辑。简单来说,它能让单页应用(SPA)像多页应用一样实现“不同URL对应不同页面”的效果,但整个过程不会刷新网页。一、路...

S235JRH材50x50x3-5mm欧标方管疲劳强度分析

在工程与建筑领域,方管作为一种重要的结构材料,广泛应用于各种框架和支撑结构中。S235JRH材质的50x50x3-5mm欧标方管在疲劳强度方面的表现尤其受到关注。本文将以“解答常见误区”的形式,分析该...

纤维丛上的联络与曲率关系之二:七个联络

参阅一文看懂纤维丛(看图说话)纤维丛上的联络与曲率关系之一1.仿射联络(AffineConnection)定义:在光滑流形M的切丛TM上,一个仿射联络是一个双线性映射:仿射联络定义了向量...

安全完整性等级(SIL)分析报告编制与认证实践方法

以下是一篇关于安全完整性等级(SIL)分析报告的文章,涵盖SIL定级方法、验证流程、计算模型及工程实践。安全完整性等级(SIL)是量化安全仪表系统(SIS)性能的核心指标,由IEC61508/615...

欧标方管75x75x3mm8mm S355J0H力学性能测试

欧标方管75x75x3mmS355J0H是一种常见的钢管材料,广泛应用于建筑、机械制造和结构工程等领域。下面将对其力学性能进行详细测试和分析。1.材料概述S355J0H是欧洲标准EN10210中规定的...

p光与s光在SHG中的相位匹配中有哪些不同?

【第六期】p光与s光在SHG中的相位匹配中有哪些不同?在二次谐波生成(SHG)中,p偏振光和s偏振光的相位匹配条件存在显著差异。这些差异主要源于它们与纳米结构相互作用的方式以及它们在激发表面等离子体共...

S355JRH欧标方管机械性能及工程应用解析

S355JRH欧标方管是一种高强度钢管,以其优良的机械性能和良好的加工性在工程领域得到广泛应用。本文将从机械性能、场景应用等方面对S355JRH欧标方管进行解析,以帮助读者更好地理解其特性及应用。1....

《三国志·战棋版》PK7黄天蔽汉,四队共存作业来啦!

哈喽大家好啊,今天要给大家分享的是三棋PK7黄天蔽汉平时四队共存队,这只是其中一种选择供大家参考,后面可能还会分享其他的四队共存方案。队伍共存绝不唯一,大家有什么好的共存方案或者想看哪些队伍的共存也欢...

迈阿密三大巨星首秀被0-0逼平,豪阵为何难赢开罗国民

谁能想到,汇聚梅西、苏亚雷斯、布斯克茨这“银河战舰”级别三巨头,迈阿密国际世俱杯首秀居然0-0被埃及劲旅开罗国民逼平?全场90分钟,球迷的心情从“期待冠军”一路跌到“差点开门黑”。补时第96分钟,梅西...