运用HTML5、CSS3、JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告!
《用组件方式开发 Web App全站 》
雷达图开发(设计说明)
雷达图开发(背景层开发)
var H5ComponentRadar =function ( name, cfg ) {
var component = new H5ComponentBase( name ,cfg );
// 绘制网格线 - 背景层
var w = cfg.width;
var h = cfg.height;
// 加入一个画布(网格线背景)
var cns = document.createElement('canvas');
var ctx = cns.getContext('2d');
cns.width = ctx.width = w;
cns.height = ctx.height =h;
component.append(cns);
var r = w/2;
var step = cfg.data.length;
// 计算一个圆周上的坐标(计算多边形的顶点坐标)
// 已知:圆心坐标(a,b)、半径 r;角度deg。
// rad = ( 2*Math.PI / 360 ) * ( 360 / step ) * i
// x = a + Math.sin( rad ) * r;
// y = b + Math.cos( rad ) * r;
// 绘制网格背景(分面绘制,分为10份)
var isBlue = false;
for( var s = 10;s >0 ;s--){
ctx.beginPath();
for( var i=0;i<step;i++){
var rad = ( 2*Math.PI / 360 ) * ( 360 / step ) * i;
var x = r + Math.sin( rad ) * r * (s/10);
var y = r + Math.cos( rad ) * r * (s/10);
ctx.lineTo(x,y);
}
ctx.closePath();
ctx.fillStyle = (isBlue = !isBlue) ? '#99c0ff' : '#f1f9ff';
ctx.fill();
}
// 绘制伞骨
for(var i = 0;i<step;i++){
var rad = ( 2*Math.PI / 360 ) * ( 360 / step ) * i;
var x = r + Math.sin( rad ) * r ;
var y = r + Math.cos( rad ) * r ;
ctx.moveTo(r,r);
ctx.lineTo(x,y);
// 输出项目文字
var text = $('<div class="text">');
text.text( cfg.data[i][0] );
text.css('transition','all .5s '+ i*.1 + 's');
if( x > w/2 ){
text.css('left',x/2+5);
}else{
text.css('right',(w-x)/2+5);
}
if( y > h/2){
text.css('top',y/2+5);
}else{
text.css('bottom',(h-y)/2+5);
}
if( cfg.data[i][2] ){
text.css('color',cfg.data[i][2])
}
text.css('opacity',0);
component.append(text);
}
ctx.strokeStyle = '#e0e0e0';
ctx.stroke();
return component;
}
雷达图开发(数据层开发)
// 数据层的开发
// 加入一个画布(数据层)
var cns = document.createElement('canvas');
var ctx = cns.getContext('2d');
cns.width = ctx.width = w;
cns.height = ctx.height =h;
component.append(cns);
ctx.strokeStyle = '#f00';
var draw = function( per ){
if(per <= 1){
component.find('.text').css('opacity',0);
}
if(per >= 1){
component.find('.text').css('opacity',1);
}
ctx.clearRect(0,0,w,h);
// // 输出数据的折线
for(var i=0;i<step;i++){
var rad = ( 2*Math.PI / 360 ) * ( 360 / step ) * i;
var rate = cfg.data[i][1] * per;
var x = r + Math.sin( rad ) * r * rate;
var y = r + Math.cos( rad ) * r * rate ;
ctx.lineTo(x,y);
}
ctx.closePath();
ctx.stroke();
// 输出数据的点
ctx.fillStyle = '#ff7676';
for(var i=0;i<step;i++){
var rad = ( 2*Math.PI / 360 ) * ( 360 / step ) * i;
var rate = cfg.data[i][1] * per ;
var x = r + Math.sin( rad ) * r * rate;
var y = r + Math.cos( rad ) * r * rate ;
ctx.beginPath();
ctx.arc(x,y,5,0,2*Math.PI);
ctx.fill();
ctx.closePath();
}
}
雷达图开发(项目文本修订 ,生长动画)
component.on('onLoad',function(){
// 雷达图生长动画
var s = 0;
for( i=0;i<100;i++){
setTimeout(function(){
s+=.01;
draw(s);
},i*10+500);
}
});
component.on('onLeave',function(){
// 雷达图退场动画
var s = 1;
for( i=0;i<100;i++){
setTimeout(function(){
s-=.01;
draw(s);
},i*10);
}
});
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, minimum-scale=1, maximum-scale=1">
<title>IT教育网2015课程学习情况</title>
<style type="text/css">
body{
margin: 0;
padding: 0;
background-color: #000;
font-size: 12px;
}
.iphone{
width: 340px;
height: 540px;
background-color: #fff;
position: absolute;
left: 50%;
top: 50%;
margin: -270px 0 0 -170px;
}
</style>
<script type="text/javascript" src="../js/lib/jquery.js"></script>
<script type="text/javascript" src="../js/H5ComponentBase.js"></script>
<link rel="stylesheet" type="text/css" href="../css/H5ComponentBase.css" />
<!-- 引入雷达图的资源 -->
<script type="text/javascript" src="../js/H5ComponentRadar.js"></script>
<link rel="stylesheet" type="text/css" href="../css/H5ComponentRadar.css" />
<body>
<!-- 用于开发测试 H5ComponentRadar 对象(雷达图组件) -->
<div class="iphone">
</div>
<script type="text/javascript">
var cfg = {
type : 'radar',
width : 400,
height : 400,
data:[
['Js' , .4 ,'#ff7676'],
['CSS3' , .1 ],
['HTML5' , .2 ],
['PHP' , .05 ],
['jQuery' , .35 ]
],
css : {
top:100,
opacity:0
},
animateIn:{
opacity:1,
top:200,
},
animateOut:{
opacity:0,
top:100,
},
center : true,
}
var h5 = new H5ComponentRadar('myPolyline',cfg);
$('.iphone').append(h5);
var leave = true;
$('body').click(function(){
leave = !leave;
$('.h5_component').trigger( leave ? 'onLeave' : 'onLoad');
});
</script>
</body>
</html>
CSS
/* 雷达图组件样式 */
.h5_component_radar{
}
.h5_component_radar canvas{
position: absolute;
left: 0;
top: 0; /* 用canvas做动画,会进行分层,要用到 z-index */
width: 100%;
height: 100%;
}
.h5_component_radar .text{
position: absolute;
font-size: 12px;
transition:all 1s;
}
实现效果