我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS前端怎么模拟Excel条件格式实现数据条效果

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS前端怎么模拟Excel条件格式实现数据条效果

这篇文章主要介绍“JS前端怎么模拟Excel条件格式实现数据条效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS前端怎么模拟Excel条件格式实现数据条效果”文章能帮助大家解决问题。

需求背景

最近业务中遇到一个有意思的需求,是要在现有的表格中实现类似 Excel 中的数据条的效果,在数据比较多的时候单纯看表格里的数字会比较密集且不容易对比,加上数据条之后就比较明显的看出数据的对比情况,也让表格看起来生动了一些,这算是融合了表格和柱状图的优点。

先来看下 Excel 的效果

JS前端怎么模拟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)之间的占比”,公式表示:

  • 数据条的偏移量,这里需要知道是向左还是向右偏移(最终是通过改变元素CSS的 left、right 属性来实现偏移)

完整代码实现

代码使用 Vue + ElementUI

template 部分

<template>  <el-table :data="tableData" border >    <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" :></div>        <!-- 轴线 -->        <div class="data-bar-axis" :></div>        <!-- 当前值 -->        <span class="cell-value">{{ scope.row[item.prop] }}</span>      </template>    </el-table-column>  </el-table></template>

style 部分

先放 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 部分

<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条件格式实现数据条效果”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS前端怎么模拟Excel条件格式实现数据条效果

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS前端模拟Excel条件格式实现数据条效果

这篇文章主要为大家介绍了JS前端模拟Excel条件格式实现数据条效果,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-28

JS前端怎么模拟Excel条件格式实现数据条效果

这篇文章主要介绍“JS前端怎么模拟Excel条件格式实现数据条效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JS前端怎么模拟Excel条件格式实现数据条效果”文章能帮助大家解决问题。需求背景最近
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录