如何在CSS中绘制圆扇形?


77

好吧,用纯​​CSS画一个圆很容易。

.circle {
    width: 100px;
    height: 100px;
    border-radius: 100px;
    border: 3px solid black;
    background-color: green;
}

我该如何画图?给定X度[0-360],我想绘制一个X度扇形。我可以使用纯CSS做到这一点吗?

例如:

在此处输入图片说明

谢谢+示例

谢谢乔纳森,我用了第一种方法。如果对某人有帮助,这里有一个JQuery函数示例,该函数获取百分比并绘制一个扇区。扇形位于百分比圆的后面,此示例显示了如何从起始角度开始围绕圆的圆弧。

JSFiddle演示

$(function drawSector() {
    // Get degrees
    ...
    // Draw a sector
    if (deg <= 180) {
        activeBorder.css('background-image', 'linear-gradient(' + (90+deg) + 'deg, transparent 50%, #A2ECFB 50%), linear-gradient(90deg, #A2ECFB 50%, transparent 50%)');
    }
    else {
        activeBorder.css('background-image', 'linear-gradient(' + (deg-90) + 'deg, transparent 50%, #39B4CC 50%), linear-gradient(90deg, #A2ECFB 50%, transparent 50%)');
    }

    // Rotate to meet the start degree
    activeBorder.css('transform','rotate(' + startDeg + 'deg)');
});

Answers:


167

CSS和多个背景渐变

与其尝试绘制绿色部分,不如绘制白色部分:

pie {
    border-radius: 50%;
    background-color: green;
}

.ten {
    background-image:
        /* 10% = 126deg = 90 + ( 360 * .1 ) */
        linear-gradient(126deg, transparent 50%, white 50%),
        linear-gradient(90deg, white 50%, transparent 50%);
}

演示:http : //jsfiddle.net/jonathansampson/7PtEm/

在此处输入图片说明

可缩放矢量图形

如果可以选择,则可以使用SVG<circle><path>元素实现类似的效果。考虑以下:

<svg>
  <circle cx="115" cy="115" r="110"></circle>
  <path d="M115,115 L115,5 A110,110 1 0,1 190,35 z"></path>
</svg>

以上是很简单的。我们有一个包含圆和路径的元素。圆的中心为115x115(使SVG元素为230x230)。圆的半径为110,使其总宽度为220(留有10个边界)。

然后<path>,我们添加一个元素,这是此示例中最复杂的部分。该元素具有一个属性,该属性确定路径的位置以及绘制方式。它以以下值开头:

M115,115

这指示路径从上述圆的中心开始。接下来,我们从该位置绘制一条线到下一个位置:

L115,5

这将从圆心到元素顶部绘制一条垂直线(从顶部开始五个像素)。在这一点上,事情变得有些复杂,但仍然非常可理解。

现在,我们从当前位置绘制一条弧线(115,5):

A110,110 1 0,1 190,35 z

这将创建我们的弧,并为其提供与圆(110)的半径匹配的半径。这两个值分别代表x半径和y半径,并且由于我们要处理的是圆,所以两个值相等。下一组重要数字是最后一个190,35。这告诉弧在哪里完成。

至于其余的信息(1 0,1z),这些信息控制弧本身的曲率,方向和终点。您可以通过参考任何在线SVG路径参考来了解有关它们的更多信息。

要完成不同大小的“切片”,只需更改190,35即可反映更大或更小的一组坐标。您可能会发现,如果要跨度超过180度,则需要创建第二条弧线。

如果要从某个角度确定x和y坐标,则可以使用以下方程式:

x = cx + r * cos(a)
y = cy + r * sin(a)

对于上面的示例,程度为76:

x = 115 + 110 * cos(76)
y = 115 + 110 * sin(76)

这给了我们205.676,177.272

轻松一点,您可以创建以下内容:

演示:http//jsfiddle.net/jonathansampson/tYaVW/

在此处输入图片说明


2
好答案!很彻底 应该注意的是,如果要使饼的未使用部分具有透明背景,则必须使用SVG方法。
尼尔·梦露

@NeilMonroe是正确的,尽管某些馅饼的排列可以用透明的颜色完成,从而揭示了馅饼背后的内容。
桑普森

4
@JonathanSampson对我有很大帮助。.希望我能再投票10次。谢谢:)
Hiral

2
这里有个提示:添加一些变换pie { transform: rotate(-90deg) }可以使计算更容易
Endless

1
那不是cos(76 * pi / 180)和sin(76 * pi / 180)吗?下面是76度,您必须从右侧开始:141.611408516,221.7325298904dropbox.com/ s
Intellix

34

使用overflowtransform属性非常有可能,而无需进行复杂的计算。

>旋转变换

小于180度的角度

  1. 添加宽高比为2:1的元素,然后overflow: hidden;

  2. 添加一个伪元素,其顶部边框半径与元素的高度相同,底部半径为0。

  3. 放置transform-origin: 50% 100%;此操作从其中间底部转换伪元素。

  4. 转换:rotate(); 通过所需角度的补充伪元件,
    transform: rotate(180 - rqrd. angle);

看看它怎么运作 :

在此处输入图片说明

EG:
使用这种方法的40度扇形区:小提琴

div {
  ...
  overflow: hidden;
  ...
}
div:before {
  ...
  border-radius: 100px 100px 0 0;
  transform-origin: 50% 100%;
  transform: rotate(140deg);
  ...
}

>偏斜变换

您也可以将图像放入扇区!

可以使用skew父元素上的转换和伪元素上的-ve偏斜来完成:
Fiddle

div {
    ...
    overflow: hidden;
    transform-origin: 0% 100%;
    transform: skew(-50deg);  /*Complement of rqrd angle*/
    ...
}
div:before {
    ...
    transform-origin: 0% 100%;
    transform: skew(50deg);
    ...
}

看看这是如何工作的:

在此处输入图片说明


致谢:我不想成为一个自盗者,我使用了以前在这里这里使用过的想法。


19

这有帮助吗?

.circle {
  width: 16em;
  height: 16em;
  border-radius: 50%;
  background: linear-gradient(36deg, #272b66 42.34%, transparent 42.34%) 0 0;
  background-repeat: no-repeat;
  background-size: 50% 50%;
}
<div class="circle"></div>

工作小提琴

实际上,这里需要进行一些几何计算。但让我简单地解释一下:

考虑圆的四个四分之一,可以在每个四分之一中计算线性梯度的角度。并background-position确定季度:

Q I   =>  100% 0
Q II  =>  100% 100%
Q III =>  0    100%
Q IV  =>  0    0

唯一剩下的就是使用的色标来自哪里:

考虑在第一季度有一个30角的圆。

正如才华横溢的安娜•都铎(Ana Tudor)在她的出色文章中所解释的,如果我们将正方形的宽度的长度取为a,那么对角线的一半的长度将为a*sqrt(2)/2

如果我们将梯度度作为g两个梯度角和对角线之间的差,d则长度的color-stop计算公式为:

a*sin(g) / (a*sqrt(2)/2 * cos(d))
= sin(g) / (sqrt(2)  /2 * cos(d)) 

因此,在这种情况下,我们有sin(30deg) / (sqrt(2)*cos((45-30)deg)) = 0.3660,并且色标的%值为36.60%

由于我们的形状在第一季度,所以background-position100% 0

和线性梯度将是这样的

linear-gradient(-30deg, orange 36.60%, transparent 36.60%) 100% 0;

我建议阅读Ana的文章以了解更多详细信息。


我不确定我是否了解解决方案。如果我想将度数设置为236,该怎么办?如果将36deg的值更改为236deg,则无法获得预期的结果。
Itay Gal 2014年

@ItayGal您可能想阅读Ana Tudor撰写的精彩文章
拉尔斯·贝克

当我尝试将此方程式用于120度时,它将无法正常工作。.请给我一个示例,显示120度的方程式
grvpanchal 2014年

9

由于我根本找不到令人满意的答案,因此我不得不屈服,使用剪切路径功能和整个CSS的星期日来终于得到我想要的东西。

您可以选择一个起始角度和一个结束角度,然后元素将很好地绘制出该角度,没有别的。您只需要边界半径解决方案即可绘制基圆。

我的解决方案使用四个多边形的网格,每个多边形提供一个可能的起点或终点,分别为0-90°。0-100%,90-180°。0-100%,依此类推,共享中心点,因此有两次乘以4段。您可以将机械装置视为具有多个段的望远镜杆,由于机械装置的缘故,每个段都执行从0到N的分段工作,同时仍在代码中保持一定的清晰度(0-90,90-180 ..),i必须手动将div旋转(-45deg),以便0°== 12''。

这是一个小草图,可以说明我是如何做到的:

图式

请注意,您不能将此用于任何商业目的,因为我没有在网上找到任何类似的解决方案,因此,它需要具有一定的价值。请尊重这一点。


使用css von c绘制圆线段。schiefer ist lizenziert unter einer Creative Commons Namensnennung-Nicht kommerziell-Keine Bearbeitungen 4.0 International Lizenz。

            <script src="http://code.jquery.com/jquery-latest.js"></script>

<style type="text/css">
    .circle{
        position: absolute;
        top: 100px;

        width: 600px;
        height: 600px;
        border-radius: 50%;
        background-color: #FFFF00;
        opacity: .9;

        -webkit-transform: rotate(45deg);

}

<script type="text/javaScript">

    var obj;
    var start, end;
    function rangeStart(val) {
        obj =  $("body").find(".circle");
        start = val;
        setAngle(obj, start, end);
    }

    function rangeEnd(val) {
        obj =  $("body").find(".circle");
        end = val;
        setAngle(obj, start, end);
    }

    function applyMasking(obj) {
        obj.css("-webkit-clip-path", ptsToString());
    }

    // not working for degree start to be lower than end, hence, we set the interface to automatically adapt to that exception:
    /*
    function checkForRangeExceptions() {
        if(end < start) {
            $("body").find("input[name='rangeLower']").val($("body").find("input[name='rangeUpper']").val());
            $("body").find("input[name='rangeLower']").slider('refresh');
        }
    }
    */

    // setInterval(doit, 200);

    var angie = 0;
    function doit() {
        obj =  $("body").find(".circle");
        if(angie < 360)
            angie+=15;
        else angie = 0;
        setAngle(obj, 0, angie);
    }


    function ptsToString() {
        var str = "";
        str+="polygon(";
        for(var i=0; i < pts.length; i++) {
            str+=pts[i].x+"% ";
            if(i != pts.length-1)
                str+=pts[i].y+"% ,";
            else str+=pts[i].y+"%";
        }
        str+=")";
        return str;
    }

    /*
    gets passed an html element and sets its clip-path according to the passed angle,
    starting at 0°; note that from a clock perspective, we start at +45° and hence have 
    to add that value to passed angles later on:
    */
    var pts = 
    [
     {x: 50, y: 50}, {x: 0, y: 0}, {x: 0, y: 0},
     {x: 0, y: 0}, {x: 0, y: 0}, {x: 0, y: 0},
     {x: 0, y: 0}, {x: 0, y: 0}, {x: 0, y: 0}
    ];
    var lb, ub;
    var sa, ea;
    function setAngle(obj, start, end) {
        // if no start, set 0° as default:
        start = (start == undefined ? start = 0 : start);

        // find out upper and lower sector bounds: 
        lb = (angleToSector(start) * 2) - 1;
        ub = angleToSector(end) * 2;

        // find start end end angles:
        sa = mapAngleToPoint(start);
        ea = mapAngleToPoint(end); 

        // now set points except start point which is 0:
        for(var i=1; i < pts.length; i++) {

            // set all below lb to lb:
            if(i <= lb) { pts[i].x = sa.x; pts[i].y = sa.y; }

            // set all in between to max values:
            else if(i > lb && i < ub) {
                pts[i] = setMax(i);
            }

            // set all above ub to ub:
            else if(i >= ub) { pts[i].x = ea.x; pts[i].y = ea.y; }

        }

        // apply masking:
        applyMasking(obj);

    }

    // assuming that 100 need to map 90°:
    function angleToPerc(angle) {
        return angle * (100/90);
    }

    function lowerBound(angle) {
        return (mapAngleToSector(angle));
    }

    function uppperBound(angle){
        return (mapAngleToSector(angle));           
    }

    // sectors 1-4
    function angleToSector(angle) {
            if      (angle >= 0   && angle < 90)  return 1;
            else if (angle >= 90  && angle < 180) return 2;
            else if (angle >= 180 && angle < 270) return 3;
            else if (angle >= 270 && angle <= 360) return 4;
    }

    // this maps the passed angle to a coordinate value:
    var as;
    function mapAngleToPoint(angle) {
            var pt = {x: 0, y: 0};
            as = angleToSector(angle);
            if(as == 1)       {pt.x = angleToPerc(angle); pt.y = 0; }
            else if(as == 2)  {pt.x = 100; pt.y = angleToPerc(angle-90)}
            else if(as == 3)  {pt.x = 100-angleToPerc(angle-180); pt.y = 100; }
            else if(as == 4)  {pt.x = 0; pt.y = 100-angleToPerc(angle-270); }
            return pt;
    }

    // set a point to its max by index:
    function setMax(index) {
        var pt = {x: 0, y: 0};
        if      (index == 1 || index == 2) { pt.x = 100; pt.y = 0; }
        else if (index == 3 || index == 4) { pt.x = 100; pt.y = 100; }
        else if (index == 5 || index == 6) { pt.x = 0; pt.y = 100; }
        else if (index == 7 || index == 8) { pt.x = 0; pt.y = 0; }
        return pt;
    }

</script>

</head>

<body>

    <div class="circle">

    </div>

    <input type="range" name="rangeLower" value="0" min="0" max="360" onchange="rangeStart(this.value);">
    <input type="range" name="rangeUpper" value="66"min="0" max="360" onchange="rangeEnd(this.value);">


</body>


9
  1. 你需要画一个圆
  2. 用于clip-path削减部门(您需要做一些数学运算)

你可以在这里clip-path

这是一个演示:

#skills {
  position: relative;
  width: 300px;
  height: 300px;
  margin: 30px auto;
}

.circle {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  position: absolute;
}

.animate {
  -webkit-transition: 0.2s cubic-bezier(.74,1.13,.83,1.2);
  -moz-transition: 0.2s cubic-bezier(.74,1.13,.83,1.2);
  -o-transition: 0.2s cubic-bezier(.74,1.13,.83,1.2);
  transition: 0.2s cubic-bezier(.74,1.13,.83,1.2);
}

.animate:hover {
  transform: scale(1.1);
  transform-origin: center center;
}

#part1 {
  background-color: #E64C65;
  -webkit-clip-path: polygon(50% 0, 50% 50%, 100% 41.2%, 100% 0);
  clip-path: polygon(50% 0, 50% 50%, 100% 41.2%, 100% 0);
}

#part2 {
  background-color: #11A8AB;
  -webkit-clip-path: polygon(50% 50%, 100% 41.2%, 100% 100%, 63.4% 100%);
  clip-path: polygon(50% 50%, 100% 41.2%, 100% 100%, 63.4% 100%);
}

#part3 {
  background-color: #4FC4F6;
  -webkit-clip-path: polygon(50% 50%, 36.6% 100%, 63.4% 100%);
  clip-path: polygon(50% 50%, 36.6% 100%, 63.4% 100%);
}

#part4 {
  background-color: #FFED0D;
  -webkit-clip-path: polygon(50% 50%, 0 100%, 36.6% 100%);
  clip-path: polygon(50% 50%, 0 100%, 36.6% 100%);
}

#part5 {
  background-color: #F46FDA;
  -webkit-clip-path: polygon(50% 50%, 0 36.6%, 0 100%);
  clip-path: polygon(50% 50%, 0 36.6%, 0 100%);
}

#part6 {
  background-color: #15BFCC;
  -webkit-clip-path: polygon(50% 50%, 0 36.6%, 0 0, 50% 0);
  clip-path: polygon(50% 50%, 0 36.6%, 0 0, 50% 0);
}
<div id="skills">
  <div id="part1" class="circle animate"></div>
  <div id="part2" class="circle animate"></div>
  <div id="part3" class="circle animate"></div>
  <div id="part4" class="circle animate"></div>
  <div id="part5" class="circle animate"></div>
  <div id="part6" class="circle animate"></div>
</div>


它可以使用chrome浏览器,但无法使用Firefox浏览器和其他浏览器。任何想法
karthi '16

@karthi Firefoxclip-path仅支持SVG中定义的路径。因此,您可以使用SVG作为解决方法。对于IE而言,除了图像之外,我不知道其他更好的解决方案。
加文

你能以SVG为例吗?我不知道如何在SVG中更改代码
karthi '16

@karthi我现在没有任何示例,但是您可以查看stackoverflow.com/questions/33816793/…作为示例
Gavin

7

我有另一个解决方案。

#pie {
  position: relative;
  width: 100px;
  height: 100px;
  background-color: #76dd76;
  border-radius: 50%;
  border: 1px solid #76dd76;
}

#pie:before,
#pie:after {
  position: absolute;
  content: "";
  display: block;
  width: 50%;
  height: 50%;
  -webkit-transform-origin: right bottom;
  -moz-transform-origin: right bottom;
  -ms-transform-origin: right bottom;
  transform-origin: right bottom;
  background-color: white;
  border-top-left-radius: 100%;
}

#pie:after {
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
}
<div id="pie"></div>

演示:http : //jsfiddle.net/F6qz9/


这将起到半派的作用。如果您需要全部范围,则可以采用此技术,并在pie元素中添加一个跨度,以获取另外两种伪元素样式。
尼尔·梦露

5

看到此内容以了解如何解决您的问题。

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

.circle{
    width: 100px;
    height: 100px;
    background-color: green;
    border-radius: 100px;
    position: relative;
}

.circle:before,
.circle:after {
    border: 50px solid white;
    border-color: transparent transparent white white;
    border-radius: 100px;
    content: '';
    height: 0;
    position: absolute;
    top: 0;
    left: 0;
    width: 0;
    /* this is to have it white from 180 to 360 degrees on the left side */
    transform:rotate(45deg);
    -ms-transform:rotate(45deg); /* IE 9 */
    -webkit-transform:rotate(45deg); /* Safari and Chrome */
}

/* the green sector is now 180 minus 45 plus 0 degree */
.circle:after {
    transform:rotate(0deg);
    -ms-transform:rotate(0deg); /* IE 9 */
    -webkit-transform:rotate(0deg); /* Safari and Chrome */
}

/* the green sector is now 180 minus 45 plus -75 degree */
/*.circle:after {
    transform:rotate(-75deg);
    -ms-transform:rotate(-75deg);
    -webkit-transform:rotate(-75deg);
}*/

演示版


1
漂亮的把戏芽!但是有一件事情-您不能创建角度<45的透明扇区;)您当然可以创建隐藏扇区。
The Pragmatick

5

这里的所有答案都是有创意的。人们如何以多种方式解决相同的问题,这真是令人惊讶。桑普森(Sampson)接受的答案确实很酷,但我不知道他为什么决定绘制白色部分而不是绿色,因此我想到了一个共享版本,实际上是绘制绿色。我只是觉得这种方式更简单,所以我分享了它,以防其他人也觉得它有用。

pie {
    width: 5em;
    height: 5em;
    display: block;
    border-radius: 50%;
    border: 2px solid green;
    float: left;
    margin: 1em;
}

.ten {
    background-image:
      linear-gradient(-54deg, white 50%, transparent 50%),
      linear-gradient(-90deg, green 50%, transparent 50%);
}

.twentyfive {
    background-image:
      linear-gradient(0deg, white 50%, transparent 50%),
      linear-gradient(-90deg, green 50%, transparent 50%);
}

.fifty {
    background-image:
      linear-gradient(-90deg, green 50%, transparent 50%);
}

/* Slices greater than 50% require first gradient to be green -> transparent */

.seventyfive {
    background-image:
      linear-gradient(0deg, green 50%, transparent 50%),
      linear-gradient(-90deg, green 50%, transparent 50%);
}

.onehundred {
    background-color: green;
}
<pie class="ten"></pie>
<pie class="twentyfive"></pie>
<pie class="fifty"></pie>
<pie class="seventyfive"></pie>
<pie class="onehundred"></pie>


4

由于我动态需要此功能,因此这里有一个jQuery插件。例如,呼叫$('selector').pieChart(0.4, 'white' 'green')在白色圆圈上显示40%的绿色部分。

// LIBRARY FUNCTION
$.fn.pieChart = function(proportion, bg, fg) {
  var angle, grads;
  angle = Math.round(360 * (proportion % 0.5) - 90);
  grads = [
    "linear-gradient(" + angle + "deg, " + (proportion < 0.5 ? bg : fg) + " 50%, transparent 50% )",
    "linear-gradient(-90deg, " + fg + " 50%, transparent 50%)"
  ];
  return $(this).css({
    'background-color': proportion==1 ? fg : bg,
    'background-image': grads.join(','),
    'border': '1px solid '+fg
  });
};

// DEMO
for (var i=0; i <= 10; i++) {
  $('<div class="pie" />').appendTo('body').pieChart(i/10, 'white', 'green');
}
.pie {
  display: inline-block;
  margin: 10px;
  border-radius: 50%;
  width: 100px;
  height: 100px;
}
<script src="https://code.jquery.com/jquery-3.0.0.js"></script>

这是基于Racil的示例。(请注意,我无法在修改后的答案中使用OP的插件,因为该插件不适用于跨度超过180度的扇区。)


1
+1提及我的名字:)。不可以,+ 1可以将其转换为出色的功能。也许您应该从中创建一个库;)。
拉西尔·希兰

3

您可以使用带有虚线的圆圈。

<svg viewBox="-8 -8 16 16">
  <circle
    cx="0"
    cy="0"
    r="4"
    transform="rotate(270)"
    stroke-width="8"
    stroke-dasharray="4, 26"
    stroke="green"
    fill="none"
  />
</svg>
  • 使线的厚度是圆的半径的两倍,使其到达圆的中心。
  • 使用该stroke-dasharray值确定要查看的饼图大小。

奖励:使用圆形而不是路径的优点是,您可以在更改饼图大小时轻松为其设置动画:只需transition: stroke-dasharray .5s;在圆形的css中添加类似内容即可。


2

我有一种略有不同的方法,该方法无需使用SVG即可轻松进行动画处理。

它利用非常具体的宽度,高度和边框宽度以及矩形裁剪,因此在您需要更改尺寸时,必须谨慎处理。最重要的一点这里要注意的是,如果你想调整的馅饼,你需要更新所有em按比例-这意味着他们必须全部相同的因子进行缩放。

请注意,如果饼图充满了50%以上(> 180度为彩色),则需要添加一个完整的半圆形。如果要对其进行动画处理,则应在JS中动态处理此部分。

<style>
.timer {
    position: relative;
    width: 4em;
    height: 4em;
    float: left;
    margin: 1px 30px 0 0;
}


.timer > #slice {
    position: absolute;
    width: 4em;
    height: 4em;
    clip: rect(0px, 4em, 4em, 2em);
}

.timer > #slice.gt50 {
    clip: rect(auto, auto, auto, auto);
}

.timer > #slice > .pie {
    border: 3.2em solid green;
    position: absolute;
    width: 3.8em;
    height: 3.8em;
    clip: rect(0em, 2em, 4em, 0em);
    -moz-border-radius: 2em;
    -webkit-border-radius: 2em;
    border-radius: 2em;
}

.timer > #slice > .pie.fill {
    -moz-transform: rotate(180deg) !important;
    -webkit-transform: rotate(180deg) !important;
    -o-transform: rotate(180deg) !important;
    transform: rotate(180deg) !important;
}

.timer.fill > #slice > .pie {
    border: transparent;
    background-color: green;
    width: 4em;
    height: 4em;
}
</style>    
<div class="timer fill">
</div>
<script>
const PIE_INTERVAL_TIME = 1000; // one second interval time
const PERCENT_INTERVAL = 1.67; // 100 / 60 seconds
const stopInterval = setInterval(pieInterval(), PIE_INTERVAL_TIME);

function pieInterval() {
    let percent = 0;
    return function() {
        percent += PERCENT_INTERVAL;
            const timer = $('.timer');
            const gt50 = percent > 50 ? 'gt50' : '';
            const pieFill = percent > 50 ? '<div class="pie fill"></div>' : '';
      let deg = (360/100) * percent;
      timer.html(
        `<div id="slice" class="${gt50}">
            <div class="pie"></div>
            ${pieFill}
        </div>`);

      if (percent >= 100) {
        deg = 360;
        clearInterval(stopInterval);
      }

      $('#slice').find('.pie').css({
        '-moz-transform':'rotate('+deg+'deg)',
        '-webkit-transform':'rotate('+deg+'deg)',
        '-o-transform':'rotate('+deg+'deg)',
        'transform':'rotate('+deg+'deg)'
       });
    };
}
</script>

这是演示的小提琴-比书面解释要简单得多:

动画JSFiddle演示


1
动画不是问题的一部分,而是+1和努力的解决方案。
Racil Hilan

1

简单。只需遵循以下代码:

HTML:

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

CSS:

.circle {
width: 11em;
height: 11em;
border-radius: 100%;
background: linear-gradient(360deg, #FFFFFF 100%, transparent 42.34%) 0 0;
background-repeat: no-repeat;
background-size: 100% 100%;
}

.pie {
width: 11em;
height: 11em;
border-radius: 100%;
background: linear-gradient(-80deg, #1BB90D 50%, transparent 40%) 0 0;
background-repeat: no-repeat;
background-size: 100% 55%;
position: relative;
margin-top: -176px;
border: 1px solid #808D1E;
}

0

只是为了添加答案,您也可以使用clip-path进行此操作。将边界半径添加50%,并使用以下函数生成的值添加剪切路径。

function calc_arc(prc) {
let str = '50% 50%, 50% 0%';
if(prc >= 45)
    str += ',100% 0%';
else
    str += ','+ (50+(prc/.45)/2) + '% 0%';

if(prc >= 135) 
    str += ',100% 100%';
else {

    prc -= 45;
    if(prc > 0) {
    prc /= .9;
    str += ',100% '+prc + '%';
    }
}

if(prc >= 225) 
    str += ',0% 100%';
else {
    prc -= 135;
    if(prc>0) {
    prc /= .9;
    str += ','+(100-prc) + '% 100%';
    }
}
if(prc >= 315) 
    str += ',0% 0%';
else {
    prc -= 225;
    if(prc>0) {
    prc /= .9;
    str += ',0% '+(100-prc) + '%';}
}
if(prc >= 360)
    str += ',100% 0%';
else {
prc -= 315;
if(prc>0) {
    str += ','+(prc/.45)/2 + '% 0%';
    }
    }
return 'polygon('+str+')';

}

它的工作原理是检查百分比,并根据一些预先计算的断点生成一个多边形以切出正方形。边界半径将其变成圆的线段。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.