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 相关文章推荐
javascript URL锚点取值方法
Feb 25 Javascript
Javascript 面试题随笔
Mar 31 Javascript
jquery查找tr td 示例模拟
May 08 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
Apr 17 Javascript
Node+Express+MongoDB实现登录注册功能实例
Apr 23 Javascript
js实现登录与注册界面
Nov 01 Javascript
axios中cookie跨域及相关配置示例详解
Dec 20 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
May 29 Javascript
jQuery.parseJSON()函数详解
Feb 28 jQuery
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
写一个用户在线显示的程序
2006/10/09 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
jQuery 重复加载错误以及修复方法
2014/12/16 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
详解vue项目的构建,打包,发布全过程
2017/11/23 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
在vue中使用echarts(折线图的demo,markline用法)
2020/07/20 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[43:32]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
Python遍历字典方式就实例详解
2019/12/28 Python
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
销售自荐信
2013/10/22 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
《乡愁》教学反思
2014/02/18 职场文书
小班秋游活动方案
2014/02/22 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
农村党员对照检查材料
2014/09/24 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
Spring boot实现上传文件到本地服务器
2022/08/14 Java/Android