效果图:
组件完整代码如下:
<template>
<view class="base-style"
:style="'position: relative;width: ' + diameter + 'px;height: ' + diameter + 'px;display: flex;flex-direction: row;background-color: ' + bgColor + ';'">
<!-- 左半圆和右半圆都要经历下面的5步:
[第1步]第1层限定区域;
[第2步]第2层决定显示一个整圆的左半边还是右半边;
[第3步]第3层先使用激活颜色绘制一个圆环, 再添加一个同级且宽度为区域一半的盒子A;
[第4步]在盒子A中再使用圆环底色绘制一个圆环, 此时整个圆环是 '左一半是激活颜色、右一半是圆环底色', 但这个圆环同时只能被看到一半;
[第5步]旋转第2层。 -->
<!-- 左半圆 -->
<view class="base-style" :style="firstLayerViewStyle">
<view :style="secondLayerViewStyle + secondLayerForLeft">
<!-- 使用激活颜色绘制一个圆环。 -->
<view :style="thirdLayerStyle">
</view>
<!-- 再使用背景色遮盖同级圆环的一半。 -->
<view class="base-style" :style="thirdLayerStyleForBg">
<view :style="fourthLayerStyleForBg" />
</view>
<view v-if="0 < ePercent && ePercent < 0.5" :style="endPointStyle + endPointStyleForLeft" />
</view>
</view>
<!-- 右半圆 -->
<view class="base-style" :style="firstLayerViewStyle">
<!-- 适配:为了避免右侧遮盖显示不全 此处向左多移动了1px -->
<view :style="secondLayerViewStyle + 'left: ' + (- diameter / 2 - 1) + 'px;' + secondLayerForRight">
<!-- 使用激活颜色绘制一个圆环。 -->
<view :style="thirdLayerStyle">
</view>
<!-- 再使用背景色遮盖同级圆环的一半。 -->
<view class="base-style" :style="thirdLayerStyleForBg">
<view :style="fourthLayerStyleForBg" />
</view>
<view v-if="ePercent > 0.5"