当前位置:   article > 正文

【基于react的立体柱状图的实现】_react 立体柱状图

react 立体柱状图

基于react实现立体柱状图:

代码如下:

假设需要展示的数据如下

  1. const data = [
  2. {
  3. a: [1, 2, 3],
  4. b: [1, 1],
  5. c: [1, 2]
  6. },
  7. {
  8. a: [1, 2, 3],
  9. b: [1, 4, 5],
  10. c: [1, 1]
  11. },
  12. ];

 以下是jsx代码

  1. <div
  2. className="host-data"
  3. >
  4. {
  5. data.map((v, i) => {
  6. return (
  7. <div
  8. key={i}
  9. className="cuboid"
  10. style={{ height: maxHeight * 30 + 15 > 250 ? maxHeight * 30 + 15 : 250, width: 127 }}
  11. >
  12. <div
  13. className="front"
  14. style={{ height: (v.a.length + v.b.length + v.c.length) < 3 ? (v.a.length + v.b.length + v.c.length) * 30 + 8 : (v.a.length + v.b.length + v.c.length) * 30 }}
  15. >
  16. {
  17. Array.from({ length: v.a.length }).map((item, index) => {
  18. return (
  19. <span
  20. key={index}
  21. style={{ backgroundColor: 'rgba(222,222,228)' }}
  22. >
  23. <span style={{ width: 8, height: 8, borderRadius: 8, backgroundColor: '#5E9DF8', marginLeft: 65, marginTop: 0 }} />
  24. </span>
  25. );
  26. })
  27. }
  28. {
  29. Array.from({ length: v.b.length }).map((item, index) => {
  30. return (
  31. <span
  32. key={index}
  33. style={{ backgroundColor: 'rgba(220,222,228,.8)' }}
  34. >
  35. <span style={{ width: 8, height: 8, borderRadius: 8, backgroundColor: '#5E9DF8', marginLeft: 65, marginTop: 0 }} />
  36. </span>
  37. );
  38. })
  39. }
  40. {
  41. Array.from({ length: v.c.length }).map((item, index) => {
  42. return (
  43. <span
  44. key={index}
  45. >
  46. <span style={{ width: 8, height: 8, borderRadius: 8, backgroundColor: '#5E9DF8', marginLeft: 65, marginTop: 0 }} />
  47. </span>
  48. );
  49. })
  50. }
  51. </div>
  52. <div
  53. className="back"
  54. style={{ height: (v.a.length + v.b.length + v.c.length) < 3 ? (v.a.length + v.b.length + v.c.length) * 30 + 8 : (v.a.length + v.b.length + v.c.length) * 30 }}
  55. />
  56. <div
  57. className="left"
  58. style={{ height: (v.a.length + v.b.length + v.c.length) < 3 ? (v.a.length + v.b.length + v.c.length) * 30 + 8 : (v.a.length + v.b.length + v.c.length) * 30 }}
  59. />
  60. <div
  61. className="right"
  62. style={{ height: (v.a.length + v.b.length + v.c.length) < 3 ? (v.a.length + v.b.length + v.c.length) * 30 + 8 : (v.a.length + v.b.length + v.c.length) * 30 }}
  63. />
  64. <div
  65. className="top"
  66. style={{ top: maxHeight * 30 + 15 > 250 ? (v.a.length + v.b.length + v.c.length) < 3 ? (maxHeight * 30 - 55) - 30 * (v.a.length + v.b.length + v.c.length) : (maxHeight * 30 - 47) - 30 * (v.a.length + v.b.length + v.c.length) : (v.a.length + v.b.length + v.c.length) < 3 ? 180 - 30 * (v.a.length + v.b.length + v.c.length) : 188 - 30 * (v.a.length + v.b.length + v.c.length) }}
  67. />
  68. </div>
  69. );
  70. })
  71. }
  72. </div>

其中,展示的数据data中a,b,c的长度加起来最长就等于maxHeight

而控制外层cuboid的div的高度是为了实现滚动条的效果(根据实际情况而定)

 less文件

  1. .host-data{
  2. position: relative;
  3. display: flex;
  4. width: 1232px;
  5. height: 250px;
  6. padding-left: 48px;
  7. overflow-y: scroll;
  8. & .cuboid {
  9. z-index: 1;
  10. width: 127px;
  11. vertical-align: baseline;
  12. transform: rotateX(-8deg) rotateY(-8deg);
  13. transform-style: preserve-3d;
  14. & div {
  15. position: absolute;
  16. bottom: 5px;
  17. z-index: 3;
  18. width: 100px;
  19. cursor: pointer;
  20. }
  21. & .front {
  22. height: 200px;
  23. background: rgba(163,218,255,.2);
  24. border-top: 6px solid #296AD9;
  25. transform: translateZ(50px);
  26. & span{
  27. display: inline-block;
  28. width: 80px;
  29. height: 20px;
  30. margin: 8px 8px 0 8px;
  31. background: #F0F8FF;
  32. }
  33. }
  34. & .back {
  35. height: 200px;
  36. background: #5E9DF8;
  37. transform: translateZ(-50px) rotateY(180deg);
  38. }
  39. & .left {
  40. height: 200px;
  41. background: #8FC3FF;
  42. transform: rotateY(-90deg) translateZ(50px);
  43. }
  44. & .right {
  45. height: 200px;
  46. background: #8FC3FF;
  47. transform: rotateY(90deg) translateZ(50px);
  48. }
  49. & .top {
  50. height: 100px;
  51. background: #E0F1FF;
  52. transform: rotateX(90deg) translateX(-19px);
  53. }
  54. }
  55. }

结果图:

 

具体思路是:用css的3d视觉 将多个div拼接成一个立体的柱状图,柱子的高度:分别由前、后、左、右四个div的高度决定,而这四个div的高度由需要展示的数据的多少决定,立体柱状图的顶部,也需要计算出来,前面的小方块分别代表a,b或者c中的数据条数,这里只是使用了数字作代替,根据实际情况而定,通常是一个对象,然后鼠标移到不同的块块上显示不同对象的内容(这就是另外一个功能了,感兴趣的可以自己研究一下,类似于echarts的tooltip功能)。尝试修改transform,可以获得不同角度的柱状图。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/549982
推荐阅读
相关标签
  

闽ICP备14008679号