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

React+CSS 实现绘制竖状柱状图

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

React+CSS 实现绘制竖状柱状图

前言:

页面结构分为两个部分,柱状图 + 文字为一部分,标注为为一部分。

先来看柱状图 + 文字这一部分。

宽度定为 width: 55height 高度使用百分比进行动态变化。整个部分使用 flex 布局。通过 justify-content: space-around; 属性,对里面的项目进行排列。项目 item 同样使用 flex 布局,这个是对 柱状图 + 文字 进行整体的排列。

<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>
              选项三 <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;
        }
      }
    }
  }
}

下方的标注部分,使用绝对定位,width = 100%,height = 100%,实现标注和渐变柱形部分的重叠。

这部分将 li 标签的 width = 100%,间隔通过 top 来动态实现。

<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;
      }
    }
  }
}

关于数值的计算,这里笔者是找到这一组数据里面的最大值

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

获取最大值最近的100整数

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

计算每一个数据的 value,占最大值最近的100整数的百分比。

percent: (dataItem.value / maxScaleNum) * 100

标注的top,使用 for 循环生成。

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>
                    选项三 <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'));

运行结果:

到此这篇关于React+CSS 实现绘制竖状柱状图的文章就介绍到这了,更多相关React 柱状图内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

React+CSS 实现绘制竖状柱状图

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

下载Word文档

猜你喜欢

PyQt5+QtChart实现柱状图的绘制

QChart是一个QGraphicScene中可以显示的QGraphicsWidget。本文将利用QtChart实现柱状图的绘制,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-12-15

Python实现动态柱状图的绘制

这篇文章主要为大家详细介绍了Python实现动态柱状图的绘制的相关资料,文中的示例代码讲解详细,具有一定的学习与借鉴价值,需要的可以参考一下
2022-12-29

C#如何绘制饼状图和柱状图

这篇文章主要介绍C#如何绘制饼状图和柱状图,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下#代码如下:using System;using System.Collections;using System.C
2023-06-29

matplotlib怎么绘制柱状图

要使用matplotlib绘制柱状图,可以使用`matplotlib.pyplot`模块中的`bar()`函数。以下是一个简单的示例代码:```pythonimport matplotlib.pyplot as plt# 数据x = [1,
2023-09-20

Python怎么绘制Matplotlib柱状图

这篇文章主要讲解了“Python怎么绘制Matplotlib柱状图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python怎么绘制Matplotlib柱状图”吧!前言:柱状图是一种使用矩形
2023-06-30

D3.js实现绘制柱状图的教程详解

这篇文章主要为大家详细介绍了如何通过D3.js实现绘制柱状图,文中的示例代码讲解详细,对我们学习D3.js有一定的帮助,需要的可以参考一下
2022-11-13

基于Echarts如何实现绘制立体柱状图

本篇内容主要讲解“基于Echarts如何实现绘制立体柱状图”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Echarts如何实现绘制立体柱状图”吧!实现方法先写一个常规的柱状图在这个基础上进行
2023-07-05

Matlab实现极坐标堆叠柱状图的绘制

极坐标堆叠图也是风玫瑰图的常用形式,MATLAB的bar绘制的条形图可以绘制成堆叠形式,但是并没有一个自带函数可以绘制极坐标堆叠图。本文将为大家提供Matlab绘制极坐标堆叠柱状图的示例代码,需要的可以参考一下
2022-11-13

编程热搜

目录