纯css实现百分比环形图

本文详细介绍了如何使用HTML、CSS和JavaScript创建一个动态的环形进度条,包括各个层的布局、样式设置和百分比值变化时的动画效果。通过设置不同条件,实现了百分比值大于50时隐藏遮罩,小于50时显示遮罩,从而形成扇形环效果。同时,提供了一段示例代码和效果展示,并调用了不同百分比值以验证功能。
摘要由CSDN通过智能技术生成

一、原型图

在这里插入图片描述

二、思路

第1层,绘制饼图(shape)和灰色细环部分(bottom),其中shape是根元素,所有元素都将相对shape做绝对定位。根据原型图的显示效果,对bottom的定位做一定的调整如图所示:

在这里插入图片描述

第2层,绘制左环(ring-left)和右环(ring-right)如图所示:

在这里插入图片描述

第3层,绘制遮罩环(.ring-hide),调整与第1层的环吻合,用于遮住右环和转动到右边区域的左环部分,制作出扇形图的效果,如图所示:
在这里插入图片描述
第4层,显示百分比值的圆(.cover),层级最高,放在中间做遮罩,制作出环状效果。如图所示:
在这里插入图片描述

从以上几个图可以看出两种情况:

  1. 当百分比值大于50时,遮罩层不显示,右环显示,转动左环,左环跟右环部分重叠。
  2. 当百分比值小于50时,遮罩层显示,转动左环,遮罩层遮住全部的右环和部分左环,显示出扇形环的效果。

三、代码

<div class="shape">
    <div class="bottom"></div>
    <div class="cover">100%</div>
    <div class="ring-left"></div>
    <div class="ring-right"></div>
    <div class="ring-hide"><div></div></div>
</div>
.shape{
    width: 100px;
    height: 100px;
    text-align: center;
    line-height: 100px;
    border-radius: 50%;
    font-weight: bold;
    color: #fff;
    position: relative;
}
.shape>div{
    position: absolute;
}
.shape>.bottom{
    width: 85px;
    height: 85px;
    border-radius: 50%;
    background-color: #fff;
    border: 4px solid #c0c3c2;
    top: 3px;
    left: 3px;
}
.shape>.cover{
    border-radius: 50%;
    width: 79px;
    height: 79px;
    background-color: #FFF;
    z-index: 10;
    top: 10px;
    left: 10px;
    color: #000;
    line-height: 79px;
    font-size: 18px;
}
.shape>.ring-left{
    width: 50px;
    height: 100px;
    border-radius: 50px 0 0 50px;
    background-color: #00ccf6;
    transform-origin: right center;
    transform: rotate(0deg);
}
.shape>.ring-right{
    width: 50px;
    height: 100px;
    border-radius: 0 50px 50px 0;
    background-color: #00ccf6;
    left: 50px;
    transform-origin: left center;
    transform: rotate(0deg);
}
.shape>.ring-hide{
    z-index: 9;
    border-radius: 0 51px 51px 0;
    width: 52px;
    height: 102px;
    background-color: #fff;
    top: -1px;
    left: 49px;
    transform-origin: left center;
    display: none;
    transform: rotate(0deg);
}
.shape>.ring-hide>div{
    z-index: 10;
    border-radius: 0 50px 50px 0;
    width: 43px;
    height: 85px;
    background-color: transparent;
    top: 4px;
    left: 0px;
    color: #000;
    line-height: 85px;
    position: absolute;
    border: 4px solid #c0c3c2;
    border-left: 0;
}
function setPercentValue(value) {
    let cover = document.querySelector('.shape>.cover'),
        left = document.querySelector('.shape>.ring-left'),
        hide = document.querySelector('.shape>.ring-hide');
    let deg;//左环转动角度
    if (Number.isNaN(value) || value < 0) value = 0;
    if (value > 100) value = 100;
    if(value % 1 !== 0){  //若value为小数,保留一位小数
        value = value.toFixed(1);
    }
    cover.innerText = value + "%";
    if (value < 50) {  //值小于50,显示遮罩
        hide.style.display = "inherit";
        deg = (50 - value)/50 * 180;
    } else {  //值大于或等于50,不显示遮罩
        hide.style.display = "none";
        deg =  (50 - (value - 50))/50 * 180;
    }
    left.style.transform = "rotate("+ (-deg) +"deg)";
}

四、效果

//调用
setPercentValue(-45);
setPercentValue(0);
setPercentValue(45.624);
setPercentValue(50.0);
setPercentValue(78.4);
setPercentValue(98);
setPercentValue(100);
setPercentValue(150);
setPercentValue("hahaha");

在这里插入图片描述

  • 12
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的HTML和CSS实现轮播的示例: ```html <!DOCTYPE html> <html> <head> <title>轮播</title> <style type="text/css"> .container { position: relative; width: 600px; height: 400px; overflow: hidden; } .container img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; transition: opacity 1s ease-in-out; } .container img.active { opacity: 1; } </style> </head> <body> <div class="container"> <img src="image1.jpg" class="active"> <img src="image2.jpg"> <img src="image3.jpg"> </div> <script type="text/javascript"> var images = document.getElementsByTagName('img'); var index = 0; setInterval(function() { images[index].className = ''; index = (index + 1) % images.length; images[index].className = 'active'; }, 2000); </script> </body> </html> ``` 解释一下代码: 1. HTML部分:使用一个`div`元素作为容器,其中包含了三个`img`元素,分别对应三张片。第一张片默认添加了`active`类,表示默认显示。 2. CSS部分:设置了`.container`元素的样式,使其具有相对定位、固定宽高、隐藏溢出等特性;设置了`.container img`元素的样式,使其具有绝对定位、铺满容器、透明度为0(不可见)等特性;设置了`.container img.active`元素的样式,使其透明度为1(可见)。 3. JavaScript部分:获取所有`img`元素,初始化`index`值为0,使用`setInterval`函数每隔2秒钟执行一次匿名函数。匿名函数将当前显示的`img`元素的`active`类移除,将`index`值自增1并取余,再将下一个`img`元素添加`active`类,实现轮播效果。 注意:这个示例仅作为参考,实际应用中可能需要根据需求进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值