6、如何实现一个环形的进度条

一、DIV + CSS3


这个是最基本的实现方式,我在想怎样用尽量少的DOM结构来实现,最终还是用了三个div,不过这个方法仅供开阔思路,样式表现在PC还好,手机上的问题就多了,仅供参考。

1、利用div的border画一个背景的圆环

    <div class="demo1-bg1"></div>
    /* css */
    .demo1-bg1{
        width: 100px;
        height: 100px;
        display: -webkit-box;
        -webkit-box-pack: center;
        -webkit-box-align: center;
        margin: 50px auto;
        background: fff;
        border-radius: 50%;
        box-shadow: 0 0 0 10px red inset;
    }

在这里插入图片描述

2、添加两个子元素div,分别设置border来实现两个半圆环并遮盖背景圆环

    <div class="demo1-bg1">
        <div id="J_bg2_1" class="demo1-bg2-1"></div>
        <div id="J_bg2_2" class="demo1-bg2-2"></div>
    </div>
    /* css */
    .demo1-bg2-1,.demo1-bg2-2{
        position: relative;
        margin: 0;
        padding: 0;
        -webkit-box-flex: 1;
        height: 80px;
        background: #fff;
        border: 10px solid grey;
    }
    .demo1-bg2-1{
        border-radius: 50px 0 0 50px;
        border-color: grey transparent grey grey;
        transform-origin: 100% 50%;
        z-index: 1;
    }
    .demo1-bg2-2{
        border-radius: 0 50px 50px 0;
        border-color: grey grey grey transparent;
        transform-origin: 0 50%;
        z-index: 2;
    }

在这里插入图片描述
3、用JS旋转两个子元素,露出背景圆环
在这里插入图片描述

var bg1 = document.querySelector("#J_bg2_1");
var bg2 = document.querySelector("#J_bg2_2");
var btn1 = document.querySelector("#J_btn_1");
var btn2 = document.querySelector("#J_btn_2");

window.onload = rotateCircle;

btn2.onclick = rotateCircle;
function rotateCircle () {
    var val = parseFloat(btn1.value).toFixed(2);
    val = Math.max(0,val);
    val = Math.min(100,val);
    if (val <= 50){
        bg2.style.transform = "rotate(" + 180 * val * 2 / 100 + "deg)";
        bg2.style.borderColor = "grey grey grey transparent";
        bg1.style.transform = "rotate(0deg)";
    }else{
        bg2.style.transform = "rotate(0deg)";
        bg2.style.borderColor = "red red red transparent";
        bg1.style.transform = "rotate(" + 180 * (val - 50) * 2 / 100 + "deg)";
    }
}

二、SVG

这个原理也很简单,是利用SVG的stroke和dash-array属性来实现,也是我常用的实现方式。

1、绘制一个圆环路径,填充灰色圆环

<svg xmlns="http://www.w3.org/200/svg" height="150" width="110">
    <circle cx="55" cy="55" r="50" fill="none" stroke="grey" stroke-width="5" stroke-linecap="round"/>
</svg>

在这里插入图片描述
2、绘制一个内圆环,半径/圆心和外圆环一样,刚好重叠

<circle class="demo2" id="J_progress_bar" 
cx="55" cy="55" r="50" fill="none" 
stroke="red" stroke-width="5"/>

在这里插入图片描述
3、设置内圆环的stroke-dasharray属性,stroke-dasharray的值得意思是,第一个值为圆环第一段填充颜色的长度,第二个值为圆环接下来不填充颜色的长度,以此类推并重复。这里设置为:stroke-dasharray=“0,10000” 第一个值就是填充红色的值,为0,第二段为不填充的长度,超过圆环的周长即可。此时进度条为0%:
在这里插入图片描述
这时候发现stroke-dasharray填充是从3点钟位置开始的,所以就让内圆环旋转-90度:

.demo2{
    transform-origin: center;
    transform: rotate(-90deg);
}
.demo2{
    transform-origin: center;
    transform: rotate(-90deg);
}

在这里插入图片描述
4、JS控制内圆环的stroke-dasharray的值来控制内圆环第一段绘制红色的长度

var demo2 =  document.querySelector("#J_demo2");
var btn1 = document.querySelector("#J_btn_1");
var btn2 = document.querySelector("#J_btn_2");

var circleLength = Math.floor(2 * Math.PI * demo2.getAttribute("r"));

window.onload = rotateCircle;

btn2.onclick = rotateCircle;
function rotateCircle () {
    var val = parseFloat(btn1.value).toFixed(2);
    val = Math.max(0,val);
    val = Math.min(100,val);
    demo2.setAttribute("stroke-dasharray","" + circleLength * val / 100 + ",10000");
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 PySide6 实现环形进度条的示例代码: ```python import sys from PySide6.QtCore import Qt, QTimer from PySide6.QtGui import QPainter, QColor, QPen from PySide6.QtWidgets import QApplication, QWidget class CircularProgressBar(QWidget): def __init__(self): super().__init__() self._progress = 0 self._timer = QTimer(self) self._timer.timeout.connect(self.updateProgress) self._timer.start(50) self.setWindowTitle("Circular Progress Bar") self.setFixedSize(200, 200) self.show() def updateProgress(self): self._progress += 1 if self._progress > 100: self._progress = 0 self.update() def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) pen = QPen() pen.setWidth(10) pen.setColor(QColor("#1E90FF")) painter.setPen(pen) painter.drawArc(20, 20, 160, 160, 0, self._progress * 3.6 * 16) if __name__ == "__main__": app = QApplication(sys.argv) progress_bar = CircularProgressBar() sys.exit(app.exec()) ``` 在上面的代码中,CircularProgressBar 类继承自 QWidget 类,它包含了一个 QTimer 对象,用于定时更新进度条的值,并实现了 updateProgress() 和 paintEvent() 方法。 updateProgress() 方法简单地增加进度条的值,并在值达到 100 后将其重置为 0。 paintEvent() 方法绘制了一个圆弧,表示当前进度。圆弧的起始角度为 0,结束角度为当前进度乘以 3.6(即一度的角度)乘以 16(表示 1/16 的精度)。 运行上面的代码,将会看到一个环形进度条,每隔 50 毫秒更新一次进度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值