嗯,用纯CSS画一个圆很容易.

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

如何绘制地段?给定度X[0-360],我想画一个X度扇区. 我能用纯CSS做到这一点吗?

例如:

在此处输入图像描述

Thanks + Example

谢谢你,乔纳森,我用了第一种方法.如果它对某人有帮助,这里有一个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>

100

$(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)');
});

推荐答案

CSS和多个背景渐变

您可以绘制白色部分,而不是try 绘制绿色部分:

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/

enter image description here

可zoom 矢量图形

如果可以,您可以使用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

这将绘制一条从圆中心到元素顶部的垂直线(距离顶部5个像素).在这一点上,事情变得有点复杂,但仍然非常容易理解.

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

A110,110 1 0,1 190,35 z

这将创建我们的圆弧,并使其半径与我们的圆(110)相匹配.这两个值代表x半径和y半径,两者都相等,因为我们处理的是一个圆.下一组重要数字是最后的190,35.这会告诉弧在哪里完成.

至于信息(1 0,1z)的睡觉,它们控制圆弧本身的曲率、方向和终点.您可以通过查阅任何在线SVG路径参考来了解更多关于它们的信息.

要实现不同大小的"切片",只需更改190,35以反映更大或更小的一组坐标.您可能会发现,如果您想要跨越180度以上,您将需要创建第二个圆弧.

如果要从Angular 确定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/

enter image description here

Css相关问答推荐

自定义kendo色彩 Select 器中的清晰按钮

悬停时可展开的按钮与屏幕右侧对齐,如何保持未悬停的按钮正确对齐?

SVG文本在移动浏览器上增长并溢出

设置项目的最大宽度和最大高度

如何使用Bootstrap在切换按钮旁边的手风琴标题中添加链接?

包含 N 个 React 组件的砌体网格

弹性布局溢出时的换行符

如何使用props 为 Vue 中的组件创建动态背景图像?

如何使用 ReactJS 使用 CSS 设置 map 容器的样式

在 css Select 器中匹配 unicode char

CSS动画恢复默认

创建一条淡出/在各个方向变得透明的线

控制表格单元格之间的间距

如何制作一个div来包装两个浮动div?

bootstrap 模式对话框中的谷歌 map 自动完成结果

ID 在整个页面中必须是唯一的吗?

Bootstrap:在列之间添加边距/填充空间

在 Firefox 中删除额外的按钮间距/填充

如何在 CSS 中延迟 :hover 效果?

background-position-x (background-position-y) 是标准的 W3C CSS 属性吗?