亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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)容,更多關于JS模擬Excel數(shù)據(jù)條的資料請關注腳本之家其它相關文章!

相關文章

  • 利用 JavaScript 構(gòu)建命令行應用

    利用 JavaScript 構(gòu)建命令行應用

    這篇文章主要介紹了利用 JavaScript 構(gòu)建命令行應用,下面文章圍繞如何利用JavaScript 構(gòu)建命令行應用的相關資料炸開詳細內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 探索JavaScript未來模式匹配的引入分析

    探索JavaScript未來模式匹配的引入分析

    這篇文章主要來帶大家探索JavaScript的未來,關于模式匹配的引入為編程體驗帶來革命性變化分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • TypeScript新語法之infer?extends示例詳解

    TypeScript新語法之infer?extends示例詳解

    這篇文章主要為大家介紹了TypeScript新語法之infer?extends示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 微信小程序 解決swiper不顯示圖片的方法

    微信小程序 解決swiper不顯示圖片的方法

    這篇文章主要介紹了微信小程序 解決swiper不顯示圖片的方法的相關資料,本文對swiper不顯示圖片,進行了幾種方法排查,根據(jù)我所遇到的問題提供了該如何解決,需要的朋友可以參考下
    2017-01-01
  • 微信小程序 圖片等比例縮放(圖片自適應屏幕)

    微信小程序 圖片等比例縮放(圖片自適應屏幕)

    這篇文章主要介紹了微信小程序 圖片等比例縮放(圖片自適應屏幕)的相關資料,需要的朋友可以參考下
    2016-11-11
  • JavaScript編程中實現(xiàn)對象封裝特性的實例講解

    JavaScript編程中實現(xiàn)對象封裝特性的實例講解

    JavaScript可以在一定程度上以面向?qū)ο蠓绞竭M行編程,而封裝是面向?qū)ο笾械囊粋€重要特性,本文就來分享阮一峰老師對JavaScript編程中實現(xiàn)對象封裝特性的實例講解
    2016-06-06
  • 前端算法題解?leetcode50-Pow(x,?n)

    前端算法題解?leetcode50-Pow(x,?n)

    這篇文章主要為大家介紹了前端算法題解?leetcode50-Pow(x,?n)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 微信小程序 頁面跳轉(zhuǎn)如何實現(xiàn)傳值

    微信小程序 頁面跳轉(zhuǎn)如何實現(xiàn)傳值

    這篇文章主要介紹了微信小程序 頁面跳轉(zhuǎn)如何實現(xiàn)傳值的相關資料,需要的朋友可以參考下
    2017-04-04
  • 微信小程序 教程之WXSS

    微信小程序 教程之WXSS

    這篇文章主要介紹了微信小程序 WXSS的相關資料,并附簡單實例代碼,需要的朋友可以參考下
    2016-10-10
  • JS 基本概念詳細介紹

    JS 基本概念詳細介紹

    這篇文章主要介紹JS 基本概念,對于初學者來說,Javascript 乍一看似乎很容易,因為它的類似于 C 的語法,但不管它的運行方式如何,對語言 (ESNext) 及其框架所做的不斷變化可能會讓初學者不知所措。下面我們就來看JS 初學者怎么入門吧
    2021-10-10

最新評論