绘制空心环形

news2024/12/24 8:19:02

1.通过几个div拼接绘制空心环形进度条。

通过 -webkit-mask: radial-gradient(transparent 150px, #fff 150px);绘制空心圆

  • html:
    <body>
      <div class="circle">
        <div class="circle-left"></div>
        <div class="circle-left-mask"></div>
        <div class="circle-right"></div>
        <div class="circle-right-mask"></div>
      </div>
    </body>
    
  • css:
    .circle {
      -webkit-mask: radial-gradient(transparent 150px, #000 150px);
      width: 400px;
      height: 400px;
      overflow: hidden;
      border-radius: 50%;
      position: relative;
    }
    .circle-left {
      width: 50%;
      height: 100%;
      background: rgb(234, 67, 15);
      position: absolute;
      left: 0;
      z-index: 1;
    }
    .circle-left-mask {
      width: 50%;
      height: 100%;
      background: #24B39B;
      transform-origin: 100% 50%;
      position: absolute;
      transition: transform 1s linear;
      left: 0;
      z-index: 2;
    }
    .circle-right {
      width: 50%;
      height: 100%;
      background: rgb(234, 67, 15);
      position: absolute;
      right: 0;
      z-index: 3;
    }
    .circle-right-mask {
      width: 50%;
      height: 100%;
      background: #24B39B;
      transition: transform 1s linear;
      transform-origin: 0% 50%;
      position: absolute;
      right: 0;
      z-index: 4;
    }
    
  • js绘制度数方法
    function drawing(rotate){
    var right = document.getElementsByClassName('circle-right-mask')[0]
    var left = document.getElementsByClassName('circle-left-mask')[0]
    rotate=rotate>360?360:rotate
    if(rotate<=180){
      right.style.transform = `rotate(${rotate}deg)`
    }else{
      right.style.transform = `rotate(180deg)`
      setTimeout(()=>{
          left.style.transform = `rotate(${rotate - 180}deg)`
          left.style.transition = `transform ${1/180*(rotate - 180)}s linear`
          right.style.opacity = 0;
        },999)
      }
    }
    

2.利用clip-path绘制环形

通过 -webkit-mask: radial-gradient(transparent 150px, #fff 150px);绘制空心圆

  • html:
      <body>
        <div class="circle">
          <div class="circle-content"></div>
          <div class="circle-content-mask"></div>
        </div>
      </body>
    
  • css:
      .circle {
        -webkit-mask: radial-gradient(transparent 150px, #000 150px);
        width: 400px;
        height: 400px;
        overflow: hidden;
        border-radius: 50%;
        position: relative;
      }
      .circle-content{
        width:100%;
        height: 100%;
        background: rgb(234, 67, 15);
        position: absolute;
        left: 0;
      }
      .circle-content-mask {
        width: 100%;
        height: 100%;
        background: #24B39B;
        left: 0;
        z-index:1;
        clip-path:polygon(50% 50%,50% 0%,50% 50%);
        -webkit-clip-path:polygon(50% 50%,50% 0%,50% 50%)
      }
    
  • 通过Math.tan计算出位置,并在90、180、270、360做特殊处理
      function drawing(rotate){
        var circle = document.getElementsByClassName('circle')[0]
        var mask = document.getElementsByClassName('circle-content-mask')[0]
        var width=circle.offsetWidth
        var r = width/2
        if(rotate<90){
          var rad = rotate * Math.PI/180;
          var x = r*Math.tan(rad)+r
          mask.style=`clip-path:polygon(50% 50%,50% 0%,${x}px 0,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,${x}px 0,50% 50%)`
        }else if(rotate==90){
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% 50%,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% 50%,50% 50%)`
        }else if(rotate<180){
          var rad1 = (rotate-90) * Math.PI/180;
          var y = r*Math.tan(rad1)+r
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% ${y}px,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% ${y}px,50% 50%)`
        }else if(rotate==180){
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,50% 100%,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,50% 100%,50% 50%)`
        }else if(rotate<270){
          var rad2 = (rotate-180) * Math.PI/180;
          var x1 = r-r*Math.tan(rad2)
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,${x1}px 100%,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,${x1}px 100%,50% 50%)`
        }else if(rotate==270){
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,0% 100%,0% 50%,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,0% 100%,0% 50%,50% 50%)`
        }else if(rotate<360){
          var rad3 = (rotate-270) * Math.PI/180;
          var y2 = r-r*Math.tan(rad3)
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,0% 100%,0% ${y2}px,50% 50%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,0% 100%,0% ${y2}px,50% 50%)`
        }else{
          mask.style=`clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,0% 100%,0% 0%,50% 0%);-webkit-clip-path:polygon(50% 50%,50% 0%,100% 0,100% 100%,0% 100%,0% 0%,50% 0%)`
        }
        mask.style.transition = `all 1s linear`
      }
    
  • 说明:

在这里插入图片描述

-#### js计算三角函数

    var sin30 = Math.sin(30 * Math.PI / 180)
    console.log(sin30);  //0.49999999999999994

    var cos60 = Math.cos(60 * Math.PI / 180)
    console.log(cos60);  //0.5000000000000001

    var tan45 = Math.tan(45 * Math.PI / 180)
    console.log(tan45);  //0.9999999999999999

css实现扇形

  • 通过linear-gradient绘制一个左右颜色不一致的圆
  • 设置一个伪类半圆,颜色和圆的一种颜色一致
  • 通多动画实现
  • 伪类旋转好多度,执行两次,如果大于180度;执行第二个动画,改变颜色,同时旋转度数执行的二次
<style>
  main{
    width: 100%;
    padding: 60px 0;
  }
  .chart{
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    align-items: center;
    margin-bottom: 29px;
	width:100%;
	
  }
  .chart > p{
    width: 199px;
  }
  .chart > div{
    width: 100px; 
    height: 100px;
    border-radius: 50%;
    background-color: #E8E2D6;
    background-image: linear-gradient(to right, transparent 50%, #b4a078 0);
  }
  .chart div::before{
    content: "";
    display: block;
    margin-left: 50%;
    height: 100%;
    border-radius: 0 100% 100% 0 / 0 50% 50% 0;
    background-color: inherit;
    transform-origin: 0 50%;
	/* 伪类旋转好多度,执行两次,如果大于180度;执行第二个动画,改变颜色,同时旋转度数执行的二次 */
    animation: pie-chart-spin 3s linear var(--count) forwards,
                pie-chart-bg 3s step-end forwards;
  }
  @keyframes pie-chart-spin {
    to { transform: rotate(180deg); }
  }
  @keyframes pie-chart-bg {
		to { background: var(--bgColor); }
	}

</style>
<body>
  <main>
  <!-- count:度数/360*2,bgColor:count大于1时是扇形的颜色#b4a078,小于1时是背景色#E8E2D6 -->
    <div class="chart" style='--count:1.6;--bgColor:#b4a078;---name:pie-chart-bg'>
      <div class="pie"></div>
    </div>
  </main>
</body>

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

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

相关文章

从0开始搭建基于VUE的前端项目(二) 安装和配置element-ui组件库

版本和地址 ElementUI 2.15.14 (https://element.eleme.io/)按需引入的插件 babel-plugin-component(1.1.1) https://github.com/ElementUI/babel-plugin-component 安装 npm install element-ui完整引入(不建议) 这种方式最后打包的源文件很大&#xff0c;造成网络资源的浪…

LeetCode-56. 合并区间【数组 排序】

LeetCode-56. 合并区间【数组 排序】 题目描述&#xff1a;解题思路一&#xff1a;排序&#xff1f;怎么排&#xff1f;当然是排各个区间的左边界&#xff0c;然后判断下一个边界的左边界与结果数组里面的右边界是否重叠。解题思路二&#xff1a;优化解题思路三&#xff1a;0 题…

Vitepress部署到GitHub Pages,工作流

效果&#xff1a; 第一步&#xff1a; 部署 VitePress 站点 | VitePress 执行 npm run docs:build&#xff0c;npm run docs:preview&#xff0c;生成dist文件 第二步&#xff1a; 手动创建.gitignore文件&#xff1a; node_modules .DS_Store dist-ssr cache .cache .temp *…

[html]基础知识点汇总

前言 经过一阵子学习后&#xff0c;把知识点全部提炼了出来&#xff0c;自我感觉比较全和简洁&#xff0c;希望能够帮到大家。 本机实验环境 火狐浏览器&#xff0c;vscode&#xff0c;windows11&#xff0c;程序运行插件&#xff1a;live server html介绍 html--前端语言…

深入PostgreSQL中的pg_global表空间

pg_global表空间的位置 在PG当中&#xff0c;一个实例(cluster)初始化完以后&#xff0c;你会看到有下边两个与表空间相关的目录生成&#xff1a; $PGDATA/base $PGDATA/global 我们再用元命令\db以及相关视图看看相应的表空间信息&#xff1a; postgres# \db …

synchronized 关键字 - 监视器锁 monitor lock

目录 一、1 synchronized 的特性 1、互斥 2、可重入 二、synchronized 使用示例 1、修饰代码块: 明确指定锁哪个对象. 2、直接修饰普通⽅法: 锁的 SynchronizedDemo 对象 3、修饰静态方法: 锁的 SynchronizedDemo 类的对象 我们重点要理解&#xff0c;synchronized 锁…

Java设计模式 | 原型模式

是什么 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。该模式的核⼼思想是基于现有的对象创建新的对象&#xff0c;⽽不是从头开始创建。 结构 抽象原型接口&#xff1a;声明一个克隆自身的方法clone()具体原型类&#xf…

飞书API(2):通过 Python 读取多维表数据

上一篇介绍了怎么通过官方的控制台调用飞书的 API 读取多维表数据&#xff0c;本篇介绍怎么通过 Python 读取多维表数据。 通过 Python 读取多维表主要分两步&#xff1a; 第一步是获取 access_token&#xff1b;第二步是拿 access_token 读取数据。 先说第二步&#xff0c;因…

SQLAlchemy 建立数据库模型之间的关系

常见关系&#xff1a; 一对多关系多对一关系多对多关系一对一关系 一对多关系&#xff08;一个作者&#xff0c;多篇文章&#xff09; ## 一对多关系&#xff0c;单作者-多文章&#xff0c;外键不可少 ## 外键(ForeignKey)总在多的那边定义,关系(relationship)总在单的那边定…

【计算机网络】四层负载均衡和七层负载均衡

前言 1、分层方式 首先我们知道&#xff0c;在计算机网络中&#xff0c;常用的协议分层方式&#xff1a;OSI和TCP/IP&#xff0c;以及实际生产中使用的协议划分方式。 在OSI中&#xff0c;各层的职责如下&#xff1a; 应用层&#xff1a;对软件提供接口以使程序能使用网络服…

CVAE——生成0-9数字图像(Pytorch+mnist)

1、简介 CVAE&#xff08;Conditional Variational Autoencoder&#xff0c;条件变分自编码器&#xff09;是一种变分自编码器&#xff08;VAE&#xff09;的变体&#xff0c;用于生成有条件的数据。在传统的变分自编码器中&#xff0c;生成的数据是完全由潜在变量决定的&…

9.图像中值腐蚀膨胀滤波的实现

1 简介 在第七章介绍了基于三种卷积前的图像填充方式&#xff0c;并生成了3X3的图像卷积模板&#xff0c;第八章运用这种卷积模板进行了均值滤波的FPGA实现与MATLAB实现&#xff0c;验证了卷积模板生成的正确性和均值滤波算法的MATLAB算法实现。   由于均值滤波、中值滤波、腐…

【QT+QGIS跨平台编译】054:【exiv2lib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、exiv2lib介绍二、文件下载三、文件分析四、pro文件五、编译实践一、exiv2lib介绍 exiv2lib 是一个用于处理图像元数据的开源 C++ 库。它可用于读取、编辑和写入图像文件中的 Exif 元数据(Exchangeable Image File Format,可交换图像文件格式)…

怎么打包出release.aar包

第一种 选择build variant 更改成release 第二钟 在gradle中选择相应任务来编译 选择assemble release如果没有这个选项&#xff0c;可能是你没有开启那个Task 收集的选项

机器学习——降维算法-奇异值分解(SVD)

机器学习——降维算法-奇异值分解&#xff08;SVD&#xff09; 在机器学习中&#xff0c;降维是一种常见的数据预处理技术&#xff0c;用于减少数据集中特征的数量&#xff0c;同时保留数据集的主要信息。奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称…

为 Linux 中的 Docker 配置阿里云和网易云国内镜像加速下载中心

由于默认情况下&#xff0c;Docker 的镜像下载中心默认为国外的镜像中心&#xff0c;使用该镜像中心拉去镜像会十分缓慢&#xff0c;所以我们需要配置国内的 Docker 镜像下载中心&#xff0c;加速 Docker 镜像的拉取。Docker 的国内镜像下载中心常用的有&#xff1a;阿里云、网…

微信小程序(黑马优购:购物车页面)

1.渲染商品页面 <template><view><!-- 商品列表的标题区域 --><view class"cart-title"><!-- 左侧的图标 --><uni-icons type"shop" size"18"></uni-icons><!-- 右侧的文本 --><text class…

力扣 1143. 最长公共子序列

题目来源&#xff1a;https://leetcode.cn/problems/longest-common-subsequence/description/ C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;动态规划。 1. 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j]&#xff1a;长度为[0, i - 1]…

Python之Opencv进阶教程(1):图片模糊

1、Opencv提供了多种模糊图片的方法 加载原始未经模糊处理的图片 import cv2 as cvimg cv.imread(../Resources/Photos/girl.jpg) cv.imshow(girl, img)1.1 平均值 关键代码 # Averaging 平均值 average cv.blur(img, (3, 3)) cv.imshow(Average Blur, average)实现效果 1.2…

备战蓝桥杯---贪心刷题1

话不多说&#xff0c;直接看题&#xff1a; 本质是一个数学题&#xff1a; 我们令xi<0表示反方向传递&#xff0c;易得我们就是求每一个xi的绝对值之和min,我们令平均值为a爸。 易得约束条件&#xff1a; x1-x2a1-a,x2-x3a2-a..... 解得x1x1-0,x2x1-((n-1)*a-a2-...an)。…