当前位置: 移动技术网 > IT编程>开发语言>JavaScript > JS+canvas画一个圆锥实例代码

JS+canvas画一个圆锥实例代码

2018年02月24日  | 移动技术网IT编程  | 我要评论

以下是我们给大家分享是实例代码:

<html>
<head>
<title>我的第一个 html 页面</title>
</head>
<body>
<canvas id='cvs' width='1000' height="800">
</canvas>
<script>
const cvs =document.getelementbyid('cvs');

 // 计算画布的宽度
  const width = cvs.offsetwidth;
  // 计算画布的高度
 const  height = cvs.offsetheight;
const ctx = cvs.getcontext('2d');
  // 设置宽高
  cvs.width = width;
  cvs.height = height;
/**
ctx:context
x,y:偏移 纵横坐标
w:度
h:高
color:颜色 数组,可以把颜色提取出来方便自定义
*/
var cone = function(ctx,x,y,w,h,d,color){
ctx.save();
ctx.translate(x, y);
var blockheight=h;
// 中点
var x2 = 0;
var y2 = 20;
var k2 = 10;
var w2 = w;
var h2 = h;
// 递减度
var decrease = d; 
 ctx.beginpath();
ctx.moveto(x2+w2,y2);
// 椭圆加了边框,所以加1减1
ctx.beziercurveto(x2+w2, y2+k2, x2-w2, y2+k2, x2-w2-1, y2);

ctx.lineto(x2-w2+decrease,y2+blockheight);
ctx.beziercurveto(x2-w2+decrease, y2+blockheight+k2, x2+w2-decrease, y2+blockheight+k2, x2+w2-decrease, y2+blockheight);
ctx.lineto(x2+w2+1,y2);
var linear = ctx.createlineargradient(x2-w2, y2,x2+w2-decrease, y2+blockheight);
linear.addcolorstop(0,color[0]);
linear.addcolorstop(1,color[1]);
ctx.fillstyle = linear ; 
ctx.strokestyle=linear 
ctx.fill();
//ctx.stroke();
ctx.closepath();
//画椭圆
ctx.beginpath();
ctx.moveto(x2-w2, y2);
ctx.beziercurveto(x2-w2, y2-k2, x2+w2, y2-k2, x2+w2, y2);
ctx.beziercurveto(x2+w2, y2+k2, x2-w2, y2+k2, x2-w2, y2);
var linear = ctx.createlineargradient(x2-w2, y2,x2+w2-decrease, y2+blockheight);
linear.addcolorstop(1,color[0]);
linear.addcolorstop(0,color[1]);
ctx.fillstyle = linear ; 
ctx.strokestyle=linear 
ctx.closepath();

ctx.fill();
ctx.stroke();

ctx.restore();
};
function dr(m){
const colorlist =[
{
color:['#76e3ff','#2895ea'],
height:60
},
{
color:['#17ead9','#5d7ce9'],
height:30
},
{
color:['#1ca5e5','#d381ff'],
height:40
},
{
color:['#ffa867','#ff599e'],
height:70
},
{
color:['#ffa6e3','#ec6a70'],
height:50
},
{
color:['#f9c298','#d9436a'],
height:30
},
{
color:['#eb767b','#9971dc'],
height:30
},
{
color:['#f06af9','#5983ff'],
height:100
},
];
const space = 20;
let coneheight = 0;
// 间隔
const gap = 20;
const x = 380;
const y = 20;
const angle = 30;
let conewidth=0;
colorlist.foreach((item)=>{
coneheight += item.height +space;
});
// 最下面的先画(层级)
colorlist.reverse().foreach((item,index)=>{
const decrease =math.tan(math.pi*angle/180)*(item.height+space);
conewidth=conewidth + decrease;
coneheight = coneheight-item.height - space;
//圆锥
cone(ctx,x,coneheight ,conewidth ,item.height,decrease,item.color);
// 中点
const cx =parseint(x)+0.5;
const cy = parseint(coneheight + space+ item.height/2)+0.5;
//文字
ctx.save();
ctx.translate(cx , cy );
ctx.textbaseline='top';
ctx.textalign='center';
const fontsize = item.height/2>=40?40:item.height/2;
ctx.font = fontsize + 'px serif';
//const textmetrics = ctx.measuretext('hello world');
ctx.fillstyle = '#ffffff';
ctx.filltext('5000',0,-fontsize/3);
ctx.restore();
const xlinea =parseint(conewidth-decrease/2)+10;
const xline =parseint(m+xlinea )>=x?x:m+xlinea ;
//线
ctx.save();
ctx.translate(cx , cy );
ctx.setlinedash([3,2]); 
ctx.strokestyle = '#a4a4a4'; 
ctx.beginpath(); 
ctx.moveto(xlinea , 0); 
ctx.lineto(xline +20, 0); 
ctx.stroke();
ctx.restore();
//描述文字
ctx.save();
ctx.translate(cx , cy );
ctx.textbaseline='middle';
ctx.textalign='left';
ctx.font = '22px serif';
//const textmetrics = ctx.measuretext('hello world');
ctx.fillstyle = '#4a4a4a';
ctx.filltext('进入收件列表2',xline+gap ,0);
ctx.restore();
//转化率文字
ctx.save();
ctx.translate(cx , cy );
ctx.textbaseline='middle';
ctx.textalign='left';
ctx.font = '28px bold serif ';
ctx.fillstyle = '#007dfd';
ctx.filltext('20%',xline+gap ,(item.height+gap)/2 );
ctx.restore();
});
}
let m=0;  
let gravity =10;   
(function drawframe(){
      window.requestanimationframe(drawframe,cvs);
      ctx.clearrect(0,0,cvs.width,cvs.height);
m += gravity;
      dr(m);
})();
</script>
</body>
</html>

这是移动技术网测试后的完成图:

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网