最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS前端模擬Excel條件格式實現(xiàn)數(shù)據(jù)條效果

 更新時間:2023年02月28日 15:00:15   作者:旋渦  
這篇文章主要為大家介紹了JS前端模擬Excel條件格式實現(xiàn)數(shù)據(jù)條效果,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

需求背景

最近業(yè)務中遇到一個有意思的需求,是要在現(xiàn)有的表格中實現(xiàn)類似 Excel 中的數(shù)據(jù)條的效果,在數(shù)據(jù)比較多的時候單純看表格里的數(shù)字會比較密集且不容易對比,加上數(shù)據(jù)條之后就比較明顯的看出數(shù)據(jù)的對比情況,也讓表格看起來生動了一些,這算是融合了表格和柱狀圖的優(yōu)點。

先來看下 Excel 的效果

下面記錄下實現(xiàn)過程和原理。

需求分析

通過圖片可以看出共有幾種情況:

  • 只有正值:數(shù)據(jù)條全部向右
  • 只有負值:數(shù)據(jù)條全部向左
  • 正負值都有:正負值會以一個軸線做分割分布在左右兩側(cè),根據(jù)正負值的多少軸線的位置也會相應的偏左或偏右

實現(xiàn)邏輯

實現(xiàn)這個效果的前提,我們要知道每列數(shù)據(jù)的最大值max和最小值min,最大值的數(shù)據(jù)條寬度就是100%,下面先用偽代碼梳理下邏輯。

全是正值和全是負值的情況,這種情況就比較簡單了,就是計算單元格的值占最大值的比例,計算公式是這樣:數(shù)據(jù)條寬度 = (當前值 / max) * 100

正負值都有的情況多了一個“軸線位置“的計算和”數(shù)據(jù)條偏移量“計算

軸線位置 = (Math.abs(min) / (max - min)) * 100
數(shù)據(jù)條寬度 = (Math.abs(當前值) / (max - min)) * 100
// 當前值 < 0 時數(shù)據(jù)條在軸線左邊,改變 right 值
// 數(shù)據(jù)條的總長為100%
right = 100 - 軸線位置
// 當前值 > 0 時數(shù)據(jù)條在軸線右邊,改變 left 值
left = 軸線位置

軸線位置邏輯其實是 "最小值到0的距離在總長度(max-min)之間的占比",我們知道數(shù)字與0之間的距離其實就是絕對值的計算,那么轉(zhuǎn)換為公式來表示就是:

數(shù)據(jù)條的寬度就是 “當前值到0的距離在總長度(max-min)之間的占比”,公式表示:

  • 數(shù)據(jù)條的偏移量,這里需要知道是向左還是向右偏移(最終是通過改變元素CSS的 left、right 屬性來實現(xiàn)偏移)

完整代碼實現(xiàn)

代碼使用 Vue + ElementUI

template 部分

<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">
        <!-- 數(shù)據(jù)條 -->
        <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 部分

先放 style 部分是為了讓大家對基礎樣式有個感受,渲染函數(shù)中主要就是動態(tài)修改元素的 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數(shù)據(jù)過程,忽略 ...
      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)
        // 數(shù)據(jù)條寬度
        const width = ((Math.abs(cellVal / range) * 100)).toFixed(2)
        style = cellVal > 0 ? {
          width: `${width}%`,
          left: `${leftOffset.toFixed(2)}%`
        } : {
          width: `${width}%`,
          background: '#F56C6C', // 負值進行顏色區(qū)分
          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>

最終實現(xiàn)效果

以上就是JS前端模擬Excel條件格式實現(xiàn)數(shù)據(jù)條效果的詳細內(nèi)容,更多關(guān)于JS模擬Excel數(shù)據(jù)條的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 學習筆記編寫vue的第一個程序

    學習筆記編寫vue的第一個程序

    這篇文章主要介紹了學習筆記vue的第一個程序,其中非常詳細的為大家講解了vue程序的創(chuàng)建步驟,有需要的朋友可以學習下,希望可以有所幫助
    2021-08-08
  • 在web?worker中使用fetch實例詳解

    在web?worker中使用fetch實例詳解

    這篇文章主要為大家介紹了在web?worker中使用fetch實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 前端通過JavaScript創(chuàng)建修改CAD圖形詳情

    前端通過JavaScript創(chuàng)建修改CAD圖形詳情

    這篇文章介紹JavaScript創(chuàng)建修改CAD圖形,創(chuàng)建修改CAD圖形,一般是基于AutoCAD進行二次開發(fā),ObjectARX是AutoDesk公司針對AutoCAD平臺上的二次開發(fā)而推出的一個開發(fā)軟件包,它提供了以C++為基礎的面向?qū)ο蟮拈_發(fā)環(huán)境及應用程序接口,能真正快速的訪問AutoCAD圖形數(shù)據(jù)庫
    2021-10-10
  • javascript 動態(tài)添加表格行

    javascript 動態(tài)添加表格行

    javascript 動態(tài)添加表格行...
    2006-06-06
  • 2023年了該了解下WebComponent使用教程

    2023年了該了解下WebComponent使用教程

    這篇文章主要為大家介紹了2023年了該了解下WebComponent使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 微信小程序 常見問題總結(jié)(4058,40013)及解決辦法

    微信小程序 常見問題總結(jié)(4058,40013)及解決辦法

    這篇文章主要介紹了微信小程序 常見問題總結(jié)及解決辦法的相關(guān)資料,這里首先對微信小程序的結(jié)構(gòu)進行了介紹,然后對常見問題進行說明講解,需要的朋友可以參考下
    2017-01-01
  • JS輕量級函數(shù)式編程實現(xiàn)XDM三

    JS輕量級函數(shù)式編程實現(xiàn)XDM三

    這篇文章主要為大家介紹了JS輕量級函數(shù)式編程實現(xiàn)XDM示例詳解第3/3篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • window屬性onbeforeunload語法教程示例

    window屬性onbeforeunload語法教程示例

    這篇文章主要為大家介紹了window屬性onbeforeunload語法教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • JS 里為什么會有 this

    JS 里為什么會有 this

    這篇文章主要介紹了JS 里為什么會有 this,文章主要從語言創(chuàng)造者(JS 之父的角度)來思考 this,我之前那篇講 this 的文章是從使用者的角度寫的,需要的朋友可以參考一下
    2021-10-10
  • JavaScript節(jié)點的增刪改查深入學習

    JavaScript節(jié)點的增刪改查深入學習

    這篇文章主要為大家介紹了JavaScript節(jié)點的增刪改查深入學習示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論

苏州市| 新宾| 定远县| 保靖县| 彰化县| 民勤县| 化德县| 左云县| 常熟市| 鄂托克旗| 澄迈县| 洛隆县| 乌什县| 常宁市| 会同县| 澜沧| 定州市| 柏乡县| 萝北县| 平顶山市| 芦山县| 杭锦后旗| 琼海市| 虞城县| 安泽县| 当阳市| 南城县| 建阳市| 那曲县| 武城县| 黔东| 屏山县| 新沂市| 海口市| 中阳县| 布尔津县| 乐都县| 德惠市| 枣阳市| 神木县| 刚察县|