zoukankan      html  css  js  c++  java
  • CSS3 chart

    利用CSS3技术生成统计图。

    原理:利用元素的百分比算出旋转度数。类似于斗地主时,手拿扑克牌的形状。

    程序源码:

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" Content="text/html; charset=utf-8;">
      5 <title> CSS3 chart </title>
      6 <meta name="author" content="rainna" />
      7 <meta name="keywords" content="rainna's css3 lib" />
      8 <meta name="description" content="CSS3 chart" />
      9 <style>
     10 *{margin:0;padding:0;}
     11 body{background:#eee;font-family:Microsoft yahei;line-height:1.6;}
     12 h2{font-weight:normal;}
     13 li{list-style:none;}
     14 
     15 .g-box{width:600px;margin:30px auto;}
     16 .g-box h2{margin:0 0 20px;}
     17 .m-chart{margin:0 0 50px;}
     18 .m-chart .info li{display:inline-block;margin:0 30px 10px 0;}
     19 .m-chart .info-1{margin:15px 0 0;}
     20 .m-chart .info-1 input{width:100px;height:24px;}
     21 
     22 .m-chart .chart{position:relative;width:300px;height:300px;margin:30px auto;border-radius:300px;overflow:hidden;}
     23 .m-chart .chart li{position:absolute;left:0;top:0;}
     24 .m-chart .chart .item{width:150px;height:300px;margin:0 0 0 150px;}
     25 
     26 /* 定义颜色 */
     27 .m-chart .info li:nth-child(1){color:#0092B9;}
     28 .m-chart .info li:nth-child(2){color:#86AD00;}
     29 .m-chart .info li:nth-child(3){color:#F2B705;}
     30 .m-chart .info li:nth-child(4){color:#D97904;}
     31 .m-chart .info li:nth-child(5){color:#BC3603;}
     32 .m-chart .info li:nth-child(6){color:#CF0CC8;}
     33 .m-chart .info li:nth-child(7){color:#33DF08;}
     34 .m-chart .info li:nth-child(8){color:#250CE4;}
     35 .m-chart .chart li:nth-child(1) .item{background:#0092B9;}
     36 .m-chart .chart li:nth-child(2) .item{background:#86AD00;}
     37 .m-chart .chart li:nth-child(3) .item{background:#F2B705;}
     38 .m-chart .chart li:nth-child(4) .item{background:#D97904;}
     39 .m-chart .chart li:nth-child(5) .item{background:#BC3603;}
     40 .m-chart .chart li:nth-child(6) .item{background:#CF0CC8;}
     41 .m-chart .chart li:nth-child(7) .item{background:#33DF08;}
     42 .m-chart .chart li:nth-child(8) .item{background:#250CE4;}
     43 
     44 /* chart主样式,利用旋转度数来实现,当度数小于或等于180时,li只显示右边的颜色,当度数大于180时,只显示li左边的颜色,右边多出的颜色要裁剪掉 */
     45 .m-chart .chart .item{-webkit-transform-origin:0 50%;}      /* 定义旋转的中心,为li的中心,中心即为圆心 */
     46 
     47 /* 图表旋转度数15%(360*15%=54deg) 10%(360*10%=36deg) 13%(360*13%=46.8deg) 15%(360*15%=54deg) 5%(360*5%=18deg) 20%(360*20%=72deg) 14%(360*14%=50.4deg) 8%(360*8%=28.8deg) */
     48 .m-chart .chart li:nth-child(1) .item{-webkit-transform:rotate(0deg);}        
     49 .m-chart .chart li:nth-child(2) .item{-webkit-transform:rotate(54deg);}     /* 0+54 */
     50 .m-chart .chart li:nth-child(3) .item{-webkit-transform:rotate(90deg);}      /* 54+36 */
     51 .m-chart .chart li:nth-child(4) .item{-webkit-transform:rotate(136.8deg);}        /* 90+46.8 */
     52 /* 当度数大于180时,li右半部分的颜色需要剪切 */
     53 .m-chart .chart li:nth-child(5),.m-chart .chart li:nth-child(6),.m-chart .chart li:nth-child(7),.m-chart .chart li:nth-child(8){clip:rect(0,150px,300px,0);}
     54 .m-chart .chart li:nth-child(5) .item{-webkit-transform:rotate(190.8deg);}         /* 136.8+54 */
     55 .m-chart .chart li:nth-child(6) .item{-webkit-transform:rotate(208.8deg);}        /* 190.8+18 */
     56 .m-chart .chart li:nth-child(7) .item{-webkit-transform:rotate(280.8deg);}          /* 208.8+72 */
     57 .m-chart .chart li:nth-child(8) .item{-webkit-transform:rotate(331.2deg);}         /* 280.8+50.4 */
     58 </style>
     59 </head>
     60 
     61 <body>
     62 <div class="g-box">
     63     <h2>利用CSS3 制图</h2>
     64     <div class="m-chart">
     65         <ul class="info">
     66             <li>AAA:15%</li>
     67             <li>BBB:10%</li>
     68             <li>CCC:13%</li>
     69             <li>DDD:15%</li>
     70             <li>EEE:5%</li>
     71             <li>FFF:20%</li>
     72             <li>GGG:14%</li>
     73             <li>HHH:8%</li>
     74         </ul>
     75         <ul class="chart">
     76             <li>
     77                 <div class="item"></div>
     78             </li>
     79             <li>
     80                 <div class="item"></div>
     81             </li>
     82             <li>
     83                 <div class="item"></div>
     84             </li>
     85             <li>
     86                 <div class="item"></div>
     87             </li>
     88             <li>
     89                 <div class="item"></div>
     90             </li>
     91             <li>
     92                 <div class="item"></div>
     93             </li>
     94             <li>
     95                 <div class="item"></div>
     96             </li>
     97             <li>
     98                 <div class="item"></div>
     99             </li>
    100         </ul>
    101         <p>颜色旋转度数如下:BBB:15%(360*15%=54deg)  CCC:10%(360*10%=36deg)  DDD:13%(360*13%=46.8deg)  EEE:15%(360*15%=54deg)  FFF:5%(360*5%=18deg) 20%(360*20%=72deg)  GGG:14%(360*14%=50.4deg)  HHH:8%(360*8%=28.8deg)</p>
    102     </div>
    103     
    104     <h2>动态生成图表</h2>
    105     <div class="m-chart">
    106         <p>请输入百分比:只需输入数字,百分号不用输入。</p>
    107         <ul class="info info-1" id="chartipt">
    108             <li>AAA:<input type="text"/></li>
    109             <li>BBB:<input type="text"/></li>
    110             <li>CCC:<input type="text"/></li>
    111         </ul>
    112         <div class="btn"><a href="" id="btn">生成图表</a></div>
    113         <ul class="chart" id="chart"></ul>
    114     </div>
    115 </div>
    116 <script>
    117 var chart = function(){
    118     //公共函数
    119     function T$(id){
    120         return document.getElementById(id);
    121     }
    122     function T$$(root,tag){
    123         return (document || root).getElementsByTagName(tag);
    124     }
    125     function currentStyle(elem, style) {
    126         return elem.currentStyle || document.defaultView.getComputedStyle(elem, null);
    127     }
    128     
    129     //主类构造函数   fid:为输入框容器id, bid:为图表容器id
    130     var genChart = function(fid,bid){
    131         var self = this;
    132         if(!(self instanceof genChart)){
    133             return new genChart(fid,bid);
    134         }
    135         self.iptContainer = T$(fid);   //输入框容器
    136         self.chartContainer = T$(bid);   //图表容器
    137         self.ipt = T$$(T$(fid),'input');   //输入框
    138         self.iptCount = self.ipt.length || 0;        
    139     }
    140     
    141     genChart.prototype = {
    142         constructor: genChart,
    143         showChart: function(){
    144             var self = this;
    145             var val = 0;
    146             var node;
    147             if(!!self.chartContainer) this.chartContainer.innerHTML = '';
    148             for(var i=0,l=self.iptCount;i<l;i++){
    149                 if(val > 360){
    150                     alert('总百分比大于1');
    151                     break;
    152                 }
    153                 node = document.createElement('li');
    154                 if(val > 180){     // 当度数大于180时,li右半部分的颜色需要剪切 
    155                     node.style.clip = 'rect(0,150px,300px,0)';
    156                 } 
    157                 node.innerHTML = '<div class="item" style="-webkit-transform:rotate('+val+'deg);"></div>';
    158                 self.chartContainer.appendChild(node);
    159                 val += 360*parseInt(self.ipt[i].value)/100;
    160                 //如果当前元素的百分比超过50%,则将容器的背景颜色设置为当前元素的背景色,填补空余的颜色
    161                 if(self.ipt[i].value > 50) self.chartContainer.style.backgroundColor = currentStyle(self.ipt[i].parentNode).color;    
    162             }
    163         }
    164     }
    165     
    166     return{
    167         onShowChart: function(fid,bid){
    168             //调用主类
    169             var st = genChart(fid,bid);
    170             var btn = T$('btn');
    171             btn.onclick = function(event){
    172                 event.preventDefault();
    173                 st.showChart();
    174             }
    175         }
    176     }
    177     
    178 }();
    179 
    180 chart.onShowChart('chartipt','chart');
    181 </script>
    182 </body>
    183 </html>

    源码下载:chart.zip

  • 相关阅读:
    C++中public、protected、private的差别
    TSP问题
    Android百日程序:绘画程序-画手指路径
    DFS csu1719 Boggle
    Oracle数据库imp
    <html>
    SWIFT学习笔记05
    Xcode7 真机免证书调试Cocos2D游戏
    mycat 不得不说的缘分
    HashMap和Hashtable的差别
  • 原文地址:https://www.cnblogs.com/zourong/p/3858492.html
Copyright © 2011-2022 走看看