| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <template>
- <view class="progress-container">
- <!-- 半环进度容器 -->
- <view class="ring-wrapper">
- <!-- 背景环(半环底色) -->
- <view class="ring-bg"></view>
- <!-- 进度环(渐变+动态进度) -->
- <view class="ring-progress" :style="{ transform: `rotate(${progressDeg}deg)` }">
- <!-- 左侧环(青色渐变) -->
- </view>
- <!-- 进度原点(圆点) -->
- <view class="progress-dot" :style="{ transform: `rotate(${progressDeg}deg)` }"></view>
- <!-- 中间文字(百分比+提示) -->
- <view class="progress-text">
- <text class="percent">{{ progress }}%</text>
- <text class="tips">{{ tipText }}</text>
- </view>
- </view>
- </view>
- </template>
- <script>
- export default {
- name: "half-ring-progress",
- props: {
- // 进度值(0-100)
- progress: {
- type: Number,
- default: 30,
- validator: val => val >= 0 && val <= 100
- },
- // 底部提示文字
- tipText: {
- type: String,
- default: "充电枪正在充电中"
- },
- // 是否启用动画
- animated: {
- type: Boolean,
- default: true
- },
- // 主题颜色(用于渐变)
- themeColor: {
- type: String,
- default: '#49a6f4'
- }
- },
- computed: {
- // 计算进度对应的旋转角度(从左侧-90°开始,顺时针旋转)
- progressDeg() {
- return -90 + (this.progress * 1.8);
- },
- // 渐变颜色(从青色到蓝色)
- gradientColor() {
- return 'linear-gradient(99deg, #8FF8FB 0%, #47AEFF 100%)';
- }
- }
- };
- </script>
- <style scoped>
- .progress-container {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 20rpx;
- }
- .ring-wrapper {
- position: relative;
- width: 400rpx;
- height: 200rpx;
- overflow: hidden;
- }
- /* 背景半环样式 */
- .ring-bg {
- position: absolute;
- top: 0;
- left: 0;
- width: 400rpx;
- height: 400rpx;
- border-radius: 50%;
- border: 16rpx solid #97DAFF;
- box-sizing: border-box;
- clip: rect(0rpx, 400rpx, 200rpx, 0rpx);
- }
- /* 进度半环容器(控制旋转) */
- .ring-progress {
- position: absolute;
- top: 0;
- left: 0;
- width: 400rpx;
- height: 200rpx;
- overflow: hidden;
- transition: transform 0.6s ease-in-out;
- }
- /* 左侧半环(青色) */
- .ring-left {
- position: absolute;
- top: 0;
- left: 0;
- width: 400rpx;
- height: 400rpx;
- border-radius: 50%;
- border: 16rpx solid #8FF8FB;
- box-sizing: border-box;
- clip: rect(0rpx, 200rpx, 400rpx, 0rpx);
- }
- /* 中间过渡区 */
- .ring-middle {
- position: absolute;
- top: 0;
- left: 150rpx;
- width: 100rpx;
- height: 400rpx;
- background: linear-gradient(to right, #8FF8FB, #5EC8FE);
- clip: rect(0rpx, 100rpx, 200rpx, 0rpx);
- }
- /* 右侧半环(蓝色) */
- .ring-right {
- position: absolute;
- top: 0;
- left: 0;
- width: 400rpx;
- height: 400rpx;
- border-radius: 50%;
- border: 16rpx solid #47AEFF;
- box-sizing: border-box;
- clip: rect(0rpx, 400rpx, 400rpx, 200rpx);
- }
- /* 进度原点(末端圆点) */
- .progress-dot {
- position: absolute;
- top: 0;
- left: 50%;
- width: 28rpx;
- height: 28rpx;
- background: #FFFFFF;
- border: 5rpx solid #47AEFF;
- border-radius: 50%;
- transform-origin: center 200rpx;
- margin-left: -14rpx;
- margin-top: -14rpx;
- box-shadow: 0 0 16rpx rgba(71, 174, 255, 0.8);
- transition: transform 0.6s ease-in-out;
- z-index: 10;
- }
- /* 中间文字样式 */
- .progress-text {
- position: absolute;
- top: 65%;
- left: 50%;
- transform: translate(-50%, -50%);
- text-align: center;
- }
- .percent {
- display: block;
- font-size: 60rpx;
- font-weight: bold;
- color: #333;
- margin-bottom: 10rpx;
- }
- .tips {
- display: block;
- font-size: 24rpx;
- color: #666;
- }
- /* 高亮文字(如“充电中”) */
- .tips text {
- color: v-bind(themeColor);
- }
- </style>
|