html5基础入门教程之canvas运用样式与颜色,前端开发大型网站

本文详细介绍了HTML5 Canvas中设置样式与颜色的方法,包括使用fillStyle和strokeStyle设置透明度,通过rgba()定义颜色透明度,以及线型属性如lineWidth、lineCap、lineJoin和miterLimit的用法。示例代码展示了如何创建不同颜色和透明度的矩形,以及线型的变化。此外,还提到了渐变的创建和应用,包括线性渐变和径向渐变,以及addColorStop()方法的使用。最后,作者分享了个人前端开发经验和学习资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ctx.fillStyle=‘blue’;

ctx.fillRect(50,50,75,50);

ctx.fillStyle=‘green’;

ctx.fillRect(80,80,75,50);

}

}

上面这个例子,红色的矩形是完全不透明的,因为在它之前并没有设置透明度。在红色矩形绘制完成后,设置了都明度为0.2,从而之后绘制的蓝色矩形和绿色矩形的透明度都受影响了。

2.rgba

由于strokeStyle和fillStyle都接受符合css3规范的颜色值,所以还可以使用另一种设置透明度的方法,那就是rgba()方法,它的灵活性更大。

rgba()示例:

rgba

function draw(){

var canvas=document.getElementById(‘test_rgba’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

//绘制四个宽高为150*37.5的矩形,颜色分别为:黄、绿、蓝、红

ctx.fillStyle=‘rgb(255,221,0)’;

ctx.fillRect(10,0,150,37.5);

ctx.fillStyle=‘rgb(102,204,0)’;

ctx.fillRect(10,37.5,150,37.5);

ctx.fillStyle=‘rgb(0,153,255)’;

ctx.fillRect(10,75,150,37.5);

ctx.fillStyle=‘rgb(255,51,0)’;

ctx.fillRect(10,112.5,150,37.5);

//绘制上面大矩形内部的白色小矩形

for(var i=0;i<10;i++){

ctx.fillStyle=‘rgba(255,255,255,’+(i+1)/10+‘)’;

for(var j=0;j<4;j++){

ctx.fillRect(15+i14,5+j37.5,14,27.5);

}

}

}

}

上面的例子,先竖向绘制了四个大小一致、颜色分别为黄、绿、蓝、红的背景矩形。然后根据变量i和j在四个矩形内部分别以一定步长来绘制背景色为白色透明度不一的白色小矩形。

线型

canvas可以通过一定属性来设置线的样式。

lineWidth = value

lineCap = type

lineJoin = type

miterLimit = value

1.lineWidth属性

lineWidth用于设置当前绘制的线的粗细。属性值必须为正数。默认值为1.0。

注意,这里的线宽是指给定路径的中心到两边的粗细。换句话说就是:在路径的两边各绘制线宽的一半。

来看一个例子:

lineWidth

function draw(){

var canvas=document.getElementById(‘test_lineWidth1’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

ctx.lineWidth=10;

ctx.strokeRect(20,20,80,100);

}

}

由上面的例子可以看出,线宽是由起始位置向两边扩展的。

2.lineCap属性

属性lineGap设置或返回了线条末端线帽的样式。

它有三个可选值,分别为:butt,这个值是默认的,表示向线条的每个末端添加平直的边缘;round,表示向线条的每个末端添加圆形线帽;square,表示向线条的每个末端添加正方形的线帽。

lineCap示例:

lineCap

function draw(){

var canvas=document.getElementById(‘test_lineGap’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

var lineCap=[‘butt’,‘round’,‘square’];

//绘制上下两条水平参考线

ctx.strokeStyle=‘#09f’;

ctx.beginPath();

ctx.moveTo(10,10);

ctx.lineTo(140,10);

ctx.moveTo(10,140);

ctx.lineTo(140,140);

ctx.stroke();

//画线条

ctx.strokeStyle=‘black’;

for(var i=0; i<lineCap.length; i++){

ctx.lineWidth=15;

ctx.lineCap=lineCap[i];

ctx.beginPath();

ctx.moveTo(25+i*50,10);

ctx.lineTo(25+i*50,140);

ctx.stroke();

}

}

}

上面的例子从左到右绘制了三条竖线,它们的起点和终点都落在了蓝色辅助线上,lineCap属性分别为butt,round,square。第一条竖线,lineCap属性是默认的butt,它的端点是与辅助线齐平的;第二条竖线的lineCap属性为round,在端点处加了半径为一般线宽的半圆;第三条竖线的lineCap属性设置为square,在端点处加了等宽且高度为一半线宽的方块。

3.lineJoin属性

当一个路径包含了线段或曲线相交的交点时,lineJoin属性说明如何绘制这些交点。只有当绘制具有等宽线条的时候,这一属性的效果才能表现出来。

它的可选值有三个,分别是:round、bevel和miter。默认值是miter。

lineJoin示例:

function draw(){

var canvas=document.getElementById(‘test_lineJoin’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

var lineJoin=[‘round’,‘bevel’,‘miter’];

ctx.lineWidth=10;

for(var i=0; i<lineJoin.length; i++){

ctx.lineJoin=lineJoin[i];

ctx.beginPath();

ctx.moveTo(-5,5+i*40);

ctx.lineTo(35,45+i*40);

ctx.lineTo(75,5+i*40);

ctx.lineTo(115,45+i*40);

ctx.lineTo(155,5+i*40);

ctx.stroke();

}

}

}

上面的例子,第一条折线的lineJoin属性值为round,可以看出在相交处边角被磨圆了,圆的半径等于线宽;第二条折线的lineJoin属性值为bevel,定点的外边缘和一个填充的三角形相交;第三条折线的lineJoin属性为默认的miter,两条线段的外边缘一直扩展到他们相交。当两条线段以一个锐角相交,斜角连接可能变得很长。miterLimit 属性为一个斜面的长度设置了上限。超过这一限制,斜面就变成斜角了。

4.miterLimit属性

miterLimit 属性设置或返回最大斜接长度。

斜接长度指的是在两条线交汇处内角和外角之间的距离。

miterlimit

注意:只有当 lineJoin 属性为 “miter” 时,miterLimit 才有效。

边角的角度越小,斜接长度就会越大。为了避免斜接长度过长,我们可以使用 miterLimit 属性。

如果斜接长度超过 miterLimit 的值,边角会以 lineJoin 的 “bevel” 类型来显示(图解 3):

miterlimit_bevel

语法:miterLimit=number;

内容层的展现是最主要的,无论背景层和贴图层有多少花哨,在设计师设计过程中,内容层对用户的展示是最优先的。

渐变

我们可以使用径向渐变或者线性渐变来填充或描边所绘制的图形。

1.线性渐变

createLinearGradient(xStart, yStart, xEnd, yEnd)

线性渐变有四个参数,其中xStart,yStart为渐变起始点的坐标;xEnd,yEnd为渐变结束点的坐标。

这个方法创建并返回了一个新的canvasGradient对象,它在指定的起始点和结束点之间线性的内插颜色值。

2.径向渐变

createRadialGradient(xStart, yStart, radiusStart, xEnd, yEnd, radiusEnd)

径向渐变有六个参数,其中xStart,yStart为开始圆的圆心坐标;radiusStart为开始圆的半径;xEnd, yEnd为结束圆的圆心坐标;radiusEnd为结束圆的半径。

这个方法创建并返回一个新的CanvasGradient对象,该对象在两个指定的圆周直接放射性的插值颜色。

注意,以上两个方法都没有为渐变指定任何颜色。使用返回对象的addColorStop()来设置颜色。要使用一个渐变来勾勒线条或填充区域,只需要把CanvasGradient对象赋给strokeStyle属性或fillStyle属性即可。

3.addColorStop()方法

上面提到了,addColorStop()方法在渐变中的抹一点添加一个颜色变化。语法格式如下:

addColorStop(offset,color)

offset是一个范围在0.0到1.0之间的浮点值,表示渐变开始点和结束点直接的一部分。offset值为0对应开始点,offset值为1对应结束点。

color以一个css颜色字符串的方式,表示在指定offset显示的颜色。

createLinearGradient示例:

createlinergradient

function draw(){

var canvas=document.getElementById(‘test_createLinearGradient’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

var linergradient=ctx.createLinearGradient(0,0,0,150);

linergradient.addColorStop(0,‘#00abeb’); //起始点颜色值

linergradient.addColorStop(0.5,‘#fff’); //中间位置颜色值

linergradient.addColorStop(0.5,‘#26c000’); //中间位置颜色值

linergradient.addColorStop(1,‘#fff’); //结束点颜色值

ctx.fillStyle=linergradient; //填充颜色

ctx.fillRect(35,10,130,130);

}

}

上面这个例子,绘制了一个130*130的正方形,并且用线性渐变填充了颜色。设置了四个点的颜色值,形成了从蓝到白又从绿到白的渐变色。

createRadialGradient示例:

createradialgradient

function draw(){

var canvas=document.getElementById(‘test_createRadialGradient’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

var radialgradient=ctx.createRadialGradient(45,45,10,52,50,30);

radialgradient.addColorStop(0,‘#a7d30c’);

radialgradient.addColorStop(0.9,‘#019f62’);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

结束

一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

-1712154113103)]

结束

一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值