<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近業務中遇到一個有意思的需求,是要在現有的表格中實現類似 Excel 中的資料條的效果,在資料比較多的時候單純看錶格里的數位會比較密集且不容易對比,加上資料條之後就比較明顯的看出資料的對比情況,也讓表格看起來生動了一些,這算是融合了表格和柱狀圖的優點。
先來看下 Excel 的效果
下面記錄下實現過程和原理。
通過圖片可以看出共有幾種情況:
實現這個效果的前提,我們要知道每列資料的最大值max和最小值min,最大值的資料條寬度就是100%,下面先用虛擬碼梳理下邏輯。
全是正值和全是負值的情況,這種情況就比較簡單了,就是計算單元格的值佔最大值的比例,計算公式是這樣:資料條寬度 = (當前值 / max) * 100
正負值都有的情況多了一個“軸線位置“的計算和”資料條偏移量“計算
軸線位置 = (Math.abs(min) / (max - min)) * 100
資料條寬度 = (Math.abs(當前值) / (max - min)) * 100
// 當前值 < 0 時資料條在軸線左邊,改變 right 值 // 資料條的總長為100% right = 100 - 軸線位置 // 當前值 > 0 時資料條在軸線右邊,改變 left 值 left = 軸線位置
軸線位置邏輯其實是 "最小值到0的距離在總長度(max-min)之間的佔比",我們知道數位與0之間的距離其實就是絕對值的計算,那麼轉換為公式來表示就是:
資料條的寬度就是 “當前值到0的距離在總長度(max-min)之間的佔比”,公式表示:
程式碼使用 Vue + ElementUI
<template> <el-table :data="tableData" border style="width: 100%"> <el-table-column v-for="item in columns" sortable :key="item.prop" :prop="item.prop" :label="item.label" > <template slot-scope="scope"> <!-- 資料條 --> <div class="data-bar" :style="renderDataBar(item, scope.row)"></div> <!-- 軸線 --> <div class="data-bar-axis" :style="renderAxis(item, scope.row)"></div> <!-- 當前值 --> <span class="cell-value">{{ scope.row[item.prop] }}</span> </template> </el-table-column> </el-table> </template>
先放 style 部分是為了讓大家對基礎樣式有個感受,渲染函數中主要就是動態修改元素的 width、left、right 的值
<style> .el-table .cell-value { position: relative; } .data-bar { position: absolute; top: 0; bottom: 0; margin: 5px auto; transition: width 0.2s; } .data-bar-axis { position: absolute; top: -1px; bottom: 0; border-right: 1px dashed #303133; } </style>
<script> export default { data() { return { columns: [ { prop: 'positive', label: '正值', min: 1, max: 10 }, { prop: 'negative', label: '負值', min: -1, max: -12 }, { prop: 'mixed', label: '正負值', min: -6, max: 5 } ], tableData: [] } }, created() { this.initData() }, methods: { initData() { // mock資料過程,忽略 ... this.tableData.push({...}) }, renderDataBar(column, row) { const { min, max, prop } = column // 當前單元格值 const cellVal = row[prop] if (cellVal === 0) return { display: 'none' }; let style = { width: '0', background: '#409eff' } // 全是正值 或 全是負值 if (min >= 0 || max <= 0) { const width = ((cellVal / max) * 100).toFixed(2); style.width = `${width}%` style = min >= 0 ? { ...style, left: '0' } : { ...style, right: '0' } } // 正負值都有 if (min < 0 && max > 0) { const range = max - min; // 軸線位置 const leftOffset = Math.abs((min / range) * 100) // 資料條寬度 const width = ((Math.abs(cellVal / range) * 100)).toFixed(2) style = cellVal > 0 ? { width: `${width}%`, left: `${leftOffset.toFixed(2)}%` } : { width: `${width}%`, background: '#F56C6C', // 負值進行顏色區分 right: `${(100 - leftOffset).toFixed(2)}%` } } return style; }, renderAxis(column) { const { min, max } = column if (min < 0 && max > 0) { // 正負值都有的情況下,顯示軸線 const range = max - min; const leftOffset = (((0 - min) / range) * 100).toFixed(2) return { left: `${leftOffset}%` } } else { return { display: 'none' } } } } } </script>
以上就是JS前端模擬Excel條件格式實現資料條效果的詳細內容,更多關於JS模擬Excel資料條的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45