0


前端大屏适配(Vue2+ECharts)+ECharts封装

使用flexible.js+rem实现字体自适应

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

②rem是相对于根元素的字体大小单位:使用VSCode插件并设置基准值(1920设置80);

③main.js中引入:

  1. import './utils/flexible';

ECharts

①echarts封装:

  1. <template>
  2. <div :id="id" :style="style"></div>
  3. </template>
  4. <script>
  5. import * as echarts from 'echarts'
  6. export default {
  7. name: 'MyEcharts',
  8. data() {
  9. return {
  10. chart: ''
  11. }
  12. },
  13. props: {
  14. id: {
  15. type: String
  16. },
  17. width: {
  18. type: String,
  19. default: '100%'
  20. },
  21. height: {
  22. type: String,
  23. default: '100%'
  24. },
  25. option: {
  26. type: Object,
  27. default() {
  28. return {
  29. }
  30. }
  31. }
  32. },
  33. computed: {
  34. style() {
  35. return {
  36. width: this.width,
  37. height: this.height
  38. }
  39. }
  40. },
  41. watch: {
  42. option: {
  43. handler(newVal, oldVal) {
  44. if (this.chart) {
  45. this.chart.setOption(newVal)
  46. } else {
  47. this.init();
  48. }
  49. },
  50. deep: true
  51. }
  52. },
  53. methods: {
  54. init() {
  55. this.chart = echarts.init(document.getElementById(this.id))
  56. this.chart.setOption(this.option)
  57. window.addEventListener("resize", this.chart.resize);
  58. }
  59. },
  60. mounted() {
  61. this.init()
  62. },
  63. }
  64. </script>

②echarts中的px转换成rem:

  1. export function fontSizeRem(size) {
  2. const clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
  3. if (!clientWidth) return;
  4. let fontSize = clientWidth / 1920;//尺寸大小
  5. return size * fontSize;
  6. }

③使用:

  1. <template>
  2. <div class="partOne">
  3. <div class="center">
  4. <MyEcharts id="pieECharts1" :style="{ width: '3.6875rem', height: '3.25rem' }" :option='pieDataOneOption' />
  5. </div>
  6. <!--<div style="font-size: 0.225rem; color: red;">1111</div> -->
  7. </div>
  8. </template>
  9. <script>
  10. import MyEcharts from './MyEcharts.vue'
  11. import { fontSizeRem } from '../utils/rem.js'
  12. export default {
  13. name: 'partOne',
  14. components: {
  15. MyEcharts,
  16. },
  17. data() {
  18. return {
  19. pieDataOne: [
  20. { name: "空闲", value: 37, color: "#20E6A4" },
  21. { name: "占用", value: 63, color: "#F52F5F" }
  22. ],
  23. pieDataOneOption: {
  24. tooltip: {
  25. show: false,
  26. }, //提示框
  27. legend: {
  28. top: "bottom",
  29. left: "center",
  30. // width: 200,
  31. // height: 27,
  32. itemGap: fontSizeRem(20), //每个图例之间的间隙
  33. itemWidth: fontSizeRem(8),
  34. itemHeight: fontSizeRem(8),
  35. selectedMode: false, //图例的选择模式,用图例改变显示状态
  36. icon: "rect",
  37. textStyle: {
  38. fontSize: fontSizeRem(18),
  39. lineHeight: fontSizeRem(21),
  40. color: '#C6D1DB',
  41. }
  42. },
  43. series: [
  44. {
  45. type: "pie", //饼图
  46. hoverAnimation: false, //悬停动画
  47. radius: ["55%", "60%"], //半径
  48. center: ["50%", "48%"], //中心坐标
  49. z: 10, //覆盖顺序
  50. label: { //中心文本标签
  51. position: "center",
  52. formatter: () => {
  53. return "实时xxxx\n利用率";
  54. },
  55. color: "#C6D1DB",
  56. fontSize: fontSizeRem(18),
  57. lineHeight: fontSizeRem(30),
  58. },
  59. data: [],
  60. },
  61. {
  62. type: "pie",
  63. hoverAnimation: false, //悬停动画
  64. radius: ["50%", "65%"],
  65. center: ["50%", "48%"],
  66. label: { //图形上的文本标签
  67. position: "outside",
  68. color: "#F0F0F0",
  69. fontSize: fontSizeRem(18),
  70. // formatter: () => {
  71. // return piedata.value;
  72. // }
  73. },
  74. labelLine: { //标签的视觉引导线
  75. show: true,
  76. length: 0,
  77. length2: fontSizeRem(16),
  78. lineStyle: {
  79. color: "#0783FA",
  80. }
  81. },
  82. data: [],
  83. },
  84. ],
  85. },
  86. }
  87. },
  88. mounted() {
  89. this.pieDataOneOption.series[0].data = [
  90. {
  91. name: this.pieDataOne[0].name,
  92. value: this.pieDataOne[0].value,
  93. itemStyle: {
  94. color: this.pieDataOne[0].color,
  95. },
  96. },
  97. {
  98. name: this.pieDataOne[1].name,
  99. value: this.pieDataOne[1].value,
  100. itemStyle: {
  101. color: this.pieDataOne[1].color,
  102. },
  103. }
  104. ]
  105. this.pieDataOneOption.series[1].data = [
  106. {
  107. name: this.pieDataOne[0].name,
  108. value: this.pieDataOne[0].value,
  109. itemStyle: {
  110. color: this.pieDataOne[0].color,
  111. opacity: 0.4,
  112. },
  113. },
  114. {
  115. name: this.pieDataOne[1].name,
  116. value: this.pieDataOne[1].value,
  117. itemStyle: {
  118. color: this.pieDataOne[1].color,
  119. opacity: 0.4,
  120. },
  121. }
  122. ]
  123. this.pieDataOneOption.series[1].label.formatter = (val) => `${val.percent}%`
  124. },
  125. }
  126. </script>
  127. <style scoped>
  128. .partOne {
  129. background-image: url(../assets/左背景.png);
  130. }
  131. .center {
  132. width: 11.4375rem;
  133. height: 3.4625rem;
  134. display: flex;
  135. justify-content: center;
  136. align-items: center;
  137. }
  138. </style>

展示

参考:https://blog.csdn.net/qq_38210427/article/details/130345981


本文转载自: https://blog.csdn.net/weixin_50218029/article/details/137440802
版权归原作者 wwwwwwwwwwlj 所有, 如有侵权,请联系我们删除。

“前端大屏适配(Vue2+ECharts)+ECharts封装”的评论:

还没有评论