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中border-radius属性设定圆角的使用技巧
May 10 HTML / CSS
css3实现垂直下拉动画菜单示例
Apr 22 HTML / CSS
在HTML5中如何使用CSS建立不可选的文字
Oct 17 HTML / CSS
HTML5 MiranaVideo播放器 (代码开源)
Jun 11 HTML / CSS
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
Jan 31 HTML / CSS
HTML5 Web Workers之网站也能多线程的实现
Apr 24 HTML / CSS
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
Jun 16 HTML / CSS
使用HTML5 Canvas API控制字体的显示与渲染的方法
Mar 24 HTML / CSS
如何利用input事件来监听移动端的输入
Apr 15 HTML / CSS
解析html5 canvas实现背景鼠标连线动态效果代码
Jun 17 HTML / CSS
如何给HTML标签中的文本设置修饰线
Nov 18 HTML / CSS
Html5同时支持多端sdk的小技巧
Nov 17 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缓冲输出实例分析
2015/01/05 PHP
正确的PHP匹配UTF-8中文的正则表达式
2015/05/13 PHP
php数据访问之查询关键字
2016/05/09 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
可以文本显示的公告栏的js代码
2007/03/11 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
python使用循环实现批量创建文件夹示例
2014/03/25 Python
Python线程指南详细介绍
2017/01/05 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
Engel & Bengel官网:婴儿推车、儿童房家具和婴儿设备
2019/12/28 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
运动会领导邀请函
2014/01/10 职场文书
小学英语课后反思
2014/04/26 职场文书
我的中国心演讲稿
2014/09/04 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
实习证明格式范文
2014/10/14 职场文书
计算机专业自荐信
2015/03/05 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
导游词之四川武侯祠
2019/10/21 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
html中两种获取标签内的值的方法
2022/06/16 jQuery