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


Posted in Javascript onDecember 13, 2017

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

<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>

这是三水点靠木测试后的完成图:

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

Javascript 相关文章推荐
JQuery中的ready函数冲突的解决方法
May 17 Javascript
js页面跳转常用的几种方式
Nov 25 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
Aug 07 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
Aug 29 Javascript
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
jQuery封装的tab选项卡插件分享
Jun 16 Javascript
Node.js插件安装图文教程
May 06 Javascript
AngularJS指令与指令之间的交互功能示例
Dec 14 Javascript
浅谈JavaScript异步编程
Jan 20 Javascript
JS排序之选择排序详解
Apr 08 Javascript
vue实现循环滚动列表
Jun 30 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
Dec 13 #Javascript
实例分析js事件循环机制
Dec 13 #Javascript
javascript实现QQ空间相册展示源码
Dec 12 #Javascript
自定义PC微信扫码登录样式写法
Dec 12 #Javascript
基于模板引擎Jade的应用(详解)
Dec 12 #Javascript
jquery获取transform里的值实现方法
Dec 12 #jQuery
JS排序算法之希尔排序与快速排序实现方法
Dec 12 #Javascript
You might like
PHP源码之 ext/mysql扩展部分
2009/07/17 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
百度地图API使用方法详解
2015/08/25 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
javascript prototype 原型链
2009/03/12 Javascript
javascript ie6兼容position:fixed实现思路
2013/04/01 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
jquery调取json数据实现省市级联的方法
2015/01/29 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
[01:21]辉夜杯战队访谈宣传片—CDEC
2015/12/25 DOTA
Python二分法搜索算法实例分析
2015/05/11 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
使用Python脚本和ADB命令实现卸载App
2017/02/10 Python
python实现QQ批量登录功能
2019/06/19 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
简单了解python代码优化小技巧
2019/07/08 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
AUC计算方法与Python实现代码
2020/02/28 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
小学红领巾中秋节广播稿
2014/01/13 职场文书
幼儿园大班毕业感言
2014/02/06 职场文书
安全保证书范文
2014/04/29 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书