ZetCode

JavaScript Canvas lineWidth 教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas lineWidth 属性。此属性控制在画布上绘制的线条和形状轮廓的粗细。理解 lineWidth 对于创建精确的图形至关重要。

基本定义

lineWidth 属性以像素为单位指定线条的粗细。它影响所有描边的路径,包括线条、曲线和形状轮廓。默认值为 1.0,创建细线。

线宽是沿着路径坐标居中应用的。宽度为 10 意味着路径的每一侧延伸 5 像素。此属性与 stroke() 和 strokeRect() 等描边方法一起使用。

基本的 lineWidth 示例

此示例演示了如何绘制具有不同粗细的线条。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic lineWidth</title>
</head>
<body>

<canvas id="myCanvas" width="300" height="200"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Thin line
    ctx.lineWidth = 1;
    ctx.beginPath();
    ctx.moveTo(50, 50);
    ctx.lineTo(250, 50);
    ctx.stroke();
    
    // Medium line
    ctx.lineWidth = 5;
    ctx.beginPath();
    ctx.moveTo(50, 100);
    ctx.lineTo(250, 100);
    ctx.stroke();
    
    // Thick line
    ctx.lineWidth = 15;
    ctx.beginPath();
    ctx.moveTo(50, 150);
    ctx.lineTo(250, 150);
    ctx.stroke();
</script>

</body>
</html>

此代码绘制了三条粗细递增的水平线。第一条线使用默认的 1px 宽度,第二条线使用 5px,第三条线使用 15px。

请注意每条线如何在其 y 坐标上居中。粗细在路径坐标的上方和下方均匀延伸。这演示了基本的宽度控制。

形状的 lineWidth

此示例显示了 lineWidth 如何影响不同的形状及其轮廓。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>lineWidth with Shapes</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Rectangle with thin outline
    ctx.lineWidth = 1;
    ctx.strokeStyle = 'red';
    ctx.strokeRect(50, 50, 100, 100);
    
    // Rectangle with thick outline
    ctx.lineWidth = 10;
    ctx.strokeStyle = 'blue';
    ctx.strokeRect(200, 50, 100, 100);
    
    // Circle with medium outline
    ctx.lineWidth = 5;
    ctx.strokeStyle = 'green';
    ctx.beginPath();
    ctx.arc(300, 200, 50, 0, Math.PI * 2);
    ctx.stroke();
</script>

</body>
</html>

这里我们绘制了两个矩形和一个具有不同线宽的圆。第一个矩形具有细细的 1px 红色轮廓,而第二个矩形具有粗粗的 10px 蓝色轮廓。

圆演示了 lineWidth 对曲线路径同样有效。绿色圆的轮廓为中等 5px。请注意描边如何延伸到路径的内外。

lineWidth 和线帽

此示例探讨了 lineWidth 如何与不同的线帽样式交互。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>lineWidth with Line Caps</title>
</head>
<body>

<canvas id="myCanvas" width="400" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Butt cap (default)
    ctx.lineWidth = 15;
    ctx.lineCap = 'butt';
    ctx.beginPath();
    ctx.moveTo(50, 100);
    ctx.lineTo(150, 100);
    ctx.stroke();
    
    // Round cap
    ctx.lineCap = 'round';
    ctx.beginPath();
    ctx.moveTo(200, 100);
    ctx.lineTo(300, 100);
    ctx.stroke();
    
    // Square cap
    ctx.lineCap = 'square';
    ctx.beginPath();
    ctx.moveTo(350, 100);
    ctx.lineTo(450, 100);
    ctx.stroke();
</script>

</body>
</html>

此代码演示了具有 15px 粗线的三个线帽样式。butt 帽(默认)在端点处精确结束,而 round 帽则增加了半圆形端点。

square 帽将线在每个端点外延伸 lineWidth 的一半。所有线帽在粗线的情况下都清晰可见,显示了宽度如何影响线端。

路径上的可变 lineWidth

这个高级示例展示了如何创建具有可变线宽的路径。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Variable lineWidth</title>
</head>
<body>

<canvas id="myCanvas" width="500" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Create a path with varying width
    ctx.beginPath();
    ctx.moveTo(50, 150);
    
    // Draw segments with increasing width
    for (let i = 0; i < 10; i++) {
        ctx.lineWidth = 1 + i * 2;
        ctx.lineTo(50 + i * 40, 150 + Math.sin(i) * 50);
        ctx.stroke();
        ctx.beginPath();
        ctx.moveTo(50 + i * 40, 150 + Math.sin(i) * 50);
    }
</script>

</body>
</html>

这创建了一条波浪形路径,其中每个段的线都逐渐变粗。我们通过将路径分成段并更改 lineWidth 来实现这一点。

每个段从前一个段的末尾开始。宽度以递增的方式从 1px 增加到 19px。此技术允许动态改变线粗细。

lineWidth 和性能

此示例演示了非常大的线宽对性能的影响。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>lineWidth Performance</title>
</head>
<body>

<canvas id="myCanvas" width="500" height="300"></canvas>

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // Test performance with large lineWidth
    const startTime = performance.now();
    
    ctx.lineWidth = 100;
    ctx.beginPath();
    ctx.moveTo(50, 150);
    ctx.bezierCurveTo(150, 50, 350, 250, 450, 150);
    ctx.stroke();
    
    const endTime = performance.now();
    console.log(`Rendering took ${endTime - startTime} milliseconds`);
</script>

</body>
</html>

此代码绘制了一条粗贝塞尔曲线并测量了渲染时间。非常大的 lineWidth 值会影响性能,尤其是在处理复杂路径时。

控制台记录渲染持续时间。实际上,除非必要,否则应避免使用极大的宽度,因为它们需要更多的计算才能正确渲染。

来源

MDN Canvas lineWidth 文档

在本文中,我们深入探讨了 lineWidth 属性。我们涵盖了基本用法、形状轮廓、线帽、可变宽度和性能考虑因素。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 JS Canvas 教程