使用CSS制作动态的环形图/饼图

news2024/11/15 21:24:30

使用纯 CSS + Animation + conic-gradient 实现一个环形图。

饼图的实现思路和环形图一样,去掉中间的圆形遮盖 after 伪类元素即可。

一、构建基础样式

构建圆形节点和中间的遮盖元素。

<style>
  body {
    background-color: rgb(130, 226, 255);
  }

  .circle {
    top: 160px;
    left: 160px;
    width: 300px;
    aspect-ratio: 1;
    border: 1px solid white;
    border-radius: 50%;
    position: relative;

    &::after {
      content: "";
      position: absolute;
      top: 7px;
      left: 7px;
      width: 286px;
      height: 286px;
      border-radius: 50%;
      background: rgb(0, 183, 255);
      display: block;
      box-sizing: border-box;
    }
  }
</style>

<body>
  <div class="circle"></div>
</body>

二、设置环形、饼图

设置锥形渐变,设置三个颜色(transparent,white,transparent),方便后边通过动画动态调整

.circle {
  ...
  background: conic-gradient(transparent 0 0, white 0 90deg, transparent 90deg 360deg);
  
  &::after {
    ...
  }
}

三、添加动画

添加动画前,将 background 重置一下

.circle {
  ...
  background: conic-gradient(transparent 0 0, white 0 0, transparent 0 360deg);

  &::after {
    ...
  }
}

然后添加动画

.circle {
  ...
  animation: rotated 10s linear infinite;

  &::after {
    ...
  }
}
@keyframes rotated {
  0% {
    background: conic-gradient(transparent 0 0, white 0 0, transparent 0 360deg);
  }
  12% {
    background: conic-gradient(transparent 0 0, white 0 90deg, transparent 90deg 360deg);
  }
  25% {
    background: conic-gradient(transparent 0 90deg, white 90deg 90deg, transparent 90deg 360deg);
  }
  37% {
    background: conic-gradient(transparent 0 90deg, white 90deg 180deg, transparent 180deg 360deg);
  }
  50% {
    background: conic-gradient(transparent 0 180deg, white 180deg 180deg, transparent 180deg 360deg);
  }
  62% {
    background: conic-gradient(transparent 0 180deg, white 180deg 270deg, transparent 270deg 360deg);
  }
  75% {
    background: conic-gradient(transparent 0 270deg, white 270deg 270deg, transparent 270deg 360deg);
  }
  87% {
    background: conic-gradient(transparent 0 270deg, white 270deg 360deg, transparent 360deg 360deg);
  }
  100% {
    background: conic-gradient(transparent 0 360deg, white 360deg 360deg, transparent 360deg 360deg);
  }
}

可以看到,为渐变gradient的元素设置animation、transition是不会有过渡的效果。这是由于gradient属性并不像width这类型的属性一样,无法通过gradient的变化实现过渡效果。

四、解决过渡不生效的问题

使用 @property 自定义属性,在 gradient 各个颜色的起始、结束角度上使用。

重新调整 @keyframes 中变化的属性,不改变 gradient,而是改变我们自定义的 angle 属性。

CSS变量和@property-CSDN博客

<style>
  body {
    ...
  }
  @property --angle1 {
    syntax: '<angle>';
    initial-value: 0deg;
    inherits: false;
  }
  @property --angle2 {
    syntax: '<angle>';
    initial-value: 0deg;
    inherits: false;
  }
  .circle {
    ...
    background: conic-gradient(transparent 0 var(--angle1), white var(--angle1) var(--angle2), transparent var(--angle2) 360deg);
    ...
    &::after {
      ...
    }
  }
  @keyframes rotated {
    0% {
      --angle1: 0deg;
      --angle2: 0deg;
      /* background: conic-gradient(transparent 0 0, white 0 0, transparent 0 360deg); */
    }
    12% {
      --angle1: 0deg;
      --angle2: 90deg;
      /* background: conic-gradient(transparent 0 0, white 0 90deg, transparent 90deg 360deg); */
    }
    25% {
      --angle1: 90deg;
      --angle2: 90deg;
      /* background: conic-gradient(transparent 0 90deg, white 90deg 90deg, transparent 90deg 360deg); */
    }
    37% {
      --angle1: 90deg;
      --angle2: 180deg;
      /* background: conic-gradient(transparent 0 90deg, white 90deg 180deg, transparent 180deg 360deg); */
    }
    50% {
      --angle1: 180deg;
      --angle2: 180deg;
      /* background: conic-gradient(transparent 0 180deg, white 180deg 180deg, transparent 180deg 360deg); */
    }
    62% {
      --angle1: 180deg;
      --angle2: 270deg;
      /* background: conic-gradient(transparent 0 180deg, white 180deg 270deg, transparent 270deg 360deg); */
    }
    75% {
      --angle1: 270deg;
      --angle2: 270deg;
      /* background: conic-gradient(transparent 0 270deg, white 270deg 270deg, transparent 270deg 360deg); */
    }
    87% {
      --angle1: 270deg;
      --angle2: 360deg;
      /* background: conic-gradient(transparent 0 270deg, white 270deg 360deg, transparent 360deg 360deg); */
    }
    100% {
      --angle1: 360deg;
      --angle2: 360deg;
      /* background: conic-gradient(transparent 0 360deg, white 360deg 360deg, transparent 360deg 360deg); */
    }
  }
</style>

完整代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      body {
        background-color: rgb(130, 226, 255);
      }
      @property --angle1 {
        syntax: "<angle>";
        initial-value: 0deg;
        inherits: false;
      }
      @property --angle2 {
        syntax: "<angle>";
        initial-value: 0deg;
        inherits: false;
      }
      .circle {
        top: 160px;
        left: 160px;
        width: 300px;
        aspect-ratio: 1;
        border-radius: 50%;
        position: relative;
        background: conic-gradient(transparent 0 var(--angle1), white var(--angle1) var(--angle2), transparent var(--angle2) 360deg);
        animation: rotated 10s linear infinite;
        &::after {
          content: "";
          position: absolute;
          top: 7px;
          left: 7px;
          width: 286px;
          height: 286px;
          border-radius: 50%;
          background: rgb(0, 183, 255);
          display: block;
          box-sizing: border-box;
        }
      }
      @keyframes rotated {
        0% {
          --angle1: 0deg;
          --angle2: 0deg;
          /* background: conic-gradient(transparent 0 0, white 0 0, transparent 0 360deg); */
        }
        12% {
          --angle1: 0deg;
          --angle2: 90deg;
          /* background: conic-gradient(transparent 0 0, white 0 90deg, transparent 90deg 360deg); */
        }
        25% {
          --angle1: 90deg;
          --angle2: 90deg;
          /* background: conic-gradient(transparent 0 90deg, white 90deg 90deg, transparent 90deg 360deg); */
        }
        37% {
          --angle1: 90deg;
          --angle2: 180deg;
          /* background: conic-gradient(transparent 0 90deg, white 90deg 180deg, transparent 180deg 360deg); */
        }
        50% {
          --angle1: 180deg;
          --angle2: 180deg;
          /* background: conic-gradient(transparent 0 180deg, white 180deg 180deg, transparent 180deg 360deg); */
        }
        62% {
          --angle1: 180deg;
          --angle2: 270deg;
          /* background: conic-gradient(transparent 0 180deg, white 180deg 270deg, transparent 270deg 360deg); */
        }
        75% {
          --angle1: 270deg;
          --angle2: 270deg;
          /* background: conic-gradient(transparent 0 270deg, white 270deg 270deg, transparent 270deg 360deg); */
        }
        87% {
          --angle1: 270deg;
          --angle2: 360deg;
          /* background: conic-gradient(transparent 0 270deg, white 270deg 360deg, transparent 360deg 360deg); */
        }
        100% {
          --angle1: 360deg;
          --angle2: 360deg;
          /* background: conic-gradient(transparent 0 360deg, white 360deg 360deg, transparent 360deg 360deg); */
        }
      }
    </style>
  </head>
  <body>
    <div class="circle"></div>
  </body>
</html>

饼图例子

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      body {
        background-color: rgb(130, 226, 255);
      }
      @property --angle {
        syntax: "<angle>";
        initial-value: 0deg;
        inherits: false;
      }
      .circle {
        top: 160px;
        left: 160px;
        width: 300px;
        aspect-ratio: 1;
        border: 1px solid white;
        border-radius: 50%;
        position: relative;
        background: conic-gradient(white 0 var(--angle), transparent var(--angle) 360deg);
        transition: --angle 0.5s linear;
        
        &:hover {
          --angle: 360deg;
        }
      }
    </style>
  </head>
  <body>
    <div class="circle"></div>
  </body>
</html>

GIF 略显卡顿🤣🤣

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GIS之深度学习08:安装GPU环境下的pytorch

环境&#xff1a; cuda&#xff1a;12.1.1 cudnn&#xff1a;12.x pytorch&#xff1a;2.2.0 torchvision&#xff1a;0.17.0 Python&#xff1a;3.8 操作系统&#xff1a;win &#xff08;本文安装一半才发现pytorch与cuda未对应&#xff0c;重新安装了cuda后才开始的&a…

时间服务器

目录 软件介绍 软件安装 准备工作 设置当前时区 修改chronyd配置文件 设置允许哪个客户端可以访问该服务器 设置本地服务器时间为第10层级 时钟层&#xff1a; 实例:配置时间服务器客户端服务端 Serves Client 配置环境&#xff1a; systemctl命令 lsof 命令 语法 选项 lsof输…

JL15-80/11电流继电器 过电流瞬时动作 电磁式结构 80A 一开一闭

JL15电流继电器 系列型号 JL15-1.5/11电流继电器JL15-2.5/11电流继电器 JL15-5/11电流继电器JL15-10/11电流继电器 JL15-15/11电流继电器JL15-20/11电流继电器 JL15-30/11电流继电器JL15-40/11电流继电器 JL15-60/11电流继电器JL15-80/11电流继电器 JL15-100/11电流继电器JL15…

mac本地启动sentinel

启动Sentinel控制台 1&#xff09;下载sentinel控制台jar包 https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar 2&#xff09;启动sentinel控制台 使用如下命令启动控制台&#xff1a; java -Dserver.port8080 -Dcsp.sentinel.d…

[清爽快捷] Ubuntu上多个版本的cuda切换

做到真正的一行代码搞定&#xff0c;只需要修改对应软链接&#xff0c;就可以轻松实现快捷切换cuda 查看已安装的cuda版本有哪些 一般如果我们都是使用默认位置安装cuda的话&#xff0c;那么其安装路径都是/usr/local。如果要查看该目录下已经安装有哪些版本的cuda&#xff0c…

腾讯面经学习笔记

&#x1f496; 前言 &#x1f469;‍&#x1f3eb; 参考地址 &#x1f496; 操作系统 1. 进程和线程的区别 本质区别 进程是操作系统资源分配的基本单位线程是任务调度和执行的基本单位 开销方面 每个进程都有独立的代码和数据空间&#xff08;程序上下文&#xff09;&#…

git使用教程14-Pycharm版本控制与分支管理

一、版本控制 1、版本控制介绍 &#xff08;1&#xff09;Version Control System 版本控制系统&#xff0c;简称VCS。 &#xff08;2&#xff09;版本控制系统分类&#xff1a; 集中式版本控制工具&#xff1a;SVN 分布式版本控制工具&#xff1a;Git 2、Pycharm 支持的版本…

二分应用的小坑———折半查找

啊!啊!啊!啊!啊!!! 太久没有写代码了 虽热很久没有写代码和博客了&#xff0c;但是功底还是在的 今天打算写一点数据结构的排序部分一点一点落实下来&#xff0c;但是 写着写着卡壳了&#xff0c;以下是没有debug的代码 #include <iostream> #include<bits/stdc.h&g…

PyTorch2.0 环境搭建详细步骤(Nvidia显卡)

Step 1 、查看显卡驱动版本 Step2、下载CUDA 11.7 或者11.8&#xff08;我自己用的这个&#xff09;也行,稍后我会贴出来版本匹配对应表 https://developer.nvidia.com/cuda-toolkit-archive Step3、下载CUDNN cuDNN 9.0.0 Downloads | NVIDIA Developer Step4、安装anconda&…

开源模型应用落地-工具使用篇-Spring AI(七)

一、前言 在AI大模型百花齐放的时代&#xff0c;很多人都对新兴技术充满了热情&#xff0c;都想尝试一下。但是&#xff0c;实际上要入门AI技术的门槛非常高。除了需要高端设备&#xff0c;还需要面临复杂的部署和安装过程&#xff0c;这让很多人望而却步。不过&#xff0c;随着…

HCIA-HarmonyOS设备开发认证V2.0-习题2

目录 习题一习题二坚持就有收获 习题一 # 判断题## 1.PWM占空比指的是低电平时间占周期时间的百分比。(错误)正确(True)错误(False)解题&#xff1a; - PWM占空比指的是高电平时间占周期时间的百分比## 2.UART是通用异步收发传输器&#xff0c;是通用串行数据总线&#xff0c;…

vue router 解决路由带参数跳转时出现404问题

我的页面是从一个vue页面router跳转到另一个vue页面&#xff0c;并且利用windows.open() 浏览器重新创建一个页签。但是不知道为什么有时候可以有时候又不行&#xff0c;经过反复测试与分析&#xff0c;最终发现是因为有一个参数的值里包含了小数点., 小数点是浏览器合法字符&a…

COMSOL热应力仿真

热应力 热膨胀子节点 热膨胀输入类型 假如直接知道热膨胀大小&#xff0c;可以直接对热应变进行赋值。 约束与载荷 对于自由膨胀&#xff0c;可以添加抑制刚体运动。 案例分析 在参数部分&#xff0c;设定体积参考温度Tref&#xff0c;假定在25[degC]模型无热应变。 APP开发器-…

git分布式管理-头歌实验搭建Git服务器

一、Git服务器搭建 任务描述 虽然有提供托管代码服务的公共平台&#xff0c;但是对一部分开发团队来说&#xff0c;为了不泄露项目源代码、节省费用及为项目提供更好的安全保护&#xff0c;往往需要搭建私有Git服务器用做远程仓库。Git服务器为团队的开发者们&#xff0c;提供了…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ImageSpan)

Text组件的子组件&#xff0c;用于显示行内图片。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 ImageSpan(value: ResourceStr | PixelMap) 参数&#xff1a; 参数名参数类…

ShardingSphere-SQL 解析 Issue 处理流程

ShardingSphere-SQL 解析 Issue 处理流程 这是之前给社区写的 SQL 解析 Issue 的处理流程&#xff0c;可以帮助社区用户快速参与到 ShardingSphere-SQL 解析任务当中。 ShardingSphere SQL 解析 issue 列表 Issue 背景说明 当前 Issue 使用自定义的爬虫脚本从对应的数据库官…

vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载

文章目录 导文文章重点内容效果展示&#xff1a;代码展示这些方法适用于哪些场景 总结 导文 vue2 div滚动条下拉到底部时触发事件(懒加载) 超级简易版本的懒加载 文章重点 内容效果展示&#xff1a; 当div拉到底部的时候&#xff1a; 编辑器返回&#xff1a; 代码展示 在…

分享axios+MQTT简单封装示例

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在19…

鸿蒙实战开发Camera组件:【相机】

相机组件支持相机业务的开发&#xff0c;开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发&#xff0c;最常见的操作如&#xff1a;预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后&#xff0c;在缓冲区内重复采集…

IP地址定位技术的主要功能及应用

在互联网时代&#xff0c;IP地址定位技术成为了一项重要的技术&#xff0c;它通过分析用户的IP地址&#xff0c;确定用户的地理位置信息。IP地址定位技术不仅在网络安全、网络管理等领域有着重要的应用&#xff0c;也在商业、广告营销等领域发挥着重要作用。IP数据云将探讨IP地…