CSS实现百分比水柱图

背景

在echarts没发现有可以直接使用的展示百分比的柱形图,只好自己封装一个组件使用

实现思路

一、图形拆解

要实现的组件是一个 可配置的圆柱形液柱图组件,常用于展示比例进度,比如任务完成度、指标达成率等。把图拆成最小单元然后拼接起来,如下表:

功能点描述
1. 显示进度柱高度随 num / target 变化的水柱视觉效果
2. 圆柱外形顶部、底部使用椭圆(border-radius)构造立体感
3. 自定义样式宽高、颜色可配置
4. 百分比显示可选是否显示进度数值
5. 动画过渡数值变化时水柱高度平滑变化

二、结构设计

<div class="lui-column-bg">           <!-- 圆柱容器 --><div class="lui-inner">            <!-- 动态高度水柱 --><div class="lui-inner-text">    <!-- 可选百分比文字 -->{{ validPercentage }}%</div></div>
</div>
  • .lui-column-bg 是整个圆柱容器,带有顶部/底部的圆帽(伪元素 ::before/::after
  • .lui-inner 是内部水柱块,其 height 是根据 num/target 实时计算的
  • .lui-inner-text 是可选显示的百分比数值

三、 计算逻辑

validPercentage() {if (this.target <= 0) return 0;const percent = (this.num / this.target) * 100;return Math.min(Math.round(percent), 100);
}
  • 避免除以 0 的错误
  • 保证水柱最大不超过 100%
  • Math.round 取整更简洁美观(页面不出现小数点)

四、关键样式

1. .lui-column-bg

.lui-column-bg {background-color: #2a4d5e; // 水柱外壳背景色position: relative;border-radius: 50px;overflow: hidden;
}
  • overflow: hidden 确保内部液面圆帽不溢出容器边界
  • 使用 ::before::after 构建顶部与底部的圆帽

2、 .lui-inner

.lui-inner {position: absolute;bottom: 0;transition: height 0.5s ease-in-out;
}
  • bottom: 0 让水面从底部“涨”起来
  • transition 让数值变化动画流畅过渡

3、.lui-inner::before / ::after

  • ::before 是水柱顶部的圆形高光

  • ::after 是底部的白色圆边,用来模拟“液面”

4、.lui-inner-text

.lui-inner-text {color: white;font-size: 14px;font-weight: bold;position: relative;z-index: 2;
}

显示中间百分比文字,保持在水柱内层上方,不被遮挡

五、可配置参数说明

参数类型说明
numNumber当前数值
targetNumber目标数值
widthNumber圆柱宽度(单位:px)
heightNumber圆柱高度
innerColorString水柱颜色
topColorString圆柱顶部颜色(备用)
bottomColorString圆柱底部颜色(备用)
showPercentBoolean是否显示百分比文字

完整代码

<template><divclass="lui-column-bg":style="{ width: width + 'px', height: height + 'px' }"><divclass="lui-inner":style="{height: validPercentage + '%',backgroundImage: `linear-gradient(to top, ${innerColor}, ${innerColor})`}"><div class="lui-inner-text" v-if="showPercent">{{ validPercentage }}%</div></div></div>
</template><script>
export default {name: 'LiquidColumn',props: {num: { type: Number, default: 0 },target: { type: Number, default: 0 },width: { type: Number, default: 100 },height: { type: Number, default: 190 },innerColor: { type: String, default: '#28b0bd' },topColor: { type: String, default: '#54d8de' },bottomColor: { type: String, default: '#54d8de' },showPercent: { type: Boolean, default: true },},computed: {validPercentage() {if (this.target <= 0) return 0;const percent = ((this.num / this.target) * 100).toFixed(2);return Math.min(Math.round(percent), 100); // 取整,防止超过 100%},},
};
</script><style lang="scss" scoped>
.lui-column-bg {position: relative;width: 100px;height: 190px;margin: 30px auto;background-color: transparent;background-color: #2a4d5e;
}
.lui-column-bg:before {position: absolute;content: "";display: block;height: 20px;width: 100%;border-radius: 50%;top: -10.5px;z-index: 1;background-color: rgb(101 221 197);
}.lui-column-bg:after {position: absolute;content: "";display: block;height: 15px;width: 100%;border-radius: 50%;bottom: -10px;background-color: #54d8de;
}.lui-inner {position: absolute;bottom: 0;width: 100%;height: 50%;background-image: linear-gradient(to top, #28b0bd, #28b0bd);text-align: center;
}
.lui-inner::before {position: absolute;content: "";display: block;height: 20px;width: 100%;background-color: #54d8de;border-radius: 50%;top: -10.5px;z-index: 1;
}
.lui-inner:after {position: absolute;content: "";display: block;height: 15px;width: 100%;border-radius: 50%;background-color: white;bottom: -10px;
}
.lui-inner-text {color: white;position: absolute;top: 10px;width: 100%;font-size: 18px;font-weight: bold;
}
</style>

使用实例

1、引入组件

import LiquidColumn from "../components/LiquidColumn";

2、注册组件

<script>
export default {components: { LiquidColumn },}
</script>

3、调用组件

<!-- 具体参数自行添加 -->
<liquid-column :num="50" :target="100" :showPercent="false"/>

实现效果

请添加图片描述 请添加图片描述 请添加图片描述

总结

组件相对简单,还可以从水面波动动画、颜色渐变、点击事件等方面去优化。

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

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

相关文章

详解 rzsz 工具:Windows 与 Linux 文件传输

&#xff08;Linux之软件包管理器&#xff08;CentOS系统&#xff09; —— yum-CSDN博客&#xff09;rzsz工具之前我在这篇文章中介绍过&#xff0c;现在重新详细介绍一下该工具。rzsz 是一个用于在 Windows 和 Linux 系统之间传输文件的工具集&#xff0c;通常通过终端模拟器…

网络编程1(UDP)

网络编程套接字&#xff08;socket api&#xff09; 了解了网络的一些概念&#xff0c;接下来就要进行网络中的跨主机通信&#xff0c;了解网络中的一些API&#xff0c;这里谈到的API都是针对传输层进行的&#xff0c;这是因为我们编写的代码是在应用层&#xff0c;而传输层就…

【电机】定点线性映射

这是一个定点数线性映射的问题&#xff0c;通常用于将浮点型的物理量&#xff08;如速度、位置、扭矩&#xff09;转换为嵌入式系统中使用的整型数据格式&#xff0c;便于通过 CAN 总线或其它通信协议发送给电机控制器。 我们来逐步解析这个过程&#xff0c;并以“速度”为例说…

Spring Cloud 微服务(远程调用与熔断机制深度解析)

&#x1f4cc; 摘要 在微服务架构中&#xff0c;服务之间的远程调用是构建分布式系统的核心环节。然而&#xff0c;随着服务数量的增加和网络复杂度的提升&#xff0c;调用失败、延迟高、异常等问题变得越来越频繁。 为此&#xff0c;Spring Cloud 提供了强大的远程调用组件 …

electron-vite 抽离config.js

1、将config.js 放到resources下的config目录下 module.exports {url: http://192.168.1.17:8000,wsUrl: ws://192.168.1.17:8000, }2、在preload.js 暴露读取API src/preload/index.js(或你的preload入口) const fs require(fs); const path require(path);function getCo…

MySQL Undo Log 深度解析:事务回滚与MVCC的核心功臣

引言 作为MySQL的“数据后悔药”和“历史版本档案馆”&#xff0c;Undo Log&#xff08;回滚日志&#xff09;在事务处理和并发控制中扮演着至关重要的角色。今天咱们就从底层原理出发&#xff0c;结合实际场景&#xff0c;把Undo Log的“里里外外”说个明白&#xff01; 一、…

gin如何返回html

✅ 方法一&#xff1a;直接返回 HTML 字符串 这种方式适合简单场景&#xff0c;比如返回一段固定的 HTML 内容。 package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/html", func(c *gin.Context) {htmlContent : <…

Insulation score算法解读

Insulation score&#xff08;IS&#xff09;&#xff0c;俗称绝缘分数&#xff0c;用于计算识别三维基因组中的拓扑关联结构域TAD。 首次提出是在&#xff1a; 1&#xff0c;概念 为染色体上的基因组区间分配‘绝缘评分’的方法。该评分用于衡量跨越每个区间的所有相互作用的…

电脑系统重装有什么用?

一、解决系统软件问题 1、修复系统崩溃与错误 系统出现频繁蓝屏、死机、启动失败或程序运行异常&#xff08;如驱动冲突、系统文件损坏&#xff09; 2、清除恶意软件与病毒 电脑中病毒或恶意软件难以通过杀毒软件彻底清除 二、优化系统性能 1、清理冗余文件与设置 长时间…

js随机生成一个颜色

在 JavaScript 中&#xff0c;随机生成颜色有多种方式&#xff0c;以下是最常见的几种实现方法&#xff1a; 方法1&#xff1a;生成随机十六进制颜色&#xff08;如 #FFFFFF&#xff09; 这是最常见的方式&#xff0c;生成格式为 #RRGGBB 的颜色字符串&#xff1a; function…

运维打铁: 服务器防火墙策略配置与管理

文章目录 思维导图一、防火墙基础1. 防火墙概念2. 常见防火墙类型3. 防火墙工作原理 二、策略配置1. 规则制定原则2. 端口与服务开放Linux 系统&#xff08;以 iptables 为例&#xff09;Windows 系统&#xff08;以 Windows 防火墙为例&#xff09; 3. IP 地址过滤允许特定 IP…

locate 命令更新机制详解

文章目录 **一、定时更新的实现载体&#xff1a;crontab 任务****二、定时任务的配置逻辑****三、更新触发的额外机制****四、更新流程的性能优化****五、常见问题与解决方案****总结** 一、定时更新的实现载体&#xff1a;crontab 任务 Linux 系统通常通过 crontab 定时任务 …

docker部署nacos【单机模式使用mysql,使用.env配置】(更新:2025/7/1~)

视频 我的个人视频&#xff0c;有详细步骤 使用docker部署nacos_哔哩哔哩_bilibili 环境 虚拟机&#xff1a;VM&#xff0c;CentOS7 远程连接工具&#xff1a;MobaXterm 使用工具 随机生成字符串&#xff1a; 随机字符串生成器 | 菜鸟工具 Base64编码&#xff1a; B…

如何安全地清除笔式驱动器

您是否正在寻找安全清除笔式驱动器的方法&#xff1f;如果是的话&#xff0c;您可以从本文中得到4个有效的解决方案。无论您准备出售还是捐赠您的笔式驱动器&#xff0c;您都可以轻松清空笔式驱动器。虽然简单的删除似乎就足够了&#xff0c;但残留的数据通常可以恢复。因此&am…

信息新技术

目录 分布式处理基础 一、基础概念 二、通信与网络 三、分布式协调与一致性 四、分布式存储与数据库 五、分布式计算框架 六、容错与高可用 七、负载均衡与调度 八、安全与监控 九、常见分布式系统设计模式 十、典型系统与工具学习 区块链 区块链的核心技术 物联…

创客匠人解析创始人 IP 定位:从专业度到用户心智的占领之道

在知识付费领域&#xff0c;创始人 IP 的定位往往决定了商业变现的天花板。创客匠人通过服务 5 万 知识博主的实践经验&#xff0c;揭示了一个核心逻辑&#xff1a;定位的本质不是简单的标签设定&#xff0c;而是通过持续提升专业度&#xff0c;以实际成果占领用户心智。这一过…

详解Kafka如何保证消息可靠性

Kafka 通过多个环节的精心设计和配置&#xff0c;能够提供高可靠的消息传递保证&#xff0c;最大限度地减少消息丢失的可能性。这需要生产者、Broker 和消费者三方的协同配置才能实现端到端的不丢失。以下是关键机制&#xff1a; 一、核心原则&#xff1a;副本机制 (Replicati…

华为云Flexus+DeepSeek征文 | Word办公软件接入华为云ModelArts Studio大模型,实现AI智能办公

前言 在数字化办公时代&#xff0c;人工智能技术正深刻改变着传统办公软件的使用体验和功能边界。将 Word 办公软件与华为云 ModelArts Studio 大模型进行深度融合&#xff0c;借助 AI 的强大能力实现智能化优化&#xff0c;不仅能大幅提升办公效率&#xff0c;还能为用户带来…

基于开源AI大模型AI智能名片S2B2C商城小程序的流量转化与价值沉淀研究

摘要&#xff1a;在数字化商业生态中&#xff0c;公域流量转化已成为企业竞争的核心战场。本文以开源AI大模型AI智能名片S2B2C商城小程序为研究对象&#xff0c;结合服装、健康食品、快时尚等行业的实践案例&#xff0c;系统分析其通过技术赋能实现精准获客、用户留存与商业闭环…

创客匠人拆解知识变现困局:创始人 IP 打造的底层逻辑与实践路径

在知识付费行业竞争愈发激烈的当下&#xff0c;许多内容创作者面临 “流量增长停滞、变现效率低下” 的困境。创客匠人通过对 5 万 知识博主的服务经验&#xff0c;总结出创始人 IP 打造与知识变现的底层逻辑 —— 其核心在于将 “个人影响力” 转化为 “商业闭环”&#xff0…