欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React+CSS?實(shí)現(xiàn)繪制豎狀柱狀圖

 更新時(shí)間:2022年09月13日 10:31:12   作者:鹿魚(yú)  
這篇文章主要介紹了React+CSS?實(shí)現(xiàn)繪制豎狀柱狀圖,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹。具有一定的參考價(jià)值,需要的朋友可以參考一下

前言:

頁(yè)面結(jié)構(gòu)分為兩個(gè)部分,柱狀圖 + 文字為一部分,標(biāo)注為為一部分。

先來(lái)看柱狀圖 + 文字這一部分。

寬度定為 width: 55height 高度使用百分比進(jìn)行動(dòng)態(tài)變化。整個(gè)部分使用 flex 布局。通過(guò) justify-content: space-around; 屬性,對(duì)里面的項(xiàng)目進(jìn)行排列。項(xiàng)目 item 同樣使用 flex 布局,這個(gè)是對(duì) 柱狀圖 + 文字 進(jìn)行整體的排列。

<div className="crosswise_diagram_top">
  {listData.map((item) => {
    return (
      <div className="crosswise_diagram_item" key={item.value}>
        <div className="crosswise_diagram_item_precent">
          <div
            className="precent"
            style={{
              width: 55,
              height: `${item.percent}%`
            }}
          >
            <div>
              選項(xiàng)三 <span>254</span>
            </div>
          </div>
        </div>
        <div className="crosswise_diagram_item_name">{item.name}</div>
      </div>
    )
  })}
</div>
.crosswise_diagram_top {
  display: flex;
  justify-content: space-around;
  height: 100%;
  .crosswise_diagram_item {
    display: flex;
    flex-direction: column;
    width: 55px;
    position: relative;
    justify-content: end;
    height: 100%;
    .crosswise_diagram_item_name {
      margin-top: 11px;
      font-size: 16px;
      font-weight: 400;
      color: #07132b;
    }
    .crosswise_diagram_item_precent {
      height: 100%;
      display: contents;
      .precent {
        border-radius: 4px;
        position: relative;
        &::after {
          content: '';
          height: 102%;
          border-right: 1px dashed #07132b;
          position: absolute;
          top: -2%;
        }
        > div {
          position: absolute;
          width: 66px;
          text-align: center;
          top: -2%;
          height: 21px;
          margin-top: -21px;
        }
      }
    }
  }
}

下方的標(biāo)注部分,使用絕對(duì)定位,width = 100%,height = 100%,實(shí)現(xiàn)標(biāo)注和漸變柱形部分的重疊。

這部分將 li 標(biāo)簽的 width = 100%,間隔通過(guò) top 來(lái)動(dòng)態(tài)實(shí)現(xiàn)。

<div className="crosswise_diagram_bottom">
  <ul className="crosswise_diagram_ul">
    {scaleArray.map((item, itemIndex) => {
      return (
        <li
          className="crosswise_diagram_li"
          style={{ top: `${(100 / 5) * itemIndex}%` }}
          key={item}
        >
          <span className="crosswise_diagram_name">{item}</span>
          <span className="crosswise_diagram_precent" />
        </li>
      )
    })}
  </ul>
</div>
.crosswise_diagram_bottom {
  position: absolute;
  top: -36px;
  left: -55px;
  height: 100%;
  width: 100%;
  .crosswise_diagram_ul {
    width: 100%;
    .crosswise_diagram_li {
      width: 100%;
      position: absolute;
      display: flex;
      flex-direction: row;
      .crosswise_diagram_name {
        position: relative;
        top: -9px;
        width: 45px;
        font-size: 12px;
        font-weight: bold;
        color: #a6b1bf;
      }
      .crosswise_diagram_precent {
        width: 90%;
        height: 100%;
        border-top: 1px dashed #d7dbe0;
        color: #a6b1bf;
      }
    }
  }
}

關(guān)于數(shù)值的計(jì)算,這里筆者是找到這一組數(shù)據(jù)里面的最大值

let maxValue = 0;
data.forEach((dataItem) => {
  if (dataItem.value > maxValue) maxValue = dataItem.value;
});

獲取最大值最近的100整數(shù)

let maxScaleNum = Math.ceil(maxValue / 100) * 100

計(jì)算每一個(gè)數(shù)據(jù)的 value,占最大值最近的100整數(shù)的百分比。

percent: (dataItem.value / maxScaleNum) * 100

標(biāo)注的top,使用 for 循環(huán)生成。

const multiple = Math.floor(maxScaleNum / scaleNum)
const newArray = new Array()
for (let i = 0; i <= maxScaleNum; i += multiple) {
  newArray.push(i)
}
setScaleArray(newArray.reverse())

 整體代碼:

import React, { useState, useEffect } from 'react';
import ReactDom from 'react-dom';

const Test = ({ data, scaleNum = 5 }) => {
  const [listData, setListData] = useState(
    []
  )
  const [scaleArray, setScaleArray] = useState([])
  useEffect(() => {
    if (scaleNum <= 0) {
      return
    }
    let maxValue = 0
    data.forEach((dataItem) => {
      if (dataItem.value > maxValue) maxValue = dataItem.value
    })
    let maxScaleNum = Math.ceil(maxValue / 100) * 100
    if (maxValue <= 0) {
      setScaleArray(new Array(scaleNum).fill(0))
      setListData(
        data.map((dataItem) => {
          return {
            name: dataItem.name,
            percent: 0,
            value: 0
          }
        })
      )
      return
    }

    setListData(
      data.map((dataItem) => {
        return {
          name: dataItem.name,
          percent: (dataItem.value / maxScaleNum) * 100,
          value: dataItem.value
        }
      })
    )
    const multiple = Math.floor(maxScaleNum / scaleNum)
    const newArray = new Array()
    for (let i = 0; i <= maxScaleNum; i += multiple) {
      newArray.push(i)
    }
    setScaleArray(newArray.reverse())
  }, [data, scaleNum])

  return (
    <section className="crosswise_diagram">
      <div className="crosswise_diagram_top">
        {listData.map((item) => {
          return (
            <div className="crosswise_diagram_item" key={item.value}>
              <div className="crosswise_diagram_item_precent">
                <div
                  className="precent"
                  style={{
                    width: 55,
                    height: `${item.percent}%`
                  }}
                >
                  <div>
                    選項(xiàng)三 <span>254</span>
                  </div>
                </div>
              </div>
              <div className="crosswise_diagram_item_name">{item.name}</div>
            </div>
          )
        })}
      </div>
      <div className="crosswise_diagram_bottom">
        <ul className="crosswise_diagram_ul">
          {scaleArray.map((item, itemIndex) => {
            return (
              <li
                className="crosswise_diagram_li"
                style={{ top: `${(100 / 5) * itemIndex}%` }}
                key={item}
              >
                <span className="crosswise_diagram_name">{item}</span>
                <span className="crosswise_diagram_precent" />
              </li>
            )
          })}
        </ul>
      </div>
    </section>
  )
}
ReactDom.render(<Test style={{ width: 440 }}
          scaleNum={6}
          data={[
            {
              name: '西瓜',
              value: 40
            },
            {
              name: '菠蘿',
              value: 56
            },
            {
              name: '香蕉',
              value: 47
            }
          ]} />, document.getElementById('app'));

運(yùn)行結(jié)果:

到此這篇關(guān)于React+CSS 實(shí)現(xiàn)繪制豎狀柱狀圖的文章就介紹到這了,更多相關(guān)React 柱狀圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React新文檔切記不要濫用effect

    React新文檔切記不要濫用effect

    這篇文章主要為大家介紹了React新文檔濫用effect出現(xiàn)的問(wèn)題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React代碼分割的實(shí)現(xiàn)方法介紹

    React代碼分割的實(shí)現(xiàn)方法介紹

    雖然一直有做react相關(guān)的優(yōu)化,按需加載、dll 分離、服務(wù)端渲染,但是從來(lái)沒(méi)有從路由代碼分割這一塊入手過(guò),所以下面這篇文章主要給大家介紹了關(guān)于React中代碼分割的方式,需要的朋友可以參考下
    2022-12-12
  • react-native?父函數(shù)組件調(diào)用類(lèi)子組件的方法(實(shí)例詳解)

    react-native?父函數(shù)組件調(diào)用類(lèi)子組件的方法(實(shí)例詳解)

    這篇文章主要介紹了react-native?父函數(shù)組件調(diào)用類(lèi)子組件的方法,通過(guò)詳細(xì)步驟介紹了React 函數(shù)式組件之父組件調(diào)用子組件的方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 關(guān)于React Native 無(wú)法鏈接模擬器的問(wèn)題

    關(guān)于React Native 無(wú)法鏈接模擬器的問(wèn)題

    許多朋友遇到React Native 無(wú)法鏈接模擬器的問(wèn)題,怎么解決呢,本文給大家分享完整簡(jiǎn)便解決方法及配置例題,對(duì)React Native 鏈接模擬器相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-06-06
  • React render核心階段深入探究穿插scheduler與reconciler

    React render核心階段深入探究穿插scheduler與reconciler

    這篇文章主要介紹了React render核心階段穿插scheduler與reconciler,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • React學(xué)習(xí)筆記之列表渲染示例詳解

    React學(xué)習(xí)筆記之列表渲染示例詳解

    最近在學(xué)習(xí)React,學(xué)習(xí)到了列表渲染這一塊,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來(lái)總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于React學(xué)習(xí)筆記之列表渲染的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-08-08
  • React Agent 自定義實(shí)現(xiàn)代碼

    React Agent 自定義實(shí)現(xiàn)代碼

    在使用langchain的ReactAgent遇到問(wèn)題后,作者嘗試自定義ReactAgent實(shí)現(xiàn),通過(guò)詳細(xì)分析langchain中的agent功能和問(wèn)題,結(jié)合React思想,作者設(shè)計(jì)了新的agent邏輯并在GitHub上分享了代碼,新的ReactAgent通過(guò)改進(jìn)prompt和工具調(diào)用邏輯,提升了任務(wù)執(zhí)行的效果和穩(wěn)定性
    2024-10-10
  • react同構(gòu)實(shí)踐之實(shí)現(xiàn)自己的同構(gòu)模板

    react同構(gòu)實(shí)踐之實(shí)現(xiàn)自己的同構(gòu)模板

    這篇文章主要介紹了react同構(gòu)實(shí)踐之實(shí)現(xiàn)自己的同構(gòu)模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 詳解webpack2+React 實(shí)例demo

    詳解webpack2+React 實(shí)例demo

    本篇文章主要介紹了詳解webpack2+React 實(shí)例demo,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • 從零開(kāi)始最小實(shí)現(xiàn)react服務(wù)器渲染詳解

    從零開(kāi)始最小實(shí)現(xiàn)react服務(wù)器渲染詳解

    這篇文章主要介紹了從零開(kāi)始最小實(shí)現(xiàn)react服務(wù)器渲染詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論