实现环形进度条(CSS3+jQuery/Vue)

整体思路是:通过裁切(clip)产生两个半圆展示出静态的进度条,而后通过旋转(rotate)角度的变化产生动态效果。

先来回顾两个基础知识点

(1)css的一个不常见的属性:

clip: rect(top, right, bottom, left);

这个属性规定了一个裁切的矩形,其中top和bottom所指定的偏移量是从元素盒子顶部边缘算起,right和left所指定的偏移量是从元素盒子左侧边缘算起(这里需要重点注意的是bottom和right的计算方式)。看下面这张超级清晰的图(直接把w3cplus的图搬过来了,带着水印不违规的吧?):

图片描述

需要注意的是:clip属性只能在元素设置了“position:absolute”或者“position:fixed”属性时起作用。clip无法在设置“position:relative”和“position:static”上工作。

关于clip,想要深入了解请看这篇文章: http://www.w3cplus.com/css3/c...

(2)CSS的另一个属性:

transform: rotate(deg);

顺时针旋转一定的角度。

热身运动:我们来画一个右半圆

//html
<div class="pie-right">
    <div class="right"></div>
    <div class="mask"><span>0</span>%</div>
</div>
//css
.pie-right {
    position: absolute;
    top: 0;
    left: 0;
    height: 200px;
    width: 200px;
    border-radius: 50%;
    background: red;//注意这是表示当前进度的颜色
}
.right {
    position: absolute;
    top: 0;
    left: 0;
    height: 200px;
    width: 200px;
    border-radius: 50%;
    background: blue;//注意这个才不是当前进度的颜色
}
.pie-right, .right {
    clip: rect(0, auto, auto, 100px);
}
.mask {//我是遮罩
    position: absolute;
    top: 25px;
    left: 25px;
    height: 150px;
    width: 150px;
    background: #fff;
    border-radius: 50%;
    text-align: center;
}

效果如下:

图片描述

此时,元素pie-right完全被元素right遮住了。

然后,我们来旋转一下:

.right {
    transform: rotate(30deg);
}

旋转后效果如下:

图片描述

现在我们可以看到,旋转了30度时,露出的红色部分就是我们要的进度,这是pie-right元素的颜色。而蓝色部分right元素的颜色,是我们还未到达的进度。

正式开始

实现环形进度条意味着我们需要左右两个半圆,因此html结构要改变一下:

//html

<div class="circle">
    <div class="pie-right">
        <div class="right"></div>
    </div>
    <div class="pie-left">
        <div class="left"></div>
    </div>
    <div class="mask"><span>0</span>%</div>
</div>

//css
.circle {//这个元素可以提供进度条的颜色
    position: absolute;
    height: 200px;
    width: 200px;
    border-radius: 50%;
    background: red;//注意这是表示当前进度的颜色
}
.pie-right, .pie-left { //这俩元素主要是为了分别生成两个半圆的,所以起作用的地方在于clip裁掉另一半
    position: absolute;
    top: 0;
    left: 0;
    height: 200px;
    width: 200px;
    border-radius: 50%;
}
.right, .left {
    position: absolute;
    top: 0;
    left: 0;
    height: 200px;
    width: 200px;
    border-radius: 50%;
    background: blue;//注意这个才不是当前进度的颜色
}
.pie-right, .right { //裁掉左边一半
    clip: rect(0, auto, auto, 100px);
}
.pie-left, .left { //裁掉右边一半
    clip: rect(0, 100px, auto, 0);
}
.mask {//我是遮罩 mask不用改 好欣慰
    position: absolute;
    top: 25px;
    left: 25px;
    height: 150px;
    width: 150px;
    background: #fff;
    border-radius: 50%;
    text-align: center;
}

效果是介样滴:

图片描述

此时进度是0,让我们来rotate一下,先旋转30度吧

.right{
    transform: rotate(30deg);
}

于是就变成了这样:【请始终记住,红色部分是当前进度。】

图片描述

然后再旋转210度看看效果【210度就是右边完全旋转,左边再旋转30度】:

.right{
    transform: rotate(180deg);
}
.left{
    transform: rotate(30deg);
}

长这样:

图片描述

最后的最后,当进度数值动态增加时,通过js去改变旋转的角度就可以实现进度条动态变化了。
进度数值每增加1,角度增加3.6度,还要注意的是,当进度小于50%时,左侧进度条没有变化,当大于50%,左侧进度条才开始改变。
我们可以写一个函数:

function changeProcess(value) {
    var num = value * 3.6;
    if(num < 180) {
        $('.right').css('transform', 'rotate(' + num + 'deg)');
    } else {
        $('.right').css('transform', 'rotate(180deg)');
        $('.left').css('transform', 'rotate(' + (num-180) + 'deg)');
    }
}

当进度值变化时,调用这个函数即可。

jsfiddle演示

勤快的我去jsfiddle里写了一下(这个是jQuery的实现):jsfiddle

这个是Vue的实现: Vue环形进度条。用到Vue的绑定内联样式。

参考文章:
利用jQuery和CSS实现环形进度条
https://www.w3cplus.com/css3/...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过计算属性和绑定样式实现圆环进度条根据参数动态变化。 首先,在 Vue3 中创建一个组件,将参数作为组件的 props 传入。然后,使用计算属性计算出进度条样式,并将样式绑定到对应的 HTML 元素上。最后,使用 CSS 实现圆环的效果。 下面是一个示例代码: ```vue <template> <div class="progress-ring"> <div class="progress-bar" :style="progressStyle"></div> <div class="progress-label">{{ progress }}%</div> </div> </template> <script> export default { props: { progress: { type: Number, required: true, }, }, computed: { // 计算进度条样式 progressStyle() { const progress = this.progress <= 100 ? this.progress : 100; const rotation = `rotate(${(progress / 100) * 360}deg)`; return { transform: rotation, }; }, }, }; </script> <style scoped> .progress-ring { position: relative; width: 100px; height: 100px; } .progress-bar { position: absolute; width: 100%; height: 100%; border-radius: 50%; clip: rect(0, 50px, 100px, 0); background-color: #f2f2f2; transform: rotate(0deg); z-index: -1; } .progress-bar::before { content: ""; position: absolute; width: 100%; height: 100%; border-radius: 50%; clip: rect(0, 50px, 100px, 0); background-color: #2196f3; transform-origin: center center; } .progress-label { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24px; font-weight: bold; color: #2196f3; } </style> ``` 在上面的代码中,我们定义了一个名为 `progress-ring` 的容器,容器中包含一个圆环进度条和一个显示进度百分比的标签。通过计算属性 `progressStyle` 计算出进度条样式,并将样式绑定到 `progress-bar` 元素上。最后,使用 CSS 实现圆环的效果。 你可以将这个组件作为子组件嵌入到父组件中,在父组件中传入进度参数即可实现根据参数动态变化的圆环进度条

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值