canvas-画文字

3,170 阅读1分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

1, 画文字

fillText() 在画布上绘制填色的文本, 默认颜色也是黑色

fillText(text, x, y, maxWidth) : 参数说明

text   #规定在画布上输出的文本
x      # 开始绘制文本的x坐标位置
y      # 开始绘制文本的y坐标位置
maxWidth # 可选, 允许的最大文本宽度

注意:如果要绘制空心文字,需要用strokeText()

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Canvas绘制文字</title>
  <style>
    canvas {
      margin: 0 auto;
      border: 1px solid red;
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas, 建议你使用Chrome或者火狐浏览器达到更好的显示效果
  </canvas>
</body>
<script>
  // 获取canvas标签
  var canvas = document.getElementById('canvas')
  // 获取canvas上下文对象,可理解为:使用画布的权限
  var context = canvas.getContext('2d')
  // 获取画布宽高
  var w = context.canvas.width;
  var h = context.canvas.height;
   // 设置字体相关样式
  context.font = '40px 宋体'
  // 样色
  context.fillStyle = 'red'
  // 画文字
  context.fillText('贰拾壹先生', w/2, w/2)
  context.strokeStyle = 'blue'
  // 绘制空心文字
  context.strokeText('你好', 100 , 250)

  // 设置最大宽度
  context.fillStyle = 'gold'
  context.fillText("最大宽度,不管内容多少,左右都100px", 100, 100, 300)
</script>
</html>

效果如图:

1643422311111.png

2, 线性渐变

通过 createLinearGradient设置整个画布都需要渐变

然后通过addColorStop设置渐变颜色

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Canvas绘制文字</title>
  <style>
    canvas {
      margin: 0 auto;
      border: 1px solid red;
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas, 建议你使用Chrome或者火狐浏览器达到更好的显示效果
  </canvas>
</body>
<script>
  // 获取canvas标签
  var canvas = document.getElementById('canvas')
  // 获取canvas上下文对象,可理解为:使用画布的权限
  var context = canvas.getContext('2d')
  // 获取画布宽高
  var w = context.canvas.width;
  var h = context.canvas.height;
   // 设置字体相关样式
  context.font = '40px 宋体'
  // 设置线性渐变
  var gradient = context.createLinearGradient(0, 0, canvas.width, 0)
      gradient.addColorStop('0', "yellow")
      gradient.addColorStop('0', "blue")
      gradient.addColorStop('1.0', 'red')
      context.strokeStyle = gradient
  // 实心文字
      context.fillStyle = gradient
  context.fillText('实心文字',0, 100, 500)
  // 空心文字
  context.strokeText('风和丽日,心情开朗', 0, 300, 500)
  
</script>
</html>

1643422992854.png

3, 文字位置

textAlgin 设置或返回文本内容的当前对齐方式

textAlign = end
textAlign = start
textAlign = left
textAlign = center
textAlign = right

textBaseLine 设置或返回咋绘制文本时的当前文本基线

textBaseLine = Top
textBaseLine = Bottom
textBaseLine = Middle
textBaseLine = Alphabetic
textBaseLine = Hanging

演示: 在画布中画两条线,一条横线,一条竖线,演示字体文字

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Canvas绘制文字</title>
  <style>
    canvas {
      margin: 0 auto;
      border: 1px solid red;
      display: block;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="500px" height="500px">
    您的浏览器不支持Canvas, 建议你使用Chrome或者火狐浏览器达到更好的显示效果
  </canvas>
</body>
<script>
  // 获取canvas标签
  var canvas = document.getElementById('canvas')
  // 获取canvas上下文对象,可理解为:使用画布的权限
  var context = canvas.getContext('2d')
  // 获取画布宽高
  var w = context.canvas.width;
  var h = context.canvas.height;
  // 画直线
  context.beginPath()
  context.moveTo(250, 0)
  context.lineTo(250, 500)
  context.stroke()
  context.closePath()
  // 画横线
  context.beginPath()
  context.moveTo(0, 250)
  context.lineTo(500, 250)
  context.stroke()
  context.closePath()

   // 设置字体相关样式
  context.font = '20px 宋体'
  //context.textAlign = 'end';
  context.textAlign = 'center'
  context.textBaseLine = 'middle'
  // 设置文本位置
  context.fillText('这是字体位置', 250, 250)
  
</script>
</html>

效果如图:

1643428213044.png

4, 项目源码

项目代码地址和文档中的截图都是同步的,都已经实现, 在canvas文件夹中

[持续更新中]

gitee.com/jamiedawn/t…