ZetCode

JavaScript Canvas shadowOffsetX 教程

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 JavaScript 中的 Canvas shadowOffsetX 属性。此属性控制 HTML canvas 中阴影的水平偏移。掌握阴影效果对于在图形中创建深度和真实感至关重要。

基本定义

shadowOffsetX 属性指定阴影与形状的水平距离。正值将阴影向右移动,负值将其向左移动。它与 shadowColor、shadowBlur 和 shadowOffsetY 一起用于创建阴影。

默认值为 0(无水平偏移)。该属性会影响所有后续的阴影形状,直到被更改。它以像素为单位测量,并且可以是小数以实现精确的定位。

基本 shadowOffsetX 用法

此示例演示了如何创建具有水平偏移的简单阴影。

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

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.shadowColor = 'rgba(0, 0, 0, 0.5)';
    ctx.shadowBlur = 10;
    ctx.shadowOffsetX = 15;
    
    ctx.fillStyle = 'blue';
    ctx.fillRect(50, 50, 200, 100);
</script>

</body>
</html>

在这个基本示例中,我们创建了一个 canvas 元素并获取其 2D 上下文。我们设置了包括 shadowOffsetX 在内的阴影属性,值为 15 像素。

阴影出现在蓝色矩形的右侧 15 像素处。shadowColor 使用 rgba 来实现透明度,shadowBlur 则使阴影边缘柔和。

负数 shadowOffsetX

此示例显示负值如何创建位于形状左侧的阴影。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Negative shadowOffsetX</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.shadowColor = 'rgba(255, 0, 0, 0.7)';
    ctx.shadowBlur = 5;
    ctx.shadowOffsetX = -20;
    
    ctx.fillStyle = 'yellow';
    ctx.beginPath();
    ctx.arc(150, 100, 50, 0, Math.PI * 2);
    ctx.fill();
</script>

</body>
</html>

在这里,我们创建了一个带有红色阴影的黄色圆形,其偏移量为 20 像素向左。负的 shadowOffsetX 值会将阴影向相反方向移动。

阴影具有 70% 的不透明度和轻微的模糊效果。这展示了如何创建看起来来自右侧光源的阴影效果。

结合 shadowOffsetX 和 shadowOffsetY

此示例演示如何使用两个偏移属性创建对角线阴影。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Combined Shadow Offsets</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    ctx.shadowColor = 'rgba(0, 0, 0, 0.6)';
    ctx.shadowBlur = 15;
    ctx.shadowOffsetX = 10;
    ctx.shadowOffsetY = 10;
    
    ctx.fillStyle = 'green';
    ctx.fillRect(50, 50, 200, 100);
</script>

</body>
</html>

这会创建一个绿色矩形,其阴影在水平和垂直方向上都偏移了 10 像素。组合偏移量产生了对角线阴影。

阴影看起来来自左上角的 T 角的光源。模糊效果使阴影看起来更自然、更逼真。

动态 shadowOffsetX 动画

此示例通过动画化 shadowOffsetX 属性来创建移动阴影效果。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Animated shadowOffsetX</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    let offset = 0;
    let direction = 1;
    
    function animate() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        
        ctx.shadowColor = 'rgba(100, 100, 255, 0.8)';
        ctx.shadowBlur = 20;
        ctx.shadowOffsetX = offset;
        
        ctx.fillStyle = 'purple';
        ctx.fillRect(150, 50, 100, 100);
        
        offset += direction;
        if (offset > 30 || offset < -30) direction *= -1;
        
        requestAnimationFrame(animate);
    }
    
    animate();
</script>

</body>
</html>

此动画展示了一个带有蓝色阴影的紫色方形,该阴影前后移动。shadowOffsetX 值在 -30 到 30 像素之间连续变化。

动画循环在每一帧都清除并重绘 canvas。当偏移量达到极限时,方向会反转,从而产生乒乓球效果。

带 shadowOffsetX 的文本

此示例演示了将 shadowOffsetX 应用于文本以实现时尚的排版。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Text Shadow with shadowOffsetX</title>
</head>
<body>

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

<script>
    const canvas = document.getElementById('myCanvas');
    const ctx = canvas.getContext('2d');
    
    // First text with right shadow
    ctx.shadowColor = 'rgba(200, 0, 0, 0.7)';
    ctx.shadowBlur = 5;
    ctx.shadowOffsetX = 8;
    ctx.shadowOffsetY = 3;
    
    ctx.font = '40px Arial';
    ctx.fillStyle = 'white';
    ctx.fillText('Hello Canvas', 50, 100);
    
    // Second text with left shadow
    ctx.shadowColor = 'rgba(0, 0, 200, 0.7)';
    ctx.shadowOffsetX = -8;
    
    ctx.fillText('Shadow Effect', 50, 150);
</script>

</body>
</html>

这创建了两行文本,具有不同的阴影方向。第一行文本具有向右偏移的红色阴影,而第二行文本具有向左偏移的蓝色阴影。

该示例展示了 shadowOffsetX 如何创建各种文本效果。改变偏移方向会极大地改变文本的视觉外观。

来源

MDN Canvas shadowOffsetX 文档

在本文中,我们探索了用于在 HTML canvas 上创建水平阴影效果的 shadowOffsetX 属性。这些技术对于为 canvas 图形和文本添加深度和视觉趣味至关重要。

作者

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

列出 所有 JS Canvas 教程