HTML5 Canvas的常用线条属性值总结


Posted in HTML / CSS onMarch 17, 2016

线条属性概述
线条的属性共有以下四个:
1、lineCap属性
lineCap 定义上下文中线的端点,可以有以下 3 个值。

butt:默认值,端点是垂直于线段边缘的平直边缘。
round:端点是在线段边缘处以线宽为直径的半圆。
square:端点是在选段边缘处以线宽为长、以一半线宽为宽的矩形。

2、 lineJoin属性
lineJoin 定义两条线相交产生的拐角,可将其称为连接。在连接处创建一个填充三角形,可以使用 lineJoin 设置它的基本属性。

miter:默认值,在连接处边缘延长相接。miterLimit 是角长和线宽所允许的最大比例(默认是 10)。
bevel:连接处是一个对角线斜角。
round:连接处是一个圆。

3、线宽
lineWidth 定义线的宽度(默认值为 1.0)。

4、笔触样式
strokeStyle 定义线和形状边框的颜色和样式。
后面两个前面已经说过了,这里我们着重来看看前两个属性。
线条的帽子lineCap

废话不多说,直接上代码看效果。

JavaScript Code复制内容到剪贴板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  5.     <title>线条的帽子</title>   
  6. </head>   
  7. <body>   
  8. <div id="canvas-warp">   
  9.     <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
  10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
  11.     </canvas>   
  12. </div>   
  13.   
  14. <script>   
  15.     window.onload = function(){   
  16.         var canvas = document.getElementById("canvas");   
  17.         canvas.width = 800;   
  18.         canvas.height = 600;   
  19.         var context = canvas.getContext("2d");   
  20.   
  21.         context.lineWidth = 50;   
  22.         context.strokeStyle = "#1BAAAA";   
  23.   
  24.         context.beginPath();   
  25.         context.moveTo(100,100);   
  26.         context.lineTo(700,100);   
  27.         context.lineCap = "butt";   
  28.         context.stroke();   
  29.   
  30.         context.beginPath();   
  31.         context.moveTo(100,300);   
  32.         context.lineTo(700,300);   
  33.         context.lineCap = "round";   
  34.         context.stroke();   
  35.   
  36.         context.beginPath();   
  37.         context.moveTo(100,500);   
  38.         context.lineTo(700,500);   
  39.         context.lineCap = "square";   
  40.         context.stroke();   
  41.   
  42.         //下面画两个基准线方便观察   
  43.         context.lineWidth = 3;   
  44.         context.strokeStyle = "black";   
  45.   
  46.         context.beginPath();   
  47.         context.moveTo(100,0);   
  48.         context.lineTo(100,600);   
  49.         context.moveTo(700,0);   
  50.         context.lineTo(700,600);   
  51.         context.stroke();   
  52.     }   
  53. </script>   
  54. </body>   
  55. </html>   
  56.   

运行结果:
HTML5 Canvas的常用线条属性值总结

这里我还做了两条平行线做一下参考,这样一眼就能看清lineCap三个值的特点。但要注意,这个帽子只在线条的端点处起作用,哪怕是折点很多的折线,也仅仅是在开始和终止的两个端点带帽子。如果想改变线条折点(两个线段的连接处)的样式,那就要用到下面的lineJoin属性。
线条的连接lineJoin

废话不多说,直接上代码看效果。这段代码改自4-3,只是设置了一下连接的属性。

JavaScript Code复制内容到剪贴板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  5.     <title>线条的连接</title>   
  6. </head>   
  7. <body>   
  8. <div id="canvas-warp">   
  9.     <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
  10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
  11.     </canvas>   
  12. </div>   
  13.   
  14. <script>   
  15.     window.onload = function(){   
  16.         var canvas = document.getElementById("canvas");   
  17.         canvas.width = 800;   
  18.         canvas.height = 600;   
  19.         var context = canvas.getContext("2d");   
  20.   
  21.         context.beginPath();   
  22.         context.moveTo(100,100);   
  23.         context.lineTo(300,300);   
  24.         context.lineTo(100,500);   
  25.         context.lineJoin = "miter";   
  26.         context.lineWidth = 20;   
  27.         context.strokeStyle = "red";   
  28.         context.stroke();   
  29.   
  30.         context.beginPath();   
  31.         context.moveTo(300,100);   
  32.         context.lineTo(500,300);   
  33.         context.lineTo(300,500);   
  34.         context.lineJoin = "bevel";   
  35.         context.lineWidth = 20;   
  36.         context.strokeStyle = "blue";   
  37.         context.stroke();   
  38.   
  39.         context.beginPath();   
  40.         context.moveTo(500,100);   
  41.         context.lineTo(700,300);   
  42.         context.lineTo(500,500);   
  43.         context.lineJoin = "round";   
  44.         context.lineWidth = 20;   
  45.         context.strokeStyle = "black";   
  46.         context.stroke();   
  47.     }   
  48. </script>   
  49. </body>   
  50. </html>  

运行结果:
HTML5 Canvas的常用线条属性值总结

看不清的童鞋自己放大网页或者自己将代码的线宽调宽一点。
这里有一个很隐蔽的属性,就是当lineJoin设置为miter时(默认),会解锁一个成绩,可以使用miterLimit属性。
举个例子看看。

JavaScript Code复制内容到剪贴板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  5.     <title>miterLimit</title>   
  6. </head>   
  7. <body>   
  8. <div id="canvas-warp">   
  9.     <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
  10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
  11.     </canvas>   
  12. </div>   
  13.   
  14. <script>   
  15.     window.onload = function(){   
  16.         var canvas = document.getElementById("canvas");   
  17.         canvas.width = 800;   
  18.         canvas.height = 600;   
  19.         var context = canvas.getContext("2d");   
  20.   
  21.         context.beginPath();   
  22.         context.moveTo(100,100);   
  23.         context.lineTo(300,300);   
  24.         context.lineTo(100,500);   
  25.         context.lineJoin = "miter";   
  26.         context.miterLimit = 10;   
  27.         context.lineWidth = 5;   
  28.         context.strokeStyle = "red";   
  29.         context.stroke();   
  30.   
  31.         context.beginPath();   
  32.         context.moveTo(300,200);   
  33.         context.lineTo(500,300);   
  34.         context.lineTo(300,400);   
  35.         context.lineJoin = "miter";   
  36.         context.miterLimit = 10;   
  37.         context.lineWidth = 5;   
  38.         context.strokeStyle = "blue";   
  39.         context.stroke();   
  40.   
  41.         context.beginPath();   
  42.         context.moveTo(500,290);   
  43.         context.lineTo(700,300);   
  44.         context.lineTo(500,310);   
  45.         context.lineJoin = "miter";   
  46.         context.miterLimit = 10;   
  47.         context.lineWidth = 5;   
  48.         context.strokeStyle = "black";   
  49.         context.stroke();   
  50.     }   
  51. </script>   
  52. </body>   
  53. </html>  

运行结果:
HTML5 Canvas的常用线条属性值总结

会发现,这个miterLimit规定了一个自动填充连接点的极限值。如果超过了这个值,会导致lineJoin属性失效,会从 miter 变成 bevel。可以看出来,这个值和线宽以及夹角有关,具体是啥关系。看下图。
HTML5 Canvas的常用线条属性值总结

可以看到,关系有点复杂。有兴趣的小伙伴可以推导一下这个值与线宽、夹角的函数关系。其实,大多时候用不到这个隐藏属性,即便用到了也是凭感觉写个数然后不满意再调试即可。
高级线段绘制举例
实际在画布上绘制线段时,会有一些奇怪的现象发生,这里融合本节课学到的两个线段的属性讲解一个。

JavaScript Code复制内容到剪贴板
  1. <!DOCTYPE html>   
  2. <html lang="zh">   
  3. <head>   
  4.     <meta charset="UTF-8">   
  5.     <title>miterLimit</title>   
  6. </head>   
  7. <body>   
  8. <div id="canvas-warp">   
  9.     <canvas id="canvas" style="border: 1px solid #aaaaaa; display: block; margin: 50px auto;">   
  10.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
  11.     </canvas>   
  12. </div>   
  13.   
  14. <script>   
  15.     window.onload = function(){   
  16.         var canvas = document.getElementById("canvas");   
  17.         canvas.width = 800;   
  18.         canvas.height = 600;   
  19.         var context = canvas.getContext("2d");   
  20.   
  21.         // 实例1: 圆形端点,斜角连接,在画布左上角   
  22.         context.beginPath();   
  23.         context.moveTo(0,0);   
  24.         context.lineTo(180,0);   
  25.         context.lineTo(180,180);   
  26.         context.lineJoin = 'bevel';   
  27.         context.lineCap = 'round';   
  28.         context.lineWidth = 10;   
  29.         context.strokeStyle = "red";   
  30.         context.stroke();   
  31.   
  32.         // 实例2: 圆形端点,斜角连接,不在画布左上角   
  33.         context.beginPath();   
  34.         context.moveTo(300,200);   
  35.         context.lineTo(480,200);   
  36.         context.lineTo(480,380);   
  37.         context.lineJoin = 'bevel';   
  38.         context.lineCap = 'round';   
  39.         context.lineWidth = 10;   
  40.         context.strokeStyle = "blue";   
  41.         context.stroke();   
  42.   
  43.         // 实例3: 平直端点,圆形连接,不在画布左上角   
  44.         context.beginPath();   
  45.         context.moveTo(600,400);   
  46.         context.lineTo(780,400);   
  47.         context.lineTo(780,580);   
  48.         context.lineJoin = 'round';   
  49.         context.lineCap = 'butt';   
  50.         context.lineWidth = 10;   
  51.         context.strokeStyle = "black";   
  52.         context.stroke();   
  53.     }   
  54. </script>   
  55. </body>   
  56. </html>  

运行结果:
HTML5 Canvas的常用线条属性值总结

这 3 个线段和连接的实例有助于说明在画布上绘制线段时不同属性的组合。
实例 1 尝试从画布左上角开始绘制,结果发生了一个奇怪的现象。Canvas 路径在 x 轴和 y 轴方向上都绘制到了起点的外侧。由于这个原因实例 1 上面的线看起来要细些。另外,左上角水平部分中圆形端点也无法看到,它们都被绘制到了屏幕之外的负值坐标区域。此外,lineJoin 定义的对角线斜角也没有绘出。
实例 2 调整了例子 1 中出现的问题,将起始点离开左上角。这样就绘制出了完整的水平线,并且圆形 lineCap 和斜角 lineJoin 都被绘制出来了。
实例 3 显示了去掉 lineCap 设置后的默认端点效果,并且将 lineJoin 调整为圆角。

HTML / CSS 相关文章推荐
CSS3中的注音对齐属性ruby-align用法指南
Jul 01 HTML / CSS
css3 按钮 利用css3实现超酷下载按钮
Mar 18 HTML / CSS
css3实现动画的三种方式
Aug 24 HTML / CSS
10种CSS3实现的loading动画,挑一个走吧?
Nov 16 HTML / CSS
使用CSS3制作版头动画效果
Dec 24 HTML / CSS
Html5游戏开发之乒乓Ping Pong游戏示例(二)
Jan 21 HTML / CSS
html5 CSS过度-webkit-transition使用介绍
Jul 02 HTML / CSS
HTML5中div、article、section的区别及使用介绍
Aug 14 HTML / CSS
使用phonegap克隆和删除联系人的实现方法
Mar 31 HTML / CSS
HTML5新增属性data-*和js/jquery之间的交互及注意事项
Aug 08 HTML / CSS
Html5新增了哪些功能
Apr 16 HTML / CSS
CSS三大特性继承性、层叠性和优先级详解
Jan 18 HTML / CSS
HTML5 Canvas基本线条绘制的实例教程
Mar 17 #HTML / CSS
HTML5 Canvas入门学习教程
Mar 17 #HTML / CSS
HTML5 3D衣服摇摆动画特效
Mar 17 #HTML / CSS
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
Mar 15 #HTML / CSS
通过HTML5 Canvas API绘制弧线和圆形的教程
Mar 14 #HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
Mar 14 #HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
Mar 11 #HTML / CSS
You might like
php对二维数组进行排序的简单实例
2013/12/19 PHP
php开启openssl的方法
2014/05/15 PHP
PHP的PDO连接讲解
2019/01/24 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
网页常用特效代码整理
2006/06/23 Javascript
Expandable &quot;Detail&quot; Table Rows
2007/08/29 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
学前教育毕业生自荐信范文
2013/12/24 职场文书
简单的辞职信范文
2014/01/18 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
服务承诺书格式
2014/05/21 职场文书
应届大学生自荐书
2014/06/17 职场文书
人力资源职位说明书
2014/07/29 职场文书
购房委托书
2014/10/15 职场文书
先进单位申报材料
2014/12/25 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js