index.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <view class="content">
  3. <view class="circleprogress">
  4. <view class="progresstext">{{progresstext}}%</view>
  5. <view class="wrapper left">
  6. <view class="leftprogress" :style="{ transform: leftprogress}"></view>
  7. </view>
  8. <view class="wrapper right">
  9. <view class="rightprogress" :style="{ transform: rightprogress}"></view>
  10. </view>
  11. </view>
  12. </view>
  13. </template>
  14. <script>
  15. export default {
  16. props: {
  17. percent: {
  18. type: Number,
  19. default: 50
  20. }
  21. },
  22. data() {
  23. return {
  24. leftprogress: 'rotate(-45deg)',
  25. rightprogress: 'rotate(45deg)',
  26. progresstext: 30
  27. }
  28. },
  29. created() {
  30. let percent = Math.round(this.percent * 100)
  31. this.sliderchange(percent)
  32. },
  33. methods: {
  34. sliderchange(event) {
  35. var val = event
  36. this.progresstext = val;
  37. var deg = val / 100 * 360;
  38. if (deg <= 180) {
  39. this.rightprogress = 'rotate(' + (45 + deg) + 'deg)'
  40. this.leftprogress = 'rotate(' + (-45) + 'deg)'
  41. } else {
  42. this.rightprogress = 'rotate(' + (45 + 180) + 'deg)'
  43. this.leftprogress = 'rotate(' + (-45 + (deg - 180)) + 'deg)'
  44. }
  45. }
  46. }
  47. }
  48. </script>
  49. <style scoped>
  50. .circleprogress {
  51. width: 200rpx;
  52. height: 200rpx;
  53. display: flex;
  54. justify-content: center;
  55. }
  56. .content {
  57. box-sizing: content-box !important;
  58. }
  59. .progresstext {
  60. position: absolute;
  61. font-size: 40rpx;
  62. width: 200rpx;
  63. height: 200rpx;
  64. display: flex;
  65. justify-content: center;
  66. align-items: center;
  67. z-index: 10;
  68. color: #4A8BFF;
  69. }
  70. .wrapper {
  71. width: 100rpx;
  72. height: 200rpx;
  73. overflow: hidden;
  74. }
  75. .leftprogress,
  76. .rightprogress {
  77. width: 160rpx;
  78. height: 160rpx;
  79. border: 20rpx solid #E6E6E6;
  80. border-bottom: 20rpx solid #4A8BFF;
  81. border-radius: 50%;
  82. }
  83. .leftprogress {
  84. border-right: 20rpx solid #4A8BFF;
  85. box-sizing: initial;
  86. }
  87. .rightprogress {
  88. border-left: 20rpx solid #4A8BFF;
  89. margin-left: -100rpx;
  90. box-sizing: initial;
  91. }
  92. .section {
  93. width: 80%;
  94. margin-top: 50rpx;
  95. }
  96. </style>