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
英文地址,請注明出處:http://en.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…