当前位置: 首页 > news >正文

利用CSS-border属性实现圆饼图表

  一般圆饼图表的实现如不考虑IE低版本浏览器的话,利用Canvas或是CSS3都能很好的实现,可是我们现在做的项目最低都要兼容到IE8,所以就想到了Border,相信大家用过border画出各种兼容良好的三角形。

像这样的图表如果只平分四等分的话,实现起来还是挺简单的:

html代码:

<div class="border-i">
    <i class="i1"></i>
    <i class="i2"></i>
    <i class="i3"></i>
    <i class="i4"></i>
</div>

CSS代码:

.border-i{
    width:80px;
    height:80px;
    border-radius:40px;
    background:#ffd203;
    overflow:hidden;
    position:relative;    
}
.border-i i{
    width:0;
    height:0;
    border:40px transparent dotted;
    position:absolute;
}
.border-i .i1{
    right:-40px;
    top:-40px;
}
.border-i .i2{
    right:-40px;
    bottom:-40px;
}
.border-i .i3{
    left:-40px;
    bottom:-40px;
}
.border-i .i4{
    left:-40px;
    top:-40px;
}

 

现在刚好把一个圆饼平分了四等分,如要不同颜色显示直接改变其border-color即可。

原理如下图,一个带有圆角的容器里面有四个宽高和自己一样的子元素平铺排列,然后溢出隐藏。

所以,如果比例占5%的话(默认宽高都80像素),

h=40*tan(360deg*5%);

结果约等于13px,那css代码如下:

.border-i .i2{
    top:-40px;
    right:-13px;
    border-right:13px solid  #fd9500;
}

呈现效果如下:

 

可以看出只要控制了圆饼的四分之一即0%~25%,那其他的25%~50%、50%~75%、75%~100%原理都一样,

其中除去几个特殊值:

    /* 0% */
/* 所有border-color默认透明; */
  /* 25% */
.border-i .i2{border:40px #fd9500 solid;}
  /* 50% */
.border-i .i2,.border-i .i3{border:40px #fd9500 solid;}
  /* 75% */
.border-i .i2,.border-i .i3,.border-i .i4{border:40px #fd9500 solid;}
  /* 100% */
.border-i .i1,.border-i .i2,.border-i .i3,.border-i .i4{border:40px #fd9500 solid;}

其他的计算原理都一样:

/* *设 A = 0%~25%;
 *  H = 40 * tan(360deg * A%);
 */
.border-i .i1{
        right: -Hpx;
        border-left: Hpx solid #fd9500;
}

/* *设 B = 25%~50%;
 *  H = 40 * tan(360deg *(B% - 25%));
 */
.pct30 .i1{border-color: #fd9500;}
.pct30 .i2{
    bottom: -Hpx;
    border-top: Hpx solid #fd9500;
}

/* *设 C = 50%~75%;
 *  H = 40 * tan(360deg *(C% - 50%));
 */
.pct55 .i1, .pct55 .i2{border-color: #fd9500;}
.pct55 .i3{
    left: -Hpx;
    border-right: Hpx solid #fd9500;
}

/* *设 D = 75%~100%;
 *  H = 40 * tan(360deg *(D% - 75%));
 */
.pct80 .i1, .pct80 .i2, .pct80 .i3{border-color: #fd9500;}
.pct80 .i4{
    top: -Hpx;
    border-bottom: Hpx solid #fd9500;
}

最后Demo效果如下:

Demo源码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>利用CSS-border属性实现圆饼图表</title>
</head>
<style>
    *{margin:0;padding:0;border:none;}
    .border-i{
        margin:5px;
        float:left;
        width:80px;
        height:80px;
        border-radius:40px;
        background:#ffd203;
        overflow:hidden;
        position:relative;    
    }
    .border-i p{
        position:absolute;
        left:20px;
        top:30px;
        font-size:20px;
    }
    .border-i i{
        width:0;
        height:0;
        border:40px transparent dotted;
        position:absolute;
    }
    .border-i .i1{
        right:-40px;
        top:-40px;
    }
    .border-i .i2{
        right:-40px;
        bottom:-40px;
    }
    .border-i .i3{
        left:-40px;
        bottom:-40px;
    }
    .border-i .i4{
        left:-40px;
        top:-40px;
    }
    /* 默认0% */
    /* 15% h = 40*tan(360deg * 15%) = 55 (px) */
    .pct15 .i1{
        right:-55px;
        border-left:55px solid  #fd9500;
    }
    /* 25% */
    .pct25 .i1{
        border-color:#fd9500;
    }
    /* 40% h=40*tan(360deg*(40%-25%))=55 (px) */
    .pct40 .i1{
        border-color:#fd9500;
    }
    .pct40 .i2{
        bottom:-55px;
        border-top:55px solid #fd9500;
    }
    /* 50% */
    .pct50 .i1,
    .pct50 .i2{
        border-color:#fd9500;
    }
    /* 65% h=40*tan(360deg*(65%-50%))=55 (px) */
    .pct65 .i1,
    .pct65 .i2{
        border-color:#fd9500;
    }
    .pct65 .i3{
        left:-55px;
        border-right:55px solid #fd9500;
    }
    /* 75% */
    .pct75 .i1,
    .pct75 .i2,
    .pct75 .i3{border-color:#fd9500;}
    /* 90% h=40*tan(360deg*(90%-75%))=55 (px) */
    .pct90 .i1,
    .pct90 .i2,
    .pct90 .i3{
        border-color:#fd9500;
    }
    .pct90 .i4{
        top:-55px;
        border-bottom:55px solid #fd9500;
    }
    /* 100% */
    .pct100 .i1,
    .pct100 .i2,
    .pct100 .i3,
    .pct100 .i4{border-color:#fd9500;}
</style>
<body>
    <div class="border-i pct0">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>0%</p>
    </div>
    <div class="border-i pct15">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>15%</p>
    </div>
    <div class="border-i pct25">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>25%</p>
    </div>
    <div class="border-i pct40">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>40%</p>
    </div>
    <div class="border-i pct50">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>50%</p>
    </div>
    <div class="border-i pct65">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>65%</p>
    </div>
    <div class="border-i pct75">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>75%</p>
    </div>
    <div class="border-i pct90">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>90%</p>
    </div>
    <div class="border-i pct100">
        <i class="i1"></i>
        <i class="i2"></i>
        <i class="i3"></i>
        <i class="i4"></i>
        <p>100%</p>
    </div>
</body>
</html>
View Code

如果要兼容IE8以下的浏览器的圆角(border-radius),就加一个尺寸一样的遮罩层,背景为圆形镂空背景色的纯色png图片:

<!--[if lt IE 9]>
<script src="http://s1.benimg.com/min/f=/v4/base/js/jq172.js"></script>
<script type="text/javascript" >
$(function(){$('.border-i').append('<div style="width:100%;height:100%;position:absolute;left:0;top:0;z-index:1;background:url('图片地址') no-repeat center top;}"></div>');});
</script>
<![endif]-->

在body底部</body>标签前加入如上代码,注意图片地址为你自己放置的路径。

 

By Charles(郑超),谢谢阅读,欢迎转载,转载请注明出处!

http://www.cnblogs.com/chaooo/p/5341549.html

 

转载于:https://www.cnblogs.com/chaooo/p/5341549.html

相关文章:

  • 大圣归来:我们心中缺少一份英雄主义
  • Java命令学习系列(7):Javap(转)
  • 用VS2010编C#程序扫盲
  • 微软宣布Visual Studio 2015后继版本,开发者可以使用Visual C++ for Linux了
  • fullPage.js全屏滚动插件 中文帮助文档API
  • 9个 SSH常用命令选项(转载)
  • 二叉树的操作
  • jquery 的队列queue
  • CentOS下载
  • 开始学习第一天
  • 电梯演讲
  • Linux kernel Makefile for ctags
  • SVN之 trunk, branches and tags意义
  • Android Java执行Shell命令
  • 简介SQL数据库
  • 【知识碎片】第三方登录弹窗效果
  • HTTP中GET与POST的区别 99%的错误认识
  • js面向对象
  • Node + FFmpeg 实现Canvas动画导出视频
  • redis学习笔记(三):列表、集合、有序集合
  • Swift 中的尾递归和蹦床
  • vue自定义指令实现v-tap插件
  • Vue组件定义
  • XForms - 更强大的Form
  • 从0实现一个tiny react(三)生命周期
  • 技术发展面试
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 小程序 setData 学问多
  • 学习ES6 变量的解构赋值
  • Prometheus VS InfluxDB
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (1)Android开发优化---------UI优化
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)nginx 配置(nginx.conf)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (十八)SpringBoot之发送QQ邮件
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Scala的“=”符号简介
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .NET 分布式技术比较
  • .Net6使用WebSocket与前端进行通信
  • // an array of int
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @synthesize和@dynamic分别有什么作用?
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [AX]AX2012 SSRS报表Drill through action
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数