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

JS模擬實現Excel條件格式中的色階效果

 更新時間:2023年05月22日 16:59:12   作者:旋渦  
這篇文章主要為大家詳細介紹了如何利用JavaScript模擬實現Excel條件格式中的色階效果,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下

本篇文章是模擬Excel條件格式第二篇“色階”的實現原理,上篇《前端模擬 Excel 條件格式—數據條效果實現

需求背景

公司做的數據分析系統中想要將Excel中的條件格式功能搬過來。原因:純表格中的數據展示只有字符沒有樣式,比較難發(fā)現更多維度的信息,當有了色階效果后分析人員可以更容易在數據中發(fā)現更多信息如:是否波動劇烈、是否呈聚合趨勢、是否有規(guī)律等。

先看Excel的標準效果:

下面我們試著分析如何實現這樣的效果。

需求分析

按列展示、要根據單元格的值自動計算出對應的色階值,將對應的顏色填充到單元格中。 按此分析可以肯定的是這不是一個簡單的CSS漸變可以實現的,這里會涉及到對色值之間的色階計算、單元格需要進行計算來動態(tài)生成樣式。

實現邏輯

與上一篇數據條的實現有個相同的前提,我們要知道每列數據的最大值max最小值min,以及計算當前值在最大最小值中的位置。

先來實現一個獲取色階顏色值的方法,關于色階的計算使用到的是線性插值的方式,有一個標準的公式,下面是 ChatGPT 回答:

實現代碼: 用到了一個顏色轉換庫:Color

getColor(value, min, max, colors) {
  if (value < min) return colors[0]
  if (value > max) return colors[colors.length - 1]
  // 將 hex 顏色值轉換為 rgb 格式
  colors = colors.map(c => Color(c).object())
  const colorsLen = colors.length;
  // 計算當前值在最大最小值中的位置
  const rang = max - min;
  let weight = (value - min) / rang;
  // 計算顏色列表的最后一個索引值
  const endIndex = Math.max(Math.ceil((colorsLen - 1) * weight), 1);
  // 獲取兩個顏色最小顏色(起始色)、最大顏色(結束色)
  const minColor = colors[endIndex - 1]
  const maxColor = colors[endIndex]
  // 計算色階比例
  weight = weight * (colorsLen - 1) - (endIndex - 1)
  // 線性插值公式
  const r = (1 - weight) * minColor.r + weight * maxColor.r
  const g = (1 - weight) * minColor.g + weight * maxColor.g
  const b = (1 - weight) * minColor.b + weight * maxColor.b
  return `rgb(${r},${g},$)`
}

完整代碼

代碼使用 Vue + ElementUI

template 部分

<template>
  <el-table
    :data="tableData"
    border
    stripe
    style="width: 80%"
    :cell-style="cellStyle"
  >
    <el-table-column
      v-for="item in columns"
      sortable
      :key="item.prop"
      :prop="item.prop"
      :label="item.label"
    >
      <template slot-scope="scope">
        <span class="cell-value">{{ scope.row[item.prop] }}</span>
      </template>
    </el-table-column>
  </el-table>
</template>

script 部分

import Color from 'color';
import { tableColumns, tableData } from './mock-data.js';
export default {
  name: 'color-scale',
  data() {
    return {
      // 數據mock部分放在下方
      columns: tableColumns,
      tableData: tableData(),
      // 紅黃綠
      colors: ['#f8696b', '#ffeb84', '#63be7b'],
      // 綠黃紅
      colors2: ['#63be7b', '#ffeb84', '#f8696b']
    }
  },
  methods: {
    getColor(value, min, max, colors) {
      // 同上... 
    },
    cellStyle({ row, column }) {
      const { property } = column;
      if (property !== 'car') {
        const obj = this.columns.find(item => item.prop === property);
        const min = obj.min;
        const max = obj.max;
        const cellVal = row[property]
        const colors = property === 'order' ? this.colors2 : this.colors
        return {
          background: this.getColor(cellVal, min, max, colors)
        }
      }
      return {}
    }
  }
}

mock 數據

不重要,感興趣可以參考

// mock-data.js
export const tableColumns = [
  {
    prop: 'car',
    label: '車型',
    min: 1,
    max: 20
  },
  {
    prop: 'order',
    label: '訂單量',
    min: 10,
    max: 30
  },
  {
    prop: 'sale',
    label: '銷售額',
    min: 100,
    max: 120
  },
  {
    prop: 'aggregate',
    label: '呈聚合狀',
    min: 10,
    max: 104
  },
  {
    prop: 'uneven',
    label: '隨機數據',
    min: 50,
    max: 5000
  }
];
export const tableData = function () {
  const aggregateNums = [10, 20, 30, 40, 50, 60, 70, 80, 81, 82, 83, 84, 85, 86, 87, 100, 101, 102, 103, 104];
  return Array.from({ length: 20 }, (_, index) => ({
    car: `車型${index + 1}`,
    order: index + 10,
    sale: index + 100,
    aggregate: aggregateNums[index],
    uneven: getRandomIntInclusive(50, 5000) // 隨機
  }))
}
export const getRandomIntInclusive = (min, max) => {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

最終效果

總結

  • 實現此功能中最重要也是最難的點就是在于色階值的計算、線性插值公式的理解,這一步理解透了其他的就簡單了。
  • 善用 ChatGPT 手動捂臉

以上就是JS模擬實現Excel條件格式中的色階效果的詳細內容,更多關于JS模擬Excel色階的資料請關注腳本之家其它相關文章!

相關文章

  • JavaScript獲取DOM元素的多種方法

    JavaScript獲取DOM元素的多種方法

    DOM是 HTML 和 XML 文檔的編程接口,表現為網頁結構的樹狀對象,每個對象對應頁面的一部分,如 HTML 元素,獲取 DOM 元素是交互式網頁開發(fā)的核心,用于修改內容、樣式或行為,本文給大家介紹了JavaScript獲取DOM元素的多種方法,需要的朋友可以參考下
    2025-03-03
  • JS實現炫酷雪花飄落效果

    JS實現炫酷雪花飄落效果

    這篇文章主要為大家詳細介紹了JS實現炫酷雪花飄落效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 在Js頁面通過POST傳遞參數跳轉到新頁面詳解

    在Js頁面通過POST傳遞參數跳轉到新頁面詳解

    這篇文章主要給大家介紹了關于在Js頁面通過POST傳遞參數跳轉到新頁面的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-08-08
  • 微信小程序實現循環(huán)動畫效果

    微信小程序實現循環(huán)動畫效果

    這篇文章主要介紹了微信小程序循環(huán)動畫效果的實現方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • JavaScript事件委托實例分析

    JavaScript事件委托實例分析

    這篇文章主要介紹了JavaScript事件委托的用法,以實例形式分析了javascript事件委托的實現方法,需要的朋友可以參考下
    2015-05-05
  • Next.js15圖片查看網站之圖片右鍵菜單的兼容優(yōu)化與坑

    Next.js15圖片查看網站之圖片右鍵菜單的兼容優(yōu)化與坑

    Next.js 提供了內置的圖片和字體優(yōu)化功能,旨在提升應用性能和用戶體驗,下面這篇文章主要介紹了Next.js15圖片查看網站之圖片右鍵菜單的兼容優(yōu)化與坑的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-03-03
  • JavaScript?位運算及實際應用實例

    JavaScript?位運算及實際應用實例

    這篇文章主要為大家介紹了JavaScript位運算及實際應用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • JavaScript 保存數組到Cookie的代碼

    JavaScript 保存數組到Cookie的代碼

    大部分的瀏覽器一個網站只支持保存20個Cookie,超過20個Cookie,舊的Cookie會被最新的Cookie代替。那么如果要有超過20個Cookie要保存只能將Cookie存為數組然后保存到Cookie。
    2010-04-04
  • JavaScript實現換膚效果(換背景)

    JavaScript實現換膚效果(換背景)

    這篇文章主要為大家詳細介紹了JavaScript實現換膚效果,即換背景功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • uniapp??微信跳轉至半屏的使用示例

    uniapp??微信跳轉至半屏的使用示例

    這篇文章主要介紹了uniapp??微信跳轉至半屏的使用示例,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-08-08

最新評論

汶川县| 桦甸市| 阿鲁科尔沁旗| 杭州市| 河源市| 额敏县| 大同县| 邯郸市| 长治市| 富蕴县| 囊谦县| 阜宁县| 游戏| 桐城市| 泽州县| 清苑县| 马公市| 德昌县| 冷水江市| 普宁市| 常德市| 闽清县| 英吉沙县| 于田县| 潢川县| 安丘市| 托克逊县| 安化县| 喀喇| 钟祥市| 扎鲁特旗| 永福县| 南召县| 响水县| 类乌齐县| 宁陵县| 仁布县| 阜新市| 黔江区| 中宁县| 保定市|