好吧,用纯CSS绘制圆圈很容易。
.circle {
width: 100px;
height: 100px;
border-radius: 100px;
border: 3px solid black;
background-color: green;
}
如何绘制扇区?给定度X [0-360]我想画一个X度扇区。 我可以用纯CSS做到吗?
例如:
感谢+示例
谢谢Jonathan,我使用了第一种方法。如果它帮助某人这里是一个JQuery函数的例子,它获得百分比并绘制一个扇区。该扇区位于百分比圆圈后面,此示例显示如何从起始角度围绕圆圈实现圆弧。
$(function drawSector() {
var activeBorder = $("#activeBorder");
var prec = activeBorder.children().children().text();
if (prec > 100)
prec = 100;
var deg = prec * 3.6;
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%)');
}
var startDeg = $("#startDeg").attr("class");
activeBorder.css('transform', 'rotate(' + startDeg + 'deg)');
$("#circle").css('transform', 'rotate(' + (-startDeg) + 'deg)');
});
.container {
width: 110px;
height: 110px;
margin: 100px auto;
}
.prec {
top: 30px;
position: relative;
font-size: 30px;
}
.prec:after {
content: '%';
}
.circle {
position: relative;
top: 5px;
left: 5px;
text-align: center;
width: 100px;
height: 100px;
border-radius: 100%;
background-color: #E6F4F7;
}
.active-border {
position: relative;
text-align: center;
width: 110px;
height: 110px;
border-radius: 100%;
background-color: #39B4CC;
background-image: linear-gradient(91deg, transparent 50%, #A2ECFB 50%), linear-gradient(90deg, #A2ECFB 50%, transparent 50%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div class="container">
<div id="activeBorder" class="active-border">
<div id="circle" class="circle">
<span class="prec">66</span>
<span id="startDeg" class="90"></span>
</div>
</div>
</div>
$(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)');
});
答案 0 :(得分:144)
不是试图绘制绿色部分,而是可以绘制白色部分:
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%);
}
pie {
width: 5em;
height: 5em;
display: block;
border-radius: 50%;
background-color: green;
border: 2px solid green;
float: left;
margin: 1em;
}
.ten {
background-image: linear-gradient(126deg, transparent 50%, white 50%), linear-gradient(90deg, white 50%, transparent 50%);
}
.twentyfive {
background-image: linear-gradient(180deg, transparent 50%, white 50%), linear-gradient(90deg, white 50%, transparent 50%);
}
.fifty {
background-image: linear-gradient(90deg, white 50%, transparent 50%);
}
/* Slices greater than 50% require first gradient
to be transparent -> green */
.seventyfive {
background-image: linear-gradient(180deg, transparent 50%, green 50%), linear-gradient(90deg, white 50%, transparent 50%);
}
.onehundred {
background-image: none;
}
<pie class="ten"></pie>
<pie class="twentyfive"></pie>
<pie class="fifty"></pie>
<pie class="seventyfive"></pie>
<pie class="onehundred"></pie>
演示: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,1
和z
),它们控制着弧本身的曲率,方向和终点。您可以通过查阅任何在线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
。
您可以轻松地创建以下内容:
circle {
fill: #f1f1f1;
stroke: green;
stroke-width: 5;
}
path {
fill: green;
}
svg.pie {
width: 230px;
height: 230px;
}
<svg class="pie">
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 190,35 z"></path>
</svg>
<svg class="pie">
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 225,115 z"></path>
</svg>
<svg class="pie">
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 115,225 A110,110 1 0,1 35,190 z"></path>
</svg>
演示:http://jsfiddle.net/jonathansampson/tYaVW/
答案 1 :(得分:31)
使用overflow
和transform
属性非常有效,无需进行复杂计算。
对于小于180度的角度
添加宽高比2:1 和overflow: hidden;
添加一个伪元素,其顶部边框半径与元素高度和底部半径相同,为0。
Put transform-origin: 50% 100%;
这会从中间底部转换伪元素。
变换:rotate();通过补充所需角度的伪元素,
即。,transform: rotate(180 - rqrd. angle);
了解它的工作原理:
EG:
使用此方法的40deg部门: Fiddle
div {
...
overflow: hidden;
...
}
div:before {
...
border-radius: 100px 100px 0 0;
transform-origin: 50% 100%;
transform: rotate(140deg);
...
}
div {
height: 100px;
width: 200px;
overflow: hidden;
position: relative;
}
div:before {
height: inherit;
width: inherit;
position: absolute;
content: "";
border-radius: 100px 100px 0 0;
background-color: crimson;
-webkit-transform-origin: 50% 100%;
-moz-transform-origin: 50% 100%;
-ms-transform-origin: 50% 100%;
transform-origin: 50% 100%;
-webkit-transform: rotate(140deg);
-moz-transform: rotate(140deg);
-ms-transform: rotate(140deg);
transform: rotate(140deg);
}
<div></div>
您还可以将图片放入扇区!
这可以使用父项上的skew
转换和伪元素上的-ve skew来完成:
的 Fiddle 强>
div {
...
overflow: hidden;
transform-origin: 0% 100%;
transform: skew(-50deg); /*Complement of rqrd angle*/
...
}
div:before {
...
transform-origin: 0% 100%;
transform: skew(50deg);
...
}
了解其工作原理:
div {
height: 200px;
width: 200px;
overflow: hidden;
-webkit-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: skew(-50deg);
-moz-transform: skew(-50deg);
-ms-transform: skew(-50deg);
transform: skew(-50deg); /*Complement of rqrd angle or (90 - angle)*/
position: relative;
}
div:before {
height: inherit;
width: inherit;
position: absolute;
content: "";
border-radius: 0 200px 0 0;
background: url('http://www.placekitten.com/g/300/200/');
-webkit-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: skew(50deg);
-moz-transform: skew(50deg);
-ms-transform: skew(50deg);
transform: skew(50deg);
}
<div></div>
答案 2 :(得分:16)
这有帮助吗?
.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>
<强> Working Fiddle 强>
实际上,这里需要进行一些几何计算。但让我简单解释一下:
考虑到圆圈中的4个四分之一,可以在每个季度计算线性梯度的角度。而background-position
决定了季度:
Q I => 100% 0
Q II => 100% 100%
Q III => 0 100%
Q IV => 0 0
唯一剩下的就是使用过的颜色停止来自:
在第一季度中考虑一个 30-angleled 圈子。
正如才华横溢的 Ana Tudor 在 great article 中解释过,如果我们将广场的宽度取为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%
由于我们的形状位于第1季度,background-position
为100% 0
。
,线性渐变为 like this :
linear-gradient(-30deg, orange 36.60%, transparent 36.60%) 100% 0;
.circle {
width: 16em;
height: 16em;
border-radius: 50%;
background: linear-gradient(-30deg, orange 36.60%, transparent 36.60%) 100% 0;
background-repeat: no-repeat;
background-size: 50% 50%;
}
<div class="circle"></div>
我建议阅读Ana的文章了解更多细节。
答案 3 :(得分:8)
因为我根本没有找到任何令人满意的答案,所以我不得不跪下来,使用剪辑路径功能和整个星期天的css来最终得到我想要的。
你可以选择一个开始和结束角度然后该元素将很好地绘制,没有别的。你只需要边界半径解决方案来绘制基圆。
我的解决方案适用于四个多边形的网格,每个多边形为0-90°的值提供可能的起点或终点。分别为0-100%,90-180° 0-100%等等,共享中心点,因此有两次4个分段。你可以把机械师想象成一个有多个段的望远镜杆,每个段从0到N进行分段作业。由于机械原因,同时仍保持代码清晰度(0-90,90-180 ..),i必须手动旋转(-45deg)div,以便0°== 12''。
这里有一个小草图,可以说明我是如何做到的:
请注意,您不能将其用于任何商业目的,因为我没有在网上找到任何类似的解决方案,因此,需要有一些价值。请尊重这一点。
使用css von c绘制圆弧段。 schaefer 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>
答案 4 :(得分: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>
答案 5 :(得分:6)
clip-path
来削减一个扇区(你需要做一些数学运算)您可以使用clip-path
here
这是一个演示:
#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>
答案 6 :(得分: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);
}*/
答案 7 :(得分: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>
答案 8 :(得分: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的example here。 (注意我在编辑的答案中不能使用OP的插件,因为它不适用于超过180度的扇区。)
答案 9 :(得分: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>
这是演示的小提琴 - 这比写作中的解释简单得多:
答案 10 :(得分:2)
您可以使用带有虚线的圆圈。
<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
值确定要查看的饼形大小。奖金:使用圆形而不是路径的优点是,您可以在更改饼图大小时轻松为其设置动画:只需在圆形的css中添加类似transition: stroke-dasharray .5s;
的内容即可。
答案 11 :(得分: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;
}
答案 12 :(得分:0)
只需添加到答案中,您也可以使用剪切路径来做到这一点。将边界半径添加50%,并使用以下函数生成的值添加剪切路径。
CategoriesGet(Url): Observable<Categories> {
return this.http.get<Categories>(Url, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': JSON.parse(localStorage.getItem('Token')),
})
}).
pipe(catchError(this.handleError));
}
getCategories() {
this.gl.CategoriesGet(this.gl.CategoryUrl).subscribe((rs) => {
this.catergs = rs.data;
}, error => {
Swal.fire('Saving', error.message, 'error');
console.log(error.message);
});
}
UserLogout(users: Users, Url): Observable<Users> {
console.log('Bearer Token ' + JSON.parse(localStorage.getItem('User_Token')));
return this.http.post<Users>(Url, users, {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + JSON.parse(localStorage.getItem('User_Token')),
})
}).
pipe(catchError(this.gl.handleError));
}
}
这是如何工作的,它检查百分比,并根据一些预先计算的断点生成一个多边形以切出正方形。边界半径将其变成圆的线段。