图形的着色区域有两种

描边区域: strokeStyle 代表了描边样式,描边区域的绘制方法是 stroke()、strokeRect() 或者strokeText() 。 填充区域: fillStyle 代表了填充样式,填充区域的绘制方法是 fill()、fillRect() 或者fillText() 。 image.png

图形的着色方式有3种

  • 纯色
    • 书写方式(与css 一致):
      • red
      • 000000

      • rgb(r,g,b)
      • rgba(r,g,b,a)
    • 赋值方式
      • ctx.fillStyle= ‘red’
      • ctx.strokeStyle= ‘rgb(r,g,b)’
  • 渐变
    • 建立渐变对象的方式:
      • 线性渐变: gradient=createLinearGradient(x1, y1, x2, y2)

image.png

  1. - 径向渐变 gradient=createRadialGradient(x1, y1, r1, x2, y2, r2)

image.png

  • 定义渐变的颜色节点 gradient.addColorStop(position, color)
  • 赋值方式
    • ctx.fillStyle= gradient
    • ctx.strokeStyle= gradient
      • 纹理
  • 建立纹理对象:
    • pattern=context.createPattern(image,”repeat|repeat-x|repeat-y|no-repeat”);
  • 为着色样式赋值
    • ctx.fillStyle= pattern
    • ctx.strokeStyle= pattern

image.png

描边样式

影响描边样式的因素

strokeStyle:描边的颜色。

  1. ctx.strokeStyle = 'red'

lineWidth:描边宽。定义描边的宽度,它是从路径的中心开始绘制的,内外各占宽度的一半。

  1. ctx.lineWidth=40;

image.png

lineCap:描边端点样式。

  1. <canvas id="canvas"></canvas>
  2. <script>
  3. const canvas=document.getElementById('canvas');
  4. //canvas充满窗口
  5. canvas.width=window.innerWidth;
  6. canvas.height=window.innerHeight;
  7. //画笔
  8. const ctx=canvas.getContext('2d');
  9. /*strokeStyle:描边的着色样式*/
  10. ctx.strokeStyle='maroon';
  11. /*lineWidth:描边宽*/
  12. ctx.lineWidth=40;
  13. /*lineCap 描边端点样式
  14. * butt 没有端点,默认
  15. * round 圆形端点
  16. * square 方形端点
  17. * */
  18. ctx.save();
  19. ctx.lineCap='butt';
  20. ctx.beginPath();
  21. ctx.moveTo(50,50);
  22. ctx.lineTo(400,50);
  23. ctx.stroke();
  24. ctx.restore();
  25. ctx.save();
  26. ctx.lineCap='round';
  27. ctx.beginPath();
  28. ctx.moveTo(50,150);
  29. ctx.lineTo(400,150);
  30. ctx.stroke();
  31. ctx.restore();
  32. ctx.save();
  33. ctx.lineCap='square';
  34. ctx.beginPath();
  35. ctx.moveTo(50,250);
  36. ctx.lineTo(400,250);
  37. ctx.stroke();
  38. ctx.restore();
  39. </script>

image.png

lineJoin:描边拐角类型 。

  1. <canvas id="canvas"></canvas>
  2. <script>
  3. const canvas=document.getElementById('canvas');
  4. //canvas充满窗口
  5. canvas.width=window.innerWidth;
  6. canvas.height=window.innerHeight;
  7. //画笔
  8. const ctx=canvas.getContext('2d');
  9. /*strokeStyle:描边的着色样式*/
  10. ctx.strokeStyle='maroon';
  11. /*lineWidth:描边宽*/
  12. ctx.lineWidth=40;
  13. /*lineJoin 拐角类型
  14. * miter 尖角
  15. * round 圆角
  16. * bevel 切角
  17. * */
  18. ctx.save();
  19. ctx.lineJoin='miter';
  20. ctx.beginPath();
  21. ctx.moveTo(50,50);
  22. ctx.lineTo(400,50);
  23. ctx.lineTo(200,150);
  24. ctx.stroke();
  25. ctx.restore();
  26. ctx.save();
  27. ctx.lineJoin='round';
  28. ctx.beginPath();
  29. ctx.moveTo(50,250);
  30. ctx.lineTo(400,250);
  31. ctx.lineTo(200,350);
  32. ctx.stroke();
  33. ctx.restore();
  34. ctx.save();
  35. ctx.lineJoin='bevel';
  36. ctx.beginPath();
  37. ctx.moveTo(50,450);
  38. ctx.lineTo(400,450);
  39. ctx.lineTo(200,550);
  40. ctx.stroke();
  41. ctx.restore();
  42. </script>

image.png

miterLimit:拐角最大厚度(只适用于lineJoin=‘miter’ 的情况)。

  1. <canvas id="canvas"></canvas>
  2. <script>
  3. const canvas=document.getElementById('canvas');
  4. //canvas充满窗口
  5. canvas.width=window.innerWidth;
  6. canvas.height=window.innerHeight;
  7. //画笔
  8. const ctx=canvas.getContext('2d');
  9. /*strokeStyle:描边的着色样式*/
  10. ctx.strokeStyle='maroon';
  11. /*lineWidth:描边宽*/
  12. ctx.lineWidth=40;
  13. /*miterLimit 拐角限制,number 类型,如2,1,3*/
  14. ctx.save();
  15. ctx.miterLimit=2;
  16. ctx.beginPath();
  17. ctx.moveTo(50,50);
  18. ctx.lineTo(400,50);
  19. ctx.lineTo(400,150);
  20. ctx.stroke();
  21. ctx.restore();
  22. </script>

image.png

setLineDash(segments):将描边设置为虚线,可以通过getLineDash() 方法获取虚线样式。

  1. <canvas id="canvas"></canvas>
  2. <script>
  3. const canvas=document.getElementById('canvas');
  4. //canvas充满窗口
  5. canvas.width=window.innerWidth;
  6. canvas.height=window.innerHeight;
  7. //画笔
  8. const ctx=canvas.getContext('2d');
  9. /*strokeStyle:描边的着色样式*/
  10. ctx.strokeStyle='maroon';
  11. /*lineWidth:描边宽*/
  12. ctx.lineWidth=4;
  13. /* setLineDash(segments) 虚线 */
  14. ctx.save();
  15. ctx.beginPath();
  16. ctx.moveTo(50,100);
  17. ctx.lineTo(700,100);
  18. ctx.setLineDash([30,60,90]);
  19. ctx.stroke();
  20. ctx.restore();
  21. </script>

image.png

lineDashOffset:虚线的偏移量。

  1. <canvas id="canvas"></canvas>
  2. <script>
  3. const canvas=document.getElementById('canvas');
  4. //canvas充满窗口
  5. canvas.width=window.innerWidth;
  6. canvas.height=window.innerHeight;
  7. //画笔
  8. const ctx=canvas.getContext('2d');
  9. /*strokeStyle:描边的着色样式*/
  10. ctx.strokeStyle='maroon';
  11. /*lineWidth:描边宽*/
  12. ctx.lineWidth=4;
  13. /* lineDashOffset 虚线偏移 */
  14. ctx.save();
  15. ctx.beginPath();
  16. ctx.moveTo(50,100);
  17. ctx.lineTo(700,100);
  18. ctx.setLineDash([60]);
  19. ctx.stroke();
  20. ctx.restore();
  21. ctx.save();
  22. ctx.beginPath();
  23. ctx.moveTo(50,150);
  24. ctx.lineTo(700,150);
  25. ctx.setLineDash([60]);
  26. ctx.lineDashOffset=-90;
  27. ctx.stroke();
  28. ctx.restore();
  29. </script>

image.png

霓虹灯

实现思路:

  • 爱心:两个三次贝塞尔曲线
  • 描边
  • 虚线偏移
  1. <canvas id="canvas"></canvas>
  2. <script>
  3. const canvas=document.getElementById('canvas');
  4. // canvas充满窗口
  5. canvas.width=window.innerWidth;
  6. canvas.height=window.innerHeight;
  7. // 画笔
  8. const ctx=canvas.getContext('2d');
  9. // 颜色数组
  10. const colors=['red','yellow'];
  11. function draw(){
  12. // 保存上下文对象的状态
  13. ctx.save();
  14. // 偏移坐标系
  15. ctx.translate(300,400);
  16. // 开始绘制路径
  17. ctx.beginPath();
  18. // 向路径集合中添加子路径
  19. // 绘制心形子路径
  20. // 设置路径起点
  21. ctx.moveTo(0,0);
  22. // 用两个三次贝塞尔曲线组成爱心
  23. ctx.bezierCurveTo(-200,-50,-180,-300,0,-200);
  24. ctx.bezierCurveTo(180,-300,200,-50,0,0);
  25. // 设置描边宽度
  26. ctx.lineWidth=10;
  27. ctx.setLineDash([30]);
  28. /*--------虚线1-------*/
  29. // 描边颜色
  30. ctx.strokeStyle=colors[0];
  31. // 以描边的方式显示路径
  32. ctx.stroke();
  33. /*--------虚线2-------*/
  34. // 描边颜色
  35. ctx.lineDashOffset=30;
  36. ctx.strokeStyle=colors[1];
  37. // 以描边的方式显示路径
  38. ctx.stroke();
  39. // 将上下文对象的状态恢复到上一次保存时的状态
  40. ctx.restore();
  41. }
  42. setInterval(function(){
  43. draw();
  44. colors.reverse();
  45. },200)
  46. </script>

GIF 2020-12-27 22-00-58.gif