用CSS+SVG做一个优雅的环形进度条

开门见山

先上最终效果图:(Demo 传送门)

GIF 2023-10-17 20-47-27.gif

其中进度、尺寸、环宽和颜色都可以非常方便地进行控制。

核心原理:

利用两个重叠的圆环形,通过对上层圆环弧长的控制来表示进度,下层圆环则作为辅助,呈现环形进度条剩余的部分。

核心知识点:

  • SVG circle stroke-dasharray
  • 弧长公式 l = πrα/180°
  • CSS 变量
  • CSS 计数器

下面分享下具体实现过程。

实现环形

要实现环形,有多种技术可供选择,包括 Canvas、SVG,甚至 CSS + HTML 的组合。在本文中,我们使用了 SVG 方案,一来是因为 SVG 的 API 丰富,图形表现力非常强大,二来是 SVG 可以与 CSS 无缝搭配使用,实现更加强大的功能。

用 SVG 中的 circle 标签可以毫无压力的绘出一个直径 200px 的圆环:

<svg width="400" height="400"><circle cx="200" cy="200" r="100" fill="none" stroke="blue" stroke-width="10" />
</svg>

image-20231005184007033.png

我们再调整下代码,让圆环图形完美适应 SVG 容器的 200×200 大小:

<svg width="200" height="200"><circle cx="100" cy="100"r="95"fill="none" stroke="blue" stroke-width="10" />
</svg>

小技巧:为了完美适应容器尺寸,我们可以将半径 r 的值设置为容器宽度的一半减去 stroke-width 大小的一半,这样做可以确保圆环不会因为溢出而被容器剪裁掉。此处 r = 200 / 2 - 10 / 2,即 (200 - 10) / 2 = 95

image-20230929174222983.png

接着使用相同的方法绘制另一个圆环,作为辅助圆环。为了视觉效果,进度圆环应该在上层,因此在代码中,进度圆环的标签应该放在辅助圆环的后面。完成后的代码如下:

<svg width="200" height="200"><!-- 辅助圆环 --><circle cx="100" cy="100" r="95" fill="none" stroke="#ccc" stroke-width="10" /><!-- 进度圆环 --><circle cx="100" cy="100" r="95" fill="none" stroke="blue" stroke-width="10" />
</svg>

可以发现代码中有很多重复的属性,为了让代码更加简洁和高效,我们可以使用 CSS 将这些重复的部分提取出来,统一声明,让代码变得更加“干”(DRY):

.progress-circle {width: 200px;height: 200px;
}.progress-circle > circle {cx: 100px;cy: 100px;r: 95px;fill: none;stroke-width: 10px;
}
<svg class="progress-circle"><circle stroke="#ccc" /><circle stroke="blue" />
</svg>

实现圆环进度

上下两层的圆环已经准备好了,现在的重点是如何实现上层圆环上的进度,这个问题可以分为2个关键点:

  1. 如何实现圆环的弧长?
  2. 如何将进度百分比转换为圆环的弧长?

要解决第1个问题,这里要用到 SVG 中的 stroke-dasharray 属性,这是一个用来控制路径虚线疏密程度的属性,其值是一组描述虚线的短划线与空白间隙长度的数列。例如,如果设置 stroke-dasharray="5 2",则路径将以 5 个像素的短划线和 2 个像素的空白间隙交替显示,其中第一个数控制短划线长度,第二个数控制空白间隙长度。

stroke-dasharray 的参数值还支持多个数列,详情见 MDN 文档

很明显,这里我们需要控制圆弧的长度(即虚线中的短划线长度)来呈现进度。然而,由于虚线中的短划线是多个且重复的,仅仅改变短划线长度并不能满足我们的需求,具体情况如下图所示:

GIF 2023-9-30 12-01-51.gif

根据需求,我们只需要圆环的 一段 圆弧即可,那如何实现呢?经过多次尝试,我们发现当改变虚线中空白间隙的长度(即 stroke-dasharray 的第二个数),当这个长度超过圆环的周长时,视觉效果上圆环只剩下一条独立的圆弧了,此时我们可以通过调整第一个数来改变圆弧的长度,从而解决了上面第1个问题。

GIF 2023-9-30 11-27-11.gif

上面第2个问题暂时看起来比较棘手,因为我们很难看出0%~100%之间的进度到底对应多长的弧长。我们继续探究,寻找规律。

根据需求,当进度百分比是100%时,进度条的圆弧要呈现出一个圆环,此时圆弧夹角是360°,当进度百分比是50%时,圆弧是个半圆环,夹角是180° 。反过来也成立:180°表示50%,360°表示100% 。可以看出进度百分比和角度是存在等量关系的,同时根据弧长公式 l = πrα/180°,带入角度就可以求出弧长了,至此“进度百分比 - 角度 - 弧长”三者的规律就清晰了,思路马上要通了。

l = πrα/180°

其中 l 表示弧长,π 是圆周率,r 表示半径,α 表示夹角

GIF 2023-9-30 15-38-19.gif

在实际使用中,我们是用百分数来控制弧长的,而不是用角度,所以接下来把进度百分比和弧长关联起来。

我们把弧长公式变动下,分子分母同时乘以2,则有:

l = 2πrα/180°*2,即 l = 2πr * α/360°

同时根据前面可知进度百分比和角度存在等量关系(360° 等于 100%),所以可以得到:

l = 2πr * p/100,其中 p 为当前进度百分数。

现在,我们就可以根据进度百分比来计算出对应的弧长了。

GIF 2023-9-30 16-06-32.gif

优化细节

环形进度条通常都是从12点钟方向开始的,而 SVG 中默认是3点钟方向作为起点,所以我们给它偏转-90°进行修正:

.progress-circle {...transform: rotate(-90deg);
}

image-20230930161808711.png

另外我们发现圆弧的端点处过于生硬,给个圆角效果修饰下是个好主意。这里我们用了 SVG 中的属性 stroke-linecap

.progress-circle > circle {...stroke-linecap: round;
}

image-20230930162342907.png

当然了,动画过渡效果也可以安排上,让进度条的变化更加丝滑:

.progress-circle > circle {...transition: stroke-dasharray 0.4s linear, stroke .3s;
}

组件化

环形进度条的效果虽然已经实现了,但光靠上面的那些代码还是很难复用。环形进度条的宽度、高度、半径、颜色等都是写死的,另外 stroke-dasharray 的值还得靠 JS 进行计算,再赋值给 <circle> 元素。说好的纯 CSS 实现呢?

要解决这些问题,我们需要将环形进度条组件化。

先定义一些组件全局要用到的 CSS 变量:

/* 容器 */
.progress-circle {--percent: 0;  /* 百分数 */--size: 180px;  /* 尺寸大小 */--border-width: 15px;  /* 环形宽度(粗细) */--color: #7856d7;  /* 主色 */--inactive-color: #ccc;  /* 辅助色 */
}

然后利用 calc 将写死的数值改为根据 CSS 变量动态计算:

/* 容器 */
.progress-circle {width: var(--size);height: var(--size);transform: rotate(-90deg);border-radius: 50%;
}/* 进度条环形图形 */
.progress-circle > circle {cx: calc(var(--size) / 2);cy: calc(var(--size) / 2);r: calc((var(--size) - var(--border-width)) / 2);fill: none;stroke-width: var(--border-width);stroke-linecap: round;transition: stroke-dasharray 0.4s linear, stroke .3s;
}

SVG 中的 stroke-dasharray 也调整为根据 CSS 变量动态计算:

<svg class="progress-circle"><circle stroke="var(--inactive-color)" /><circle stroke="var(--color)"style="stroke-dasharray: calc(2 * 3.1415 * (var(--size) - var(--border-width)) / 2 * (var(--percent) / 100)), 1000"/>
</svg>

这样我们通过改变父容器的 --percent 变量就能直接控制进度条的百分比显示了。

GIF 2023-9-30 17-13-33.gif

同理,也可以改变其他内部变量来方便地控制组件的外观和尺寸。例如可以根据阈值来动态调整进度条颜色:

function changeProgress(percent) {progressEl.style.setProperty('--percent', percent);[{ value: 90, color: '#7c5' },{ value: 70, color: '#65c' },{ value: 50, color: '#fc3' },{ value: 0, color: '#f66' }].find(it => {if (percent >= it.value) {progressEl.style.setProperty('--color', it.color);return true;}});
}

GIF 2023-9-29 16-10-31.gif

显示百分比文本

可以把百分比的文本显示在环形进度条的中央,增强可视化效果。有了前面的铺垫,这里只需用伪元素 + CSS 计数器就能轻松实现百分比文本显示。

由于 SVG 中不支持伪元素,所以我们加一层 HTML 标签作为主容器:

<div class="progress-circle"><svg>...</svg>
</div>

然后为主容器增加伪元素,居中定位,再利用 CSS 计数器接收 --percent 变量的值:

/* 百分数文本 */
.progress-circle::before {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);counter-reset: progress var(--percent);content: counter(progress) '%';white-space: nowrap;font-size: 18px;
}

效果如下图:

GIF 2023-9-30 17-44-47.gif

完善边界场景

上面为圆环加了 stroke-linecap: round 让描边的端点圆角化,不过却引出了一个小问题:当真实进度为 0% 时,由于端点圆角的存在,使得进度条在视觉效果上明显大于0%,正如下图所示:

image-20231005115314590.png

受《纯CSS实现未读消息超过100自动显示为99+》一文的启发,我们为进度圆环加一个值为 --percentopacity 属性即可解决这个问题:

<div class="progress-circle"><svg><circle ... /><circle class="progress-value" ... /></svg>
</div>
.progress-value {opacity: var(--percent);}

--percent 的值为 0 时,此处 opacity 为 0,则进度圆环完全透明不显示;当 --percent 的值大于 0 时,opacity 的值按 1 处理,则进度圆环正常显示。

GIF 2023-10-5 12-10-25.gif

扩展:仪表盘式进度条

环形进度条还有一种变体——仪表盘式进度条,顾名思义就是以仪表盘的形态显示进度,有着视觉吸引力强和易于理解的优点。下图是来自 AntDesign 的仪表盘式进度条示例:

image-20231017210252819.png

在前面知识的基础上,我们趁热打铁再做一个仪表盘式进度条。

生成缺口

在视觉上,仪表盘式进度条相比圆环进度条最大的不同就是前者有个空白“缺口”,且缺口朝下,整体左右对称。

我们很容易能够想到用 stroke-dasharray 的第1个参数来生成可见的圆弧(即“缺口”以外的部分),用第2个参数来生成间隙(即“缺口”)。以中心夹角90°的缺口为例,代入弧长公式(l = πrα/180°)则有:

<div class="progress-circle"><svg><circle stroke="var(--inactive-color)"style="stroke-dasharray: calc(3.1415 * var(--r) * (360 - 90) / 180),calc(3.1415 * var(--r) * 90 / 180)"/></svg>
</div>

效果如下图所示:

image-20231017214115175.png

确定 svg 旋转角度

在不对容器做任何旋转的情况下,这个90°缺口朝向右上角,而我们实际想要的是让缺口朝下,且整体左右对称。要达到这个目的,我们需要将 svg 容器顺时针旋转135°,效果如下:

GIF 2023-10-17 21-52-30.gif

在实际场景中,这个“缺口”的大小是可配置的,所以我们把缺口夹角封装到主容器的 CSS 变量里,方便后续的动态计算。

.progress-circle {...--gap-degree: 90;  /* 缺口夹角 */
}

当缺口夹角变成动态时,svg 容器到底需要旋转多少度才能使缺口的开口朝下,且整体左右对称呢?我们接着以90°夹角的缺口为例来分析。从前面实践可知想要让90°缺口朝下,且整体左右对称,则需要将 svg 容器顺时针旋转135°,旋转后的示意图如下:

135.png

其中 ∠A = ∠B = 135°,仔细观察可发现,这里的135°等于缺口自身夹角90°加上 ∠A 与 ∠B 重合的夹角45°. 显然,当缺口夹角发生变化时,此处的重合夹角需要动态计算,结合上图我们不难看出这里存在一个等式:

2 × 重合夹角 + 缺口夹角 = 180°

那么则有:

重合夹角 = (180° - 缺口夹角) / 2

结合 CSS 变量我们就可以确定 svg 容器的旋转角度,代码如下:

.progress-circle > svg {...transform: rotate(calc((var(--gap-degree) + (180 - var(--gap-degree)) / 2) * 1deg));
}

这样我们的进度条就能适配不同的缺口夹角了:

GIF 2023-10-18 9-40-40.gif

修正进度换算

当我们按环形进度条的方式来测试仪表盘式进度条时,发现仪表盘式进度条的进度显示有问题——实际进度百分比和进度显示不匹配,如下图所示:

GIF 2023-10-18 9-51-02.gif

其实也不难理解,我们先看一下现有进度圆环的代码部分:

<circle stroke="var(--color)"class="progress-value"style="stroke-dasharray: calc(2 * 3.1415 * var(--r) * (var(--percent) / 100)), 1000"
/>

在圆环进度条中,这里的 var(--percent) / 100α / 360° 是等价的,360°圆弧表示100%进度,但在仪表盘式进度条中,360°减去缺口夹角后对应的圆弧才真正表示100%进度。所以我们得把缺口夹角的因素换算进去,修正实际的进度显示。

我们从这个公式入手:l = 2πr * α/360°

在圆环进度条中,50%的进度对应180°的圆弧夹角,代入公式则有:

l = 2πr * 180 / 360

如换成仪表盘式进度条,当缺口夹角为90°时,这里的分母就是 360° - 90° = 270°。小学数学教会我们:分子分母等比变化时,其值不变,所以我们给分子也乘以分母变化的值,则有:

l = 2πr * 180 * (270 / 360) / 270

进一步分解下可得:l = πr * 180 * (270 / 180) / 270

我们把除缺口夹角外的圆弧换成 CSS 变量 --active-degree: calc(360 - var(--gap-degree));,写到进度圆环的代码中:

<circle stroke="var(--color)"class="progress-value"style="stroke-dasharray: calc(3.1415 * var(--r) * 180 * var(--active-degree) / 180 / var(--active-degree)), 1000"
/>

其中 (180 * var(--active-degree) / 180) / var(--active-degree) 等价于 (var(--percent) * var(--active-degree) / 180) / 100,答案已经呼之欲出了:

<circle stroke="var(--color)"class="progress-value"style="stroke-dasharray: calc(3.1415 * var(--r) * var(--percent) * var(--active-degree) / 180 / 100), 1000"
/>

最终效果:(Demo 传送门)

GIF 2023-10-18 10-47-20.gif

最后

利用 CSS 和 SVG 技术,我们成功地实现了一个优雅的环形进度条,这个进度条不仅能够展示进度,还能够通过 CSS 变量来调整样式满足不同的需求。希望这篇分享对大家使用 CSS 和 SVG 有所帮助,也希望大家能够在实践中不断探索和创新,做出更加实用和美观的作品。

关于OpenTiny

图片

OpenTiny 是一套企业级 Web 前端开发解决方案,提供跨端、跨框架的UI组件库,适配 PC 端 / 移动端等多端,支持 Vue2 / Vue3 / Angular 多技术栈,拥有灵活扩展的低代码引擎,包含主题配置系统 / 中后台模板 / CLI 命令行等丰富的效率提升工具,可帮助开发者高效开发 Web 应用。

核心亮点:

  • 跨端跨框架: 使用 Renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 / Vue3,PC / Mobile 端,并支持函数级别的逻辑定制和全模板替换,灵活性好、二次开发能力强。

  • 组件丰富:PC 端有100+组件,移动端有30+组件,包含高频组件 Table、Tree、Select 等,内置虚拟滚动,保证大数据场景下的流畅体验,除了业界常见组件之外,我们还提供了一些独有的特色组件,如:Split 面板分割器、IpAddress IP 地址输入框、Calendar 日历、Crop 图片裁切等。

  • 低代码引擎:低代码引擎使能开发者定制低代码平台。它是低代码平台的底座,提供可视化搭建页面等基础能力,既可以通过线上搭配组合,也可以通过下载源码进行二次开发,实时定制出自己的低代码平台。适用于多场景的低代码平台开发,如:资源编排、服务端渲染、模型驱动、移动端、大屏端、页面编排等。

  • 配置式组件: 组件支持模板式和配置式两种使用方式,适合低代码平台,目前团队已经将 OpenTiny 集成到内部的低代码平台,针对低码平台做了大量优化。

  • 周边生态齐全: 提供了基于 Angular + TypeScript 的 TinyNG 组件库,提供包含 10+ 实用功能、20+ 典型页面的 TinyPro 中后台模板,提供覆盖前端开发全流程的 TinyCLI 工程化工具,提供强大的在线主题配置平台 TinyTheme。


欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~

OpenTiny 官网:https://opentiny.design/

OpenTiny 代码仓库:https://github.com/opentiny/

TinyEngine 源码: https://github.com/opentiny/tiny-engine

欢迎进入代码仓库 Star🌟TinyEngine、TinyVue、TinyNG、TinyCLI~

如果你也想要共建,可以进入代码仓库,找到 good first issue标签,一起参与开源贡献~

往期文章推荐

图片

  • 🎉OpenTiny Vue 3.10.0 版本发布:组件 Demo 支持 Composition 写法,新增4个新组件
  • 前端Vuer,请收好这份《Vue组件单元测试》宝典
  • OpenTiny 前端组件库正式开源啦!面向未来,为开发者而生
  • 从自研走向开源的 TinyVue 组件库
  • 我要做开源:提交我的第一次PR
  • 必不可少的UI组件一——组件的基础知识
  • 【华为全联接大会2023高能有料】OpenTiny Engine低代码引擎即将开源

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

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

相关文章

开源云财务软件,财务软件源码,永久免费财务软件

纷析云SAAS云财务软件开源版 包含账套、凭证字、科目、期初、币别、账簿、报表、凭证、结账 技术交流群 扫码添加客服进群 商业版地址 纷析云商业版https://f3.fenxi365.com/ 正式环境&#xff0c;可注册账号直接使用或测试 功能对比 功能模块开源版商业版[技术重构]凭证✔…

蜻蜓c影视追剧系统-多个小程序添加说明

多小程序添加设置 蜻蜓c影视追剧 支持多小程序添加&#xff0c;也就是可以管理不同前端的小程序。 此处id 对应前端小程序的mp值 关于添加小程序&#xff1a; 此处有所有填写内容的参考方式&#xff0c;要注意是必须开通了微信支付才可以添加&#xff0c;这里需要添加证书信息…

高精度时间测量(TDC)电路MS1022

MS1022 是一款高精度时间测量电路&#xff0c;内部集成了模拟比 较器、模拟开关、施密特触发器等器件&#xff0c;从而大大简化了外 围电路。同时内部增加了第一波检测功能&#xff0c;使抗干扰能力大 大提高。通过读取第一个回波脉冲的相对宽度&#xff0c;用户可以获 得接…

微信小程序文本横向无缝滚动

背景&#xff1a; 微信小程序中列表宽度不够长&#xff0c;其中某字段显示不完整&#xff0c;因此要使其自动滚动。 &#xff08;最初看网上很多用定时器实现&#xff0c;但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表&#xff0c;…

离线语音与IoT结合:智能家居发展新增长点

离线语音控制和物联网&#xff08;IoT&#xff09;相结合在家居中具有广泛的应用和许多优势。离线语音控制是指在设备在本地进行语音识别和处理&#xff0c;而不需要依赖云服务器进行处理。IoT是指借助网络&#xff0c;通过手机APP、小程序远程控制家居设备。 启英泰伦基于AI语…

【面试系列】Vue

引言&#xff1a;下面是一些常见的 Vue 面试题和对应的答案 目录 1. Vue 是什么&#xff1f;它有哪些特点&#xff1f;2. Vue 的生命周期有哪些&#xff1f;请简要描述每个生命周期的作用。3. Vue 组件间通信的有哪些方式&#xff1f;4. Vue 的 computed 和 watch 的区别是什么…

python安装gdal

下载whl https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal 安装 pip install GDAL-3.1.4-cp36-cp36m-win_amd64.whl

iMazing苹果用户手机备份工具 兼容最新的iOS16操作系统

现在距离苹果秋季新品发布会已过去月余&#xff0c;新iPhone 14系列和新版的iOS 16操作系统也如约与我们见面了&#xff0c;相信大家在9月初抢购的iPhone 14也基本到手了&#xff0c;但随之到来的数据资料备份迁移却是一件令人头大的事情&#xff0c;使用官方提供的iTunes软件卡…

easyrecovery2024数据恢复软件最新版本下载

easyrecovery是PC上数据恢复领域相当给力的应用软件之一&#xff0c;它具有操作安全&#xff0c;价格便宜&#xff0c;支持用户自主操作等特点&#xff0c;能支持从各种存储介质恢复删除、格式化或者丢失的文件&#xff0c;从任何存储介质设备上的损坏&#xff0c;删除&#xf…

搭建react项目

一、环境准备 1、安装node 官网下载安装&#xff1a;https://nodejs.org/en 注&#xff1a; npm5.2以后&#xff0c;安装node会自动安装npm和npx 2、安装webpack npm install -g webpack3、安装create-react-app npm install -g create-react-app二、创建react项目 1、初…

DFS(分布式文件系统)与 DFSR(分布式文件系统复制)的区别

DFS&#xff08;分布式文件系统&#xff09;和 DFSR&#xff08;分布式文件系统复制&#xff09;是两种不同的技术&#xff0c;尽管它们在名称上有一些相似之处&#xff0c;但它们的用途和功能有所不同。 DFS&#xff08;分布式文件系统&#xff09; DFS 是一种用于创建和管理…

GEE:为机器学习算法(随机森林、支持矢量机等)加入膨胀/腐蚀特征

作者:CSDN @ _养乐多_ 腐蚀和膨胀是数学形态学图像处理中的两个基本操作,用于修改和分析二值图像(包含只有两个像素值的图像,通常是黑和白)。 腐蚀和膨胀操作可以作为机器学习中的特征变量,用来分类,比如在博客《GEE:随机森林分类教程(样本制作、特征添加、训练、精…

Flink学习---15、FlinkCDC(CDC介绍、案例实操)

星光下的赶路人star的个人主页 未来总是藏在迷雾中让人胆怯&#xff0c;但当你踏入其中&#xff0c;便会云开雾散 文章目录 1、CDC简介1.1 什么是CDC1.2 CDC的种类1.3 Flink-CDC 2、FlinkCDC案例实操2.1 开启MySQL Binlog并重启MySQL2.2 FlinkSQL方式的应用2.2.1 导入依赖2.2.2…

解密zkLogin:探索前沿的Sui身份验证解决方案

由于钱包复杂性导致的新用户入门障碍是区块链中一个长期存在的问题&#xff0c;而zkLogin是其简单的解决方案。通过使用前沿的密码学和技术&#xff0c;zkLogin既优雅又复杂。本文深入探讨了zkLogin的工作原理&#xff0c;涵盖了用户和开发者的安全性方面&#xff0c;并解释了S…

如何打造独立站?这4个要点必须做到!

“什么是独立站”独立站指的是个人或小团队独立创建和管理的网站&#xff0c;与依赖于第三方平台的博客、社交媒体或在线商店不同。独立站的所有权和控制权完全归个人或小团队所有&#xff0c;因此具有更大的自主性和独立性&#xff0c;不受第三方平台的限制。 独立站是由个人…

抽象数据库

在刚刚的文章中&#xff0c;完成了无范式到三级范式的过程 : 遵循原子性。即&#xff0c;表中字段的数据&#xff0c;不可以再拆分。 在满足第一范式的情况下&#xff0c;遵循唯一性&#xff0c;消除部分依赖。即&#xff0c;表中任意一个主键或任意一组联合主键&#xff0c…

企业数字化转型时,会遇到的5大挑战

企业数字化转型时&#xff0c;会遇到的5大挑战添加链接描述 数字化转型已然是当今商业战略的一大基石&#xff0c;根据Gartner的《2023年度董事会调查》显示&#xff0c;有89%的企业将数字业务视为其增长的核心。但该研究的另一项统计数据也显示&#xff1a;在这些企业中&…

python -pandas -处理excel合并单元格问题

对于合并的单元格&#xff0c;不进行处理情况下&#xff0c;会默认输出nan问题 解决方法&#xff1a; class A(object):def __init__(self, xlsx_file_path, sheet_index):self.xlsx_file FileDataProcesser.read_excel(xlsx_file_path, sheet_index)self.sheet_data self.…

堆-----数据结构

引言 什么是堆&#xff1f;堆是一种特殊的数据结构&#xff08;用数组表示的树&#xff09;。 为什么要使用到堆&#xff1f;比如一场比赛&#xff0c;如果使用擂台赛的方式来决出冠军&#xff08;实力第一&#xff09;&#xff0c;就很难知道实力第二的队伍是什么了。 但是…

Java数字处理类-- Math类--数学运算

在Java中提供了一个执行数学基本运算的Math类,该类包括了常用的数学运算方法和常量&#xff0c;包括【三角函数方法】&#xff0c;【指数函数方法】&#xff0c;【取整函数方法】、【取最大值函数方法】、【取最小值函数方法】、【取平均值函数方法】、【对数函数方法】&#x…