认真对待,所以回答有点延迟。
首先,使用画布绘图可能会更好地完成这样的事情(需要检查一下),但只是为了好玩,将 LESS+HTML+CSS3 和位 JavaScript 疯狂混合,这似乎仍然有效。
这是工作示例https://c9.io/dmi3y/css3pie/workspace/index.html
应该适用于所有现代浏览器和 IE9 +,可能您可以添加对低于 9 的 IE 版本的支持。为此需要对边框的支持半径和变换。后一种可以使用矩阵过滤器完成,这里有一些要阅读的内容以及 .htc 文件http://samuli.hakoniemi.net/cross-browser-rotation-transformation-with-css/中的工作解决方案,但我没有测试它和个人不会太在意旧版浏览器。如果您想查看升级浏览器的内容,我只想添加通知。在 FireFox 中也有一些人工制品,可能是因为我正在使用伪类::before
,::after
并且可能正在使用真实元素会改善这一点。
技术信息。这是 9cloud 代码https://c9.io/dmi3y/css3pie。核心思想是使用客户端 LESS 动态生成的 CSS。因此,使用为方便起见而采用的位 jQuery 代码可以轻松转换为任何其他库/核心 js。
里程碑:
在您的标记中,您定义应该以度数填充多少区域
<div class="circle" id="pieOne" data-fill="30deg"></div>
基本上要让它工作,这就是你需要的一切。
这是发生了什么的简要说明:
取这个值,我会覆盖嵌入样式中的 LESS 变量并使用less.refreshStyles()
<style type="text/less" id="lessPie">
@import 'styles/pie';
@fillDegree: #dataDegree#; // from 0deg to 180deg
@baseRotate: 40deg;
</style>
<script type="text/javascript">
!function(){
var lessPieText = $('#lessPie').text();
$(function(){
var pieOneDataFill = $('#pieOne').attr('data-fill');
while (parseInt(pieOneDataFill) > 180) {
pieOneDataFill = (parseInt(pieOneDataFill) - 180) + 'deg';
}
while (parseInt(pieOneDataFill) < 0) {
pieOneDataFill = (parseInt(pieOneDataFill) + 180) + 'deg';
}
$('#lessPie').text(lessPieText.replace('#dataDegree#', pieOneDataFill));
less.refreshStyles();
// update % value
// 180deg = 100%
// pieOneDataFill = x%
var percentValue = (parseInt(pieOneDataFill) * 100) / 180;
$('#pieOneLegend').find('span').text(Math.floor(percentValue) + '%').end().show();
});
}()
</script>
作为额外的奖励,您可以@baseRotate: 40deg;
使用价值旋转馅饼。还显示了带有 % 值的图例。
这几乎就是一切。有一段时间它只支持每页一个饼图(或者更确切地说是一种饼图)和一个值。稍后我会将其推送到 github 上,并且可能会在项目上工作,因为这听起来很有趣。