Progress 圆形进度条 实现

效果图

实现过程分析

简要说明

  • 本文主要以 TypeScript + React 为例进行讲解, 但相关知识和这个关系不大. 不会也不影响阅读
  • dome 中使用到了 sass, 但用法相对简单, 不影响理解

HTML DOM 元素说明

<div className="g-progress-wrap">
    <div className="g-progress"></div>
    <div className="g-circle">
        <span className="g-circle-before"><i/></span>
        <span className="g-circle-after"><i/></span>
    </div>
    <div className="g-text">
        20%
    </div>
</div>
  • g-progress-wrap 包裹 progress, 所有的内容都在这里面
  • g-progress 主要的区域
  • 为了保证圆环有圆角效果 g-circle 内的有 2 个小圆, 放置到圆环的开始和结尾
  • g-text 放置文字区域

上面已经介绍了 html, 因为主要的处理都在css, 所以接下来只说 css

第一步, 实现一个圆

.g-progress {

    width: 100px;
    height: 100px;
    border-radius: 50%;
    background: conic-gradient(#1677ff 0, #1677ff 108deg, #eeeeee 108deg, #eeeeee 360deg);
}

image.png

  • border-radius: 50%; 实现圆形

  • 使用 background 实现背景颜色

    • conic-gradient 创建了一个由渐变组成的图像,渐变的颜色变换围绕一个中心点旋转
    • 当角度为 0 – 108deg 时, 颜色为: #1677ff; 当角度为 108deg – 360deg 时, 颜色为: #eeeeee;

第二步, 实现圆环效果

.g-progress {

    /* 新增代码 */
    /* mask: radial-gradient(transparent, transparent 44px, #000 44.5px, #000 100%); */
    -webkit-mask: radial-gradient(transparent, transparent 44px, #000 44.5px, #000 100%);
}

image.png

  • 通过使用 mask属性, 隐藏 中间区域的显示

  • radial-gradient 创建一个图像,该图像由从原点辐射的两种或多种颜色之间的渐进过渡组成

    • 当为 0 – 44px 时, 颜色为: transparent; 当为 44px – 100% 时, 颜色为: #000;
    • 设置为 transparent 时, transparent 的区域的颜色会被隐藏
  • 为什么不使用元素覆盖, 使用中间区域的隐藏

    • 如果用元素覆盖实现的话, 如果需要显示父级的背景色时, 没办法实现

第三步, 实现圆环的圆角效果

.g-circle {
    position: absolute;

    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    transform: rotate(-90deg);
    &>span {
        position: absolute;
        top: 47px;
        left: 50px;
        width: 50%;
        transform-origin: left;
        &>i {
            width: 3px;
            height: 3px;
            float: right;
            border-radius: 50%;
            background: #1677ff;
            z-index: 1;
        }
    }
    & .g-circle-after {
        transform: rotate(0deg);
    }
}

image.png

第四步, 文字效果处理

.g-text {
    position: absolute;

    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-size: 16px;
    color: #666666;
}

image.png

第五步, 进度变化时, 通过js更新

通过行内样式更新 rotate 的方式即可更新进度

参考文档

developer.mozilla.org/zh-CN/docs/…

developer.mozilla.org/zh-CN/docs/…

www.cnblogs.com/coco1s/p/15…

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYDfELEr' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片