当前位置:   article > 正文

用div+css手动封装一个3D柱状图_vue css 不规则3d 圆柱

vue css 不规则3d 圆柱

碰到一个需求 3D柱状图 正常来说这块地方是一张图片 但是leader说死图片不能很好的反应效果  我就去找了一下其他的发现threejs可以做  但是还要下载其他东西 找不到资源(主要是要花钱)心一横  直接自己封装一个

 我的逻辑如下:

将这种有背景的  拆分成两个大块:背景块 (也就是背后透明的那部分) 和  填充块

 每大块分为这四个小块  下方就称为 填充块1,填充块2,填充块3,填充块4(背景块同)

效果如下

基础展示封装代码如下

html

  1. <!-- 手绘柱状图 y开头为背后阴影 f为填充色区域 -->
  2. <!-- 背景块3的颜色直接给在主题区域 -->
  3. <div class="fzt" style="background: rgba(70, 171, 218, 0.2);">
  4. <!-- 填充块1 -->
  5. <div class="fhead" style="bottom:3vh;border: 6px solid #4FB3DD;"></div>
  6. <!-- 填充块2 -->
  7. <div class="fbody" style="bottom:calc(3vh - 16px);border: 8px solid #4FB3DD;"></div>
  8. <!-- 填充块4 -->
  9. <div class="ffoot" style="border: 6px solid #6CCDE5;"></div>
  10. <!-- 填充块3 -->
  11. <div class="fmain" style="height: 3vh;background-image: linear-gradient(#44A9DA, #6CCCE5);"></div>
  12. <!-- 背景块1 -->
  13. <div class="yhead" style="border: 6px solid rgba(70, 171, 218, 0.34);"></div>
  14. <!-- 背景块2 -->
  15. <div class="ybody" style="border: 8px solid rgba(70, 171, 218, 0.2);"></div>
  16. <!-- 背景块4 -->
  17. <div class="yfoot" style="border: 6px solid rgba(70, 171, 218, 0.2);"></div>
  18. </div>

css

  1. .fzt {
  2. height: 6vh;
  3. width: 40px;
  4. position: relative;
  5. }
  6. .fmain {
  7. position: absolute;
  8. bottom: 0;
  9. width: 100%;
  10. z-index: 10;
  11. }
  12. .yhead {
  13. height: 0;
  14. width: 0;
  15. border-right: 20px solid transparent !important;
  16. border-left: 20px solid transparent !important;
  17. border-top: 6px solid transparent !important;
  18. position: absolute;
  19. top: -12px;
  20. z-index: 1;
  21. }
  22. .fhead {
  23. height: 0;
  24. width: 0;
  25. border-right: 20px solid transparent !important;
  26. border-left: 20px solid transparent !important;
  27. border-top: 6px solid transparent !important;
  28. position: absolute;
  29. z-index: 10;
  30. }
  31. .ybody {
  32. height: 0;
  33. width: 0;
  34. border-right: 20px solid transparent !important;
  35. border-left: 20px solid transparent !important;
  36. border-bottom-color: transparent !important;
  37. position: absolute;
  38. top: 0;
  39. left: 0;
  40. z-index: 1;
  41. }
  42. .fbody {
  43. height: 0;
  44. width: 0;
  45. border-right: 20px solid transparent !important;
  46. border-left: 20px solid transparent !important;
  47. border-bottom-color: transparent !important;
  48. position: absolute;
  49. left: 0;
  50. z-index: 100;
  51. }
  52. .yfoot {
  53. height: 0;
  54. width: 0;
  55. border-right: 20px solid transparent !important;
  56. border-left: 20px solid transparent !important;
  57. border-bottom-color: transparent !important;
  58. position: absolute;
  59. bottom: -12px;
  60. z-index: 1;
  61. }
  62. .ffoot {
  63. height: 0;
  64. width: 0;
  65. border-right: 20px solid transparent !important;
  66. border-left: 20px solid transparent !important;
  67. border-bottom-color: transparent !important;
  68. position: absolute;
  69. bottom: -12px;
  70. z-index: 10;
  71. }

复制代码就可以直接使用了

高度,颜色的在html行内里计算更改就好了

进阶代码

高亮

为了让别人感觉我们封装的不是死的 类似于图片这样的 我们得加高亮

首先在html里加入这个css

然后css里添加红框框起来的几个  这样高亮我们就添加好了

 

 效果如下

鼠标滑到上面之前

鼠标滑到上面之后

 这样我们的高亮就搞定了

弹框

 css添加

  1. .dialogs {
  2. border: 1px solid #cccccc;
  3. background-color: rgba(0, 0, 0, 0.4);
  4. position: absolute;
  5. padding: 8px 10px;
  6. border-radius: 4px;
  7. font-size: 12px;
  8. z-index: 1000;
  9. }

 html添加

 js添加

  1. let that = this
  2. let fzt = document.getElementsByClassName("fzt")
  3. for (let i = 0; i < fzt.length; i++) {
  4. // 鼠标进入时 弹框显示
  5. fzt[i].addEventListener("mouseover", function (e) {
  6. if (i == 0) {
  7. that.isOne = "block"
  8. } else if (i == 1) {
  9. that.isTwo = "block"
  10. } else if (i == 2) {
  11. that.isThree = "block"
  12. }
  13. })
  14. // 鼠标滑动时 弹框跟着变化
  15. fzt[i].addEventListener("mousemove", function (e) {
  16. if (i == 0) {
  17. that.oneTop = e.layerY - 20 + 'px'
  18. that.oneLeft = e.layerX + 20 + 'px'
  19. } else if (i == 1) {
  20. that.twoTop = e.layerY - 20 + 'px'
  21. that.twoLeft = e.layerX + 20 + 'px'
  22. } else if (i == 2) {
  23. that.threeTop = e.layerY - 20 + 'px'
  24. that.threeLeft = e.layerX + 20 + 'px'
  25. }
  26. })
  27. // 鼠标移除时 弹框消失
  28. fzt[i].addEventListener("mouseout", function (e) {
  29. if (i == 0) {
  30. that.isOne = "none"
  31. } else if (i == 1) {
  32. that.isTwo = "none"
  33. } else if (i == 2) {
  34. that.isThree = "none"
  35. }
  36. })
  37. }

这样就完成啦!

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

闽ICP备14008679号