• css实现圆形进度条


    能用现成组件就用,实现不行再自己写,因为牵扯到上传文件,进度实时出不来,所以只能使用dom元素操作;

    1.实现

    效果:

    上图是100%,如果需要根据百分比显示,我们需要看下代码里面left和right的旋转角度,这个圆实现上,以垂直直径切割,是左右两部分,调整css transform即可。

    代码如下:

    html

    1. percentHtml.innerHTML = `<div class="progress">
    2. <span class="title">span>
    3. <div class="overlay">div>
    4. <div class="left" style="transform: rotate(${get_deg(percenNum)?.left_deg}deg);z-index: ${get_deg(percenNum)?.zIndex_left};">div>
    5. <div class="right" style="transform: rotate(${get_deg(percenNum)?.right_deg}deg);">div>
    6. div>`

    css

    1. * {
    2. box-sizing: border-box;
    3. padding: 0;
    4. margin: 0;
    5. }
    6. .progress {
    7. width: 20px;
    8. height: 20px;
    9. color: #fff;
    10. border-radius: 50%;
    11. overflow: hidden;
    12. position: relative;
    13. background: #dcdcdc;
    14. text-align: center;
    15. line-height: 200px;
    16. box-shadow: 2px 2px 2px 2px white;
    17. mask: radial-gradient(transparent 7px, #000 8px);
    18. -webkit-mask: radial-gradient(transparent 7px, #000 8px)
    19. }
    20. .progress .overlay {
    21. width: 50%;
    22. height: 100%;
    23. position: absolute;
    24. top: 0;
    25. left: 0;
    26. z-index: 1;
    27. background-color: #dcdcdc;
    28. }
    29. .progress .left,
    30. .progress .right {
    31. width: 50%;
    32. height: 100%;
    33. position: absolute;
    34. top: 0;
    35. left: 0;
    36. border: 10px solid #29b6f6;
    37. border-radius: 100px 0px 0px 100px;
    38. border-right: 0;
    39. transform-origin: right;
    40. }

     2.原理及函数

    可以用这个原理实现百分比:

    1)0%,left为0deg(z-index为0,因为right在左边,所以需要index为0至在灰色下面),right为0deg;

    2)当百分比小于50%且不为0的时候,左边不需要百分比:继续为0度,右边180度是50%,计算出1%是多少度:180 / 50% = 3.6度(度/1%),乘以百分比即可;

    3)大于50%,right为180deg,left对应:100%是0deg,z-Index = 10,75%对应-90deg,以此为例,那么计算规律是,75% - 50% = 25%,25 * 3.6 = 90,因为left是逆时针计算,所以需要用180 - 90 = 90,再添加一个符号即可(数学上直接减180结果一样),就是-90deg。

    4)100%,left为0deg(z-index=10,覆盖左侧overlay),right为180deg;

    如下函数:

    1. // 定义一个名为get_deg的函数,接收一个名为percent的number类型参数
    2. const get_deg = (percent: number) => {
    3. let left_deg = 0; // 初始化左边角度为0
    4. let right_deg = 0; // 初始化右边角度为0
    5. let zIndex_left = 0; // 初始化左边zIndex为0
    6. const one_percent_deg = 180 / 50; // 计算每个百分比所占的角度(3.6度/1%)
    7. if (percent) { // 判断传入的百分比是否存在(非0、非undefined、非null等)
    8. if (percent <= 50 && percent > 0) { // 如果百分比小于等于50且大于0
    9. console.log('小于50大于0');
    10. left_deg = 0; // 左边角度为0
    11. right_deg = percent * one_percent_deg; // 右边角度为百分比乘以每个百分比所占的角度
    12. } else if (percent > 50 && percent < 100) { // 如果百分比大于50且小于100
    13. console.log('50到100');
    14. left_deg = (percent - 50) * one_percent_deg - 180; // 左边角度为百分比减去50再乘以每个百分比所占的角度,再减去180度
    15. zIndex_left = 10; // 左边zIndex为10
    16. right_deg = 180; // 右边角度为180度
    17. } else if (percent === 100) { // 如果百分比等于100
    18. console.log('等于100');
    19. left_deg = 0; // 左边角度为0
    20. zIndex_left = 10; // 左边zIndex为10
    21. right_deg = 180; // 右边角度为180度
    22. }
    23. }
    24. // 返回一个对象,包含左边角度、右边角度和左边zIndex
    25. return {
    26. left_deg,
    27. right_deg,
    28. zIndex_left
    29. }
    30. }

    特别注意一点,在 左侧半圆环,大于50%的时候,需要给左侧添加z-index=100,因为:其实他们左右的颜色大小都是不变的,只是在旋转,给我们视觉上的效果,就像是百分比一样。

    我们给左侧限制了-180度的最小值,就是不让他旋转到右侧,而右侧0度的最小限制也是一个意思。

    在大于50%的时候右侧为180度,我们看如果75%的时候,也是就左侧25%,且设置右侧小于180度会发生什么:

    这里设置的左侧旋转-90度,右侧为80度,我们清晰的看到左侧的环形会来到右侧,中间会有缝隙,当然我们大于50%的时候,右侧会占满,同时使用z-index灵活去遮挡,就给我们视觉上看到正确的百分比,这里需要理解并实践。

    注:代码参考自网络,有改变,仅做记录、参考使用

  • 相关阅读:
    这些嵌入式系统安全性的知识你需要了解
    计算机网络 | 第三章 数据链路层 | 王道考研自用笔记
    【数学建模】Topsis法python代码
    elasticsearch集群搭建,以及kibana和ik分词器的安装(7.3.2)
    LeetCode 面试题 16.18. 模式匹配
    Java后端模拟面试 题集④
    1.数据库的连接、创建会话与模型
    linux权限的深刻理解
    Unity的UI面板基类
    无线开发:Wireless Communication Library-Crack
  • 原文地址:https://blog.csdn.net/q553866469/article/details/134049049