利用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{
    float:left;
    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 = 5%~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>

如果要兼容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,谢谢阅读,欢迎转载,转载请注明出处!

时间: 2024-08-01 09:56:37

利用CSS-border属性实现圆饼图表的相关文章

CSS border 属性和 border-collapse 属性

border 简写属性在一个声明设置所有的边框属性. 可以按顺序设置如下属性: border-width border-style border-color 如果不设置其中的某个值,也不会出问题,比如 border:solid #ff0000; 也是允许的. CSS border-collapse 属性 border-collapse 属性设置表格的边框是否被合并为一个单一的边框,还是象在标准的 HTML 中那样分开显示. 可能的值 值 描述 separate 默认值.边框会被分开.不会忽略 b

CSS border 属性

定义和用法 border 简写属性在一个声明设置所有的边框属性. 可以按顺序设置如下属性: border-width border-style border-color                                                                                                                                                                     

巧妙用css border属性实现规则图形

首先:一个例子: #div1 { height:20px; width:20px; border-color:#FF9600 #3366ff #12ad2a #f0eb7a; border-style:solid; border-width:20px; } 此代码的效果图为: 中间白色为宽高各为20px的div1. 那么问题来了,要实现三角号,只需将div宽高设置为0,然后只设置一边的border显示即可 代码如下: #div2 { height:0; width:0; overflow: hi

Sass mixin 使用css border属性画三角形

To be finished. //triangle@mixin css-triangle ($direction: "down", $size: 20px, $color: #000, $fillColor:#fff) {    width: 0;     height: 0;    position: relative;    z-index: 0;    border-left: #{setTriangleSize($direction, "left", $s

CSS:不可思议的border属性

原文:Magic of CSS border property 译文:不可思议的CSS border属性 译者:dwqs 在CSS中,其border属性有很多的规则.对于一些事物,例如三角形或者其它的图像,我们仍然使用图片代替.但是现在就不需要了,我们可以用CSS形成一些基本图形,我分享了一些关于这方面的技巧. 1.正三角形: .triangle_up { height:0px; width:0px; border-bottom:50px solid #006633; border-left:5

css border画图

css border属性竟然可以用来画图,今天项目中遇到该问题,借此有机会深入了解了下. css border属性在我的印象当中只是方方正正的东西,无非就是增加边框的宽度,变换边框的颜色,因此一直以为边框不管怎么变换都是一个长方体,这个念头今天终于可以抛弃了. 先看下普通边框效果: .border1{width:50px; height:50px; border:2px solid; border-color:#ff3300 #0000ff #339966 #00ff00;}<div class

CSS border三角、圆角图形生成技术简介

http://www.zhangxinxu.com/wordpress/?p=794 一.前言 利用CSS的border属性可以生成一些图形,例如三角或是圆角.纯粹的CSS2的内容,没有兼容性的问题,我之前在纯CSS实现各类气球泡泡对话框效果一文中算是比较详细的讲述了CSS border属性生成三角的原理,以及实例.我觉得此技术相当实用的,故本文再次简单叙述一下,另外,本文还将展示可能并不为众人所知的CSS border圆角生成技术.好了,裹脚布的话就不说了,直接进入正题. 二.CSS bord

利用边框border的属性做小符号

前两天学习中,发现网站上的一个小符号,以为是插入的img,但找来找去也未发现img的地址.最后问了同学,才得知是用border属性做出来的. 符号如右:  其css代码如下: .fuhao { position:absolute; top:12px; left:12px; width:0px; height:0px; overflow:hidden; border-width:6px 0px 6px 6px; border-color:transparent #A92222; border-st

[转]图解CSS的padding,margin,border属性(详细介绍及举例说明)

图解CSS的padding,margin,border属性 W3C组织建议把所有网页上的对像都放在一个盒(box)中,设计师可以通过创建定义来控制这个盒的属性,这些对像包括段落.列表.标题.图片以及层.盒模型主要定义四个区域:内容(content).边框距(padding).边界(border)和边距(margin). 对于初学者,经常会搞不清楚margin,background-color,background-image,padding,content,border之间的层次.关系和相互影响