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 继承详解(三)
Jul 13 Javascript
改变javascript函数内部this指针指向的三种方法
Apr 23 Javascript
css与javascript跨浏览器兼容性总结
Sep 15 Javascript
jQuery事件绑定和委托实例
Nov 25 Javascript
jquery实现超简洁的TAB选项卡效果代码
Aug 28 Javascript
微信小程序网络请求的封装与填坑之路
Apr 01 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
Apr 06 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
深入Node TCP模块的理解
Mar 13 Javascript
vue项目首屏打开速度慢的解决方法
Mar 31 Javascript
小程序跨页面交互的作用与方法详解
Jan 07 Javascript
二维码条形码生成的JavaScript脚本库
Jul 07 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 printf输出格式使用说明
2010/12/05 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP输出缓存ob系列函数详解
2014/03/11 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
jQuery级联操作绑定事件实例
2014/09/02 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
微信小程序表单弹窗实例
2018/07/19 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
Python中的map、reduce和filter浅析
2014/04/26 Python
Django查找网站项目根目录和对正则表达式的支持
2015/07/15 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python实现读取并保存文件的类
2017/05/11 Python
Python实现的rsa加密算法详解
2018/01/24 Python
Django中的Signal代码详解
2018/02/05 Python
Python rstrip()方法实例详解
2018/11/11 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
opencv导入头文件时报错#include的解决方法
2019/07/31 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
锐步英国官网:Reebok英国
2019/11/29 全球购物
介绍一下如何优化MySql
2016/12/20 面试题
个人求职信范文分享
2013/12/13 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
争先创优个人总结
2015/03/04 职场文书
学校教学管理制度
2015/08/06 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电