当前位置:   article > 正文

使用 Echarts 做数据可视化智能大屏1_echarts大屏如何布局

echarts大屏如何布局

1. 使用技术

  • 基于flexible.js + rem 智能大屏适配
  • VScode cssrem 插件:快速生成rem单位
  • Flex布局
  • Less
  • div + css布局 
  • 原生js + jquery
  • 基于echarts数据可视化展示
  • Echarts柱状图数据设置
  • Echarts地图引入

数据可视化主要目的:借助于图像化手段,清晰有效地传达与沟通信息

2.案例适配方案:

  1. flexible.js 把屏幕分为 24 等份
  2. cssrem插件的基准值是 80px

先引入flexible.js 

  1. (function flexible (window, document) {
  2. var docEl = document.documentElement
  3. var dpr = window.devicePixelRatio || 1
  4. // adjust body font size
  5. function setBodyFontSize () {
  6. if (document.body) {
  7. document.body.style.fontSize = (12 * dpr) + 'px'
  8. }
  9. else {
  10. document.addEventListener('DOMContentLoaded', setBodyFontSize)
  11. }
  12. }
  13. setBodyFontSize();
  14. // set 1rem = viewWidth / 10
  15. function setRemUnit () {
  16. var rem = docEl.clientWidth / 10
  17. docEl.style.fontSize = rem + 'px'
  18. }
  19. setRemUnit()
  20. // reset rem unit on page resize
  21. window.addEventListener('resize', setRemUnit)
  22. window.addEventListener('pageshow', function (e) {
  23. if (e.persisted) {
  24. setRemUnit()
  25. }
  26. })
  27. // detect 0.5px supports
  28. if (dpr >= 2) {
  29. var fakeBody = document.createElement('body')
  30. var testElement = document.createElement('div')
  31. testElement.style.border = '.5px solid transparent'
  32. fakeBody.appendChild(testElement)
  33. docEl.appendChild(fakeBody)
  34. if (testElement.offsetHeight === 1) {
  35. docEl.classList.add('hairlines')
  36. }
  37. docEl.removeChild(fakeBody)
  38. }
  39. }(window, document))

屏幕展示效果为1920px 

flexible.js默认将屏幕划分为10等份,1920/10=192px,相当于1rem=192px

这里修改为24等份,1924/24=80,相当于1rem=80px

 cssrem 插件配置将基准值设置为 80

 改完之后就会自动转换为 80px=1rem

3. 基础设置

  • body 设置背景图,缩放100%,行高1.15
  • css初始化
  1. // css初始化
  2. *{
  3. margin:0;
  4. padding: 0;
  5. box-sizing: border-box; //paddingborder的值就不会在影响元素的宽高
  6. }
  7. body{
  8. background: url(../images/bg.jpg) //背景图
  9. no-repeat top center; //不会出现平铺或者重复的现象,位于上部的居中位置
  10. line-height: 1.15; //行高
  11. }

4. header布局

  • 高度100px
  • 背景图,在容器内显示
  • 缩放比例为100%
  • h1标题部分,白色,38px,居中显示,行高为80px
  • 时间模块showTime,定位右侧,right为30px,top为0,行高为75px,文字颜色为rgba(255,255,255,0.7),文字大小20px  (子绝父相)
  1. <!-- 头部的盒子 -->
  2. <header>
  3. <h1>数据可视化-Echarts</h1>
  4. <div class="showTime"></div>
  5. <script>
  6. var t = null
  7. t = setTimeout(time, 1000) //开始运行
  8. function time() {
  9. clearTimeout(t) //清楚定时器
  10. dt = new Date()
  11. var y = dt.getFullYear()
  12. var mt = dt.getMonth() + 1
  13. var day = dt.getDate()
  14. var h = dt.getHours()
  15. var m = dt.getMinutes()
  16. var s = dt.getSeconds()
  17. document.querySelector(".showTime").innerHTML =
  18. "当前时间:" + y + "年" + mt + "月" + day + "日" + "-" + h + "时" + m + "分" + s + "秒"
  19. // document.querySelector(".showTime").innerHTML=dt
  20. t = setTimeout(time, 1000) //设置定时器,循环运行
  21. }
  22. </script>
  23. </header>
  1. header{
  2. position: relative;
  3. height: 1.25rem;
  4. background: url(../images/head_bg.png)
  5. no-repeat;
  6. background-size: 100% 100%; //缩放 水平100% 垂直100%
  7. h1{
  8. font-size: .475rem;
  9. color: #fff;
  10. text-align: center; //文字居中
  11. line-height: 1rem; //行高
  12. }
  13. .showTime{
  14. position: absolute; //绝对位置 (子绝父相)
  15. right: .375rem;
  16. top: 0;
  17. line-height: .9375rem;
  18. color: rgba(255,255,255,0.7);
  19. font-size: .25rem;
  20. }
  21. }

5.1. 页面主题模块

  • 需要一个上左右的10px内边距
  • column列容器,分三列,占比3:5:3

div、section、article,语义上从无到有,逐渐增强; div无任何语义,仅仅用作样式化或者脚本化,对于一段主题性的内容,比较适用section,而假设这段内容是可以脱离上下文,作为完整的结构体独立存在的一段内容,那么就适合用article

  1. <section class="mainbox">
  2. <div class="column">1</div>
  3. <div class="column">2</div>
  4. <div class="column">3</div>
  5. </section>
  1. // 页面主题盒子
  2. .mainbox{
  3. display: flex;
  4. min-width: 1024px;
  5. max-width: 1920px;
  6. // height: 300px;
  7. margin: 0 auto; //居中对齐
  8. background-color: pink;
  9. padding: .125rem .125rem 0; //上左右10px
  10. .column{
  11. flex: 3; //每个盒子占3
  12. &:nth-child(2){ //给第二个盒子占5
  13. flex: 5;
  14. }
  15. }
  16. // .column:nth-child(2){ //给第二个盒子占5
  17. // flex: 5;
  18. // }
  19. }

5.2. 公共面板模块panel

  • 高度为310px
  • 1px的边框 1px solid rgba(25,186,139,0.17)
  • 有line.jpg背景图
  • padding为上0  左右15px  下为40px
  • 下外边距是 15px
  • 利用panel盒子before和after制作上面两个角 大小为10px 线条为2px solid #02a6b5
  • 新加一个盒子before和after 制作下侧两个角 宽度高度为10px
  1. <div class="column">
  2. <div class="panel">
  3. <div class="panel-footer"></div>
  4. </div>
  5. </div>
  1. .mainbox{
  2. .panel{
  3. position: relative;
  4. height: 3.875rem;
  5. // background-color: pink;
  6. border:1px solid rgba(25, 186, 139, 0.17);
  7. padding: 0 .1875rem .5rem ;
  8. margin-bottom: .1875rem;
  9. background: url(../images/line.png)
  10. rgba(255, 255, 255, 0.03);
  11. &::before{
  12. position: absolute;
  13. top:0;
  14. left:0;
  15. width: 10px;
  16. height: 10px;
  17. border-left: 2px solid #e3ebeb;
  18. border-top: 2px solid #e3ebeb ;
  19. content: "";
  20. }
  21. &::after{
  22. position: absolute;
  23. top:0;
  24. right:0;
  25. width: 10px;
  26. height: 10px;
  27. border-right: 2px solid #e3ebeb;
  28. border-top: 2px solid #e3ebeb ;
  29. content: "";
  30. }
  31. .panel-footer{
  32. position: absolute;
  33. bottom: 0;
  34. left: 0;
  35. width: 100%;
  36. &::before{
  37. position: absolute;
  38. bottom:0;
  39. left:0;
  40. width: 10px;
  41. height: 10px;
  42. border-left: 2px solid #e3ebeb;
  43. border-bottom: 2px solid #e3ebeb ;
  44. content: "";
  45. }
  46. &::after{
  47. position: absolute;
  48. bottom:0;
  49. right:0;
  50. width: 10px;
  51. height: 10px;
  52. border-right: 2px solid #e3ebeb;
  53. border-bottom: 2px solid #e3ebeb ;
  54. content: "";
  55. }
  56. }
  57. }
  58. }

5.3. 柱形图bar模型

  • 标题模块h2  高度48px  文字颜色为白色  文字大小为20px
  • 图标内容模块 chart  高度240px
  • 以上可以作为panel公共样式部分
  1. <div class="column">
  2. <div class="panel bar">
  3. <h2>柱形图-就业行业</h2>
  4. <div class="chart">图标</div>
  5. <div class="panel-footer"></div>
  6. </div>
  7. <div class="panel line">
  8. <h2>折线图-就业行业</h2>
  9. <div class="chart">图标</div>
  10. <div class="panel-footer"></div>
  11. </div>
  12. <div class="panel pie">
  13. <h2>饼形图-就业行业</h2>
  14. <div class="chart">图标</div>
  15. <div class="panel-footer"></div>
  16. </div>
  17. </div>
  1. .mainbox{
  2. .panel{
  3. h2{
  4. height: .6rem;
  5. color: #fff;
  6. line-height: .6rem;
  7. text-align: center;
  8. font-size: .25rem;
  9. font-weight: 5rem;
  10. }
  11. .chart{
  12. height: 3rem;
  13. background-color: pink;
  14. }
  15. }
  16. }

6.1. 中间布局--数字与文字模块

  • 上面是no 数字模块,背景颜色rgba(101,132,226,0.1) ,内边距padding15px
  • 中间列column有个左右10px,下15px的外边距
  • no模块里面上下划分,上面是数字(no-hd),下面是相关文字说明(no-bd)
  • no-hd数字模块,有一个边框1px solid rgba(25,186,139,0.17)
  • no-hd数字模块,里面分为两个小li,每个小li高度为80px,文字大小为70px,颜色为#ffeb7b,字体是图标字体 electronicFont,需要下载
  • no-hd利用after和before制作两个小角,边框 2px solid #02a6b5,宽度为30px,高度为10px
  • 下面是map 地图模块

把li的小圆点去掉

声明图标字体

 

  1. <!-- 中间 -->
  2. <div class="column">
  3. <!-- no模块制作 -->
  4. <div class="no">
  5. <div class="no-hd">
  6. <ul>
  7. <li>1</li>
  8. <li>2</li>
  9. </ul>
  10. </div>
  11. <div class="no-bd">
  12. <ul>
  13. <li>需求人数</li>
  14. <li>供应人数</li>
  15. </ul>
  16. </div>
  17. </div>
  18. </div>
  1. // no数字模块
  2. .no{
  3. background: rgba(101, 132, 226, 0.1);
  4. padding: .1875rem;
  5. .no-hd{
  6. position: relative;
  7. border: 1px solid rgba(25,186,139,0.17);
  8. &::before{
  9. position: absolute;
  10. top: 0;
  11. left: 0;
  12. content: "";
  13. width: 30px;
  14. height: 10px;
  15. border-top: 2px solid #02a6b5;
  16. border-left: 2px solid #02a6b5;
  17. }
  18. &::after{
  19. position: absolute;
  20. bottom: 0;
  21. right: 0;
  22. content: "";
  23. width: 30px;
  24. height: 10px;
  25. border-bottom: 2px solid #02a6b5;
  26. border-right: 2px solid #02a6b5;
  27. }
  28. ul{
  29. display: flex;
  30. li{
  31. position: relative;
  32. flex:1; //水平分布
  33. line-height: 1rem;
  34. font-size: .875rem;
  35. color: #ffeb7b;
  36. text-align: center;
  37. font-family: "electronicFont";
  38. &:nth-child(1){ //给第一个li设置小竖线
  39. &::after{
  40. content:"";
  41. position:absolute;
  42. top: 25%;
  43. height: 50%;
  44. right: 0;
  45. width: 1px;
  46. background: rgba(255,255,255,0.2);
  47. }
  48. }
  49. }
  50. }
  51. }
  52. //文字模块
  53. .no-bd{
  54. ul{
  55. display: flex;
  56. li{
  57. flex:1;
  58. text-align: center;
  59. color: rgba(255,255,255,0.7);
  60. font-size: .225rem;
  61. height: .5rem;
  62. line-height: .5rem;
  63. padding-top: .125rem;
  64. }
  65. }
  66. }
  67. }

 6.2. 地图模块

  • 地圈模块高度为 810px,里面包含4个盒子,chart 放图表模块,球体盒子,旋转1,旋转2
  • 球体图片模块map1,大小为 518px, 要加背景图片, 因为要缩放100%,定位到最中央,透明度.3
  • 旋转1map2, 大小为 643px, 要加背景图片, 因为要缩放100%, 定位到中央, 透明度.6 ,做旋转动画 
  • 旋转2map3, 大小为 566, 要加背景图片, 因为要缩放100%, 定位到中央, 旋转动画, 注意是逆时针 
  1. <!-- 地图模块 -->
  2. <div class="map">
  3. <div class="map1"></div>
  4. <div class="map2"></div>
  5. <div class="map3"></div>
  6. <div class="chart"></div>
  7. </div>
  1. .map{
  2. position: relative;
  3. height: 10.125rem;
  4. .map1{
  5. width: 6.475rem;
  6. height: 6.475rem;
  7. position: absolute;
  8. top: 50%;
  9. left: 50%;
  10. transform: translate(-50%,-50%); //保持水平居中,垂直居中
  11. background: url(../images/map.png);
  12. background-size: 100% 100%; //保证一起缩放
  13. opacity: .3; //透明度
  14. }
  15. .map2{
  16. position: absolute;
  17. top:50%;
  18. left: 50%;
  19. transform: translate(-50%,-50%);
  20. width: 8.0375rem;
  21. height: 8.0375rem;
  22. background: url(../images/lbx.png);
  23. background-size: 100% 100%; //保证一起缩放
  24. animation: rotate1 15s linear infinite; // 调用旋转
  25. opacity: .6;
  26. }
  27. @keyframes rotate1 { //定义旋转动画
  28. from{
  29. transform: translate(-50%,-50%) //保留原来位置
  30. rotate(0deg);
  31. }
  32. to{
  33. transform: translate(-50%,-50%)
  34. rotate(360deg);
  35. }
  36. }
  37. .map3{
  38. position: absolute;
  39. top:50%;
  40. left: 50%;
  41. transform: translate(-50%,-50%);
  42. width: 7.075rem;
  43. height: 7.075rem;
  44. background: url(../images/jt.png);
  45. background-size: 100% 100%; //保证一起缩放
  46. animation: rotate2 10s linear infinite; // 调用旋转
  47. opacity: .6;
  48. }
  49. @keyframes rotate2 { //定义旋转动画
  50. from{
  51. transform: translate(-50%,-50%) //保留原来位置
  52. rotate(0deg);
  53. }
  54. to{
  55. transform: translate(-50%,-50%)
  56. rotate(-360deg); //逆时针
  57. }
  58. }
  59. .chart{
  60. position: absolute;
  61. top: 0;
  62. left: 0;
  63. width: 100%;
  64. height: 10.125rem;
  65. }
  66. }

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

闽ICP备14008679号