圆环.png

vue

  1. <template>
  2. <svg
  3. xmlns="http://www.w3.org/2000/svg"
  4. class="svg-content"
  5. :viewbox="viewbox"
  6. :width="diameterShow"
  7. :height="diameterShow"
  8. >
  9. <!-- 外部圆圈,固定360度圆圈 -->
  10. <circle
  11. :cx="size"
  12. :cy="size"
  13. :r="raduisActual"
  14. :stroke-width="strokeWidthIn"
  15. :stroke="strokeBgColor"
  16. fill="none"
  17. ></circle>
  18. <!-- 百分比环 -->
  19. <circle
  20. v-if="rate"
  21. :text="text"
  22. :cx="size"
  23. :cy="size"
  24. :r="raduisActual"
  25. :stroke-width="strokeWidth"
  26. :stroke="strokeColor"
  27. fill="none"
  28. :transform="transform"
  29. :stroke-dasharray="strokeDasharray"
  30. stroke-linecap="round"
  31. ></circle>
  32. <!-- 中间背景 -->
  33. <circle :cx="size" :cy="size" :r="raduisActualIn" fill="#3b3743"></circle>
  34. <!-- 中间文字,根据自己的需求定义了 -->
  35. <text :x="size" :y="size" fill="#ffffff" :font-size="numTextSize">
  36. {{ text }}
  37. </text>
  38. <!-- 如果中间文字带单位的,根据自己的需求处理了 -->
  39. <text :x="size" :y="timesY" fill="#ffffff" :font-size="numTypeTextSize">
  40. </text>
  41. </svg>
  42. </template>
  43. <script>
  44. export default {
  45. props: {
  46. // 圆环外圈的半径,为了好看,最小值半径19
  47. size: {
  48. default: 38,
  49. },
  50. // 圆环的小宽度
  51. strokeWidth: {
  52. default: 5,
  53. },
  54. // 圆环的颜色
  55. strokeColor: {
  56. default: '#00A1F9',
  57. },
  58. strokeBgColor: {
  59. default: 'rgba(0,161,249,0.6)',
  60. },
  61. // 圆环显示的百分比 这边是小数
  62. rate: {
  63. default: 0.5,
  64. },
  65. // 圆环里面的文字 这里的文字如果跟rate息息相关 可以放到computed计算
  66. text: {
  67. default: 50,
  68. },
  69. // 圆环里面的文字的fontSize大小
  70. textSize: {
  71. default: 20,
  72. },
  73. },
  74. computed: {
  75. timesY() {
  76. return this.size * 1.5
  77. },
  78. strokeWidthIn() {
  79. return Math.round(0.6 * this.strokeWidth)
  80. },
  81. // 圆半径
  82. raduisActual() {
  83. return this.size - this.strokeWidth
  84. },
  85. // 内部放文字圆圈半径
  86. raduisActualIn() {
  87. return Math.round((this.size - this.strokeWidth) * 0.8)
  88. },
  89. // svg的宽高,也就是圆环直径
  90. diameterShow() {
  91. return 2 * this.size
  92. },
  93. viewbox() {
  94. return `0 0 ${this.diameterShow} ${this.diameterShow}`
  95. },
  96. strokeDasharray() {
  97. const perimeter = Math.PI * 2 * this.raduisActual
  98. const showLength = Math.round(this.rate * perimeter - 3)
  99. return `${showLength} 1000`
  100. },
  101. transform() {
  102. return `matrix(0,-1,1,0,0,${this.diameterShow})`
  103. },
  104. numTextSize() {
  105. return this.textSize
  106. },
  107. numTypeTextSize() {
  108. return this.textSize > 24 ? this.textSize / 2 : 12
  109. },
  110. },
  111. mounted() {},
  112. beforeDestroy() {},
  113. methods: {},
  114. }
  115. </script>
  116. <style scoped lang="scss">
  117. $ui-width: 1224; //设计图的基准宽
  118. $ui-height: 696; //设计图的基准高
  119. @function vw($px) {
  120. @return $px / $ui-width * 100vw;
  121. }
  122. @function vh($px) {
  123. @return $px / $ui-height * 100vh;
  124. }
  125. text {
  126. text-anchor: middle;
  127. }
  128. .parent-element-center {
  129. display: inline-block;
  130. position: relative;
  131. width: 100%;
  132. padding-bottom: 100%;
  133. vertical-align: middle;
  134. overflow: hidden;
  135. }
  136. .svg-content {
  137. display: inline-block;
  138. position: absolute;
  139. top: 0;
  140. left: 0;
  141. }
  142. .element-center {
  143. position: absolute;
  144. left: 50%;
  145. top: 45%;
  146. border-radius: 50%;
  147. transform: translate(-50%, -50%);
  148. font-size: vw(20);
  149. background-color: #3b3743;
  150. color: #ffffff;
  151. }
  152. </style>