HTML Canvas fillStyle Property: Defining Filling Styles
The HTML Canvas fillStyle property is a fundamental aspect of the Canvas API, allowing you to define the color, gradient, or pattern used to fill shapes, text, and paths. Mastering the fillStyle property is crucial for creating visually appealing and complex graphics on the canvas. This article will explore the various ways you can use fillStyle, along with practical examples to demonstrate its capabilities.
Understanding the fillStyle Property
The fillStyle property of the Canvas 2D rendering context determines the fill color for all shapes and text drawn after its setting. It accepts different types of values, including:
- Color Values: Named colors, hexadecimal color codes, RGB, RGBA, HSL, and HSLA values.
- Gradients: Linear and radial gradients, which transition smoothly between colors.
- Patterns: Repetitive images that fill the shape.
By setting the fillStyle, you have complete control over the visual appearance of filled elements on your canvas.
Syntax
The syntax for setting the fillStyle property is as follows:
ctx.fillStyle = color | gradient | pattern;
Where:
ctxis the 2D rendering context of the canvas element (e.g.,canvas.getContext('2d')).coloris a string representing a valid color.gradientis a CanvasGradient object returned bycreateLinearGradient()orcreateRadialGradient().patternis a CanvasPattern object returned bycreatePattern().
Using Color Values
The most basic use of fillStyle is to set a solid color. You can use any CSS-compatible color format.
Example: Using Named Colors and Hexadecimal Colors
<canvas id="fillStyleCanvas" width="400" height="200" style="border:1px solid #ddd;"></canvas>
<script>
//<![CDATA[
const canvas = document.getElementById('fillStyleCanvas');
const ctx = canvas.getContext('2d');
// Using a named color
ctx.fillStyle = 'blue';
ctx.fillRect(10, 10, 100, 80);
// Using a hexadecimal color code
ctx.fillStyle = '#FF4500'; // orange red
ctx.fillRect(150, 10, 100, 80);
// Using RGB
ctx.fillStyle = 'rgb(0, 255, 0)'; //green
ctx.fillRect(10, 110, 100, 80);
//Using RGBA
ctx.fillStyle = 'rgba(255, 0, 0, 0.5)'; //semi-transparent red
ctx.fillRect(150, 110, 100, 80);
// Using HSL
ctx.fillStyle = 'hsl(120, 100%, 50%)'; //lime green
ctx.fillRect(300, 10, 100, 80);
// Using HSLA
ctx.fillStyle = 'hsla(240, 100%, 50%, 0.7)'; //semi-transparent blue
ctx.fillRect(300, 110, 100, 80);
//]]]]><![CDATA[>
</script>
Using Gradients
Gradients allow you to fill shapes with a smooth transition between two or more colors. Canvas supports linear and radial gradients.
Example: Creating a Linear Gradient
<canvas id="linearGradientCanvas" width="300" height="150" style="border:1px solid #ddd;"></canvas>
<script>
//<![CDATA[
const canvas = document.getElementById('linearGradientCanvas');
const ctx = canvas.getContext('2d');
// Create a linear gradient
const gradient = ctx.createLinearGradient(0, 0, 300, 0);
gradient.addColorStop(0, 'red');
gradient.addColorStop(0.5, 'green');
gradient.addColorStop(1, 'blue');
// Set the fill style to the gradient
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 300, 150);
//]]]]><![CDATA[>
</script>
In this example, we create a linear gradient that transitions from red to green to blue horizontally. addColorStop() defines the color stops within the gradient.
Example: Creating a Radial Gradient
<canvas id="radialGradientCanvas" width="200" height="200" style="border:1px solid #ddd;"></canvas>
<script>
//<![CDATA[
const canvas = document.getElementById('radialGradientCanvas');
const ctx = canvas.getContext('2d');
// Create a radial gradient
const gradient = ctx.createRadialGradient(100, 100, 10, 100, 100, 80);
gradient.addColorStop(0, 'yellow');
gradient.addColorStop(1, 'purple');
// Set the fill style to the gradient
ctx.fillStyle = gradient;
ctx.arc(100, 100, 80, 0, 2 * Math.PI);
ctx.fill();
//]]]]><![CDATA[>
</script>
In this case, we create a radial gradient that transitions from yellow at the center to purple towards the edge of the circle.
Using Patterns
Patterns enable you to fill shapes with a repeating image. To create a pattern, use the createPattern() method, passing in an HTMLImageElement, CanvasImageSource or an HTMLVideoElement as the first argument and a repetition parameter like repeat, repeat-x, repeat-y, or no-repeat.
Example: Filling with a Pattern
<canvas id="patternCanvas" width="300" height="200" style="border: 1px solid #ddd;"></canvas>
<script>
//<![CDATA[
const canvas = document.getElementById('patternCanvas');
const ctx = canvas.getContext('2d');
const image = new Image();
image.src = 'https://dummyimage.com/50x50/0000FF/ffffff'; // blue background with white text
image.onload = () => {
const pattern = ctx.createPattern(image, 'repeat');
ctx.fillStyle = pattern;
ctx.fillRect(0, 0, 300, 200);
};
//]]]]><![CDATA[>
</script>
In this example, the canvas is filled with a repeated pattern of the image we are loading. Make sure to load the image before creating pattern.
Practical Example: Creating a Custom Button
Let's create a custom button with a gradient fill using the fillStyle property. This example will demonstrate how the property can be used in a practical context.
<canvas id="customButton" width="150" height="50" style="border:1px solid #ddd;"></canvas>
<script>
//<![CDATA[
const canvas = document.getElementById('customButton');
const ctx = canvas.getContext('2d');
function drawButton(text, x, y, width, height) {
// Create a rounded rectangle
const radius = 5;
ctx.beginPath();
ctx.moveTo(x + radius, y);
ctx.lineTo(x + width - radius, y);
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
ctx.lineTo(x + width, y + height - radius);
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
ctx.lineTo(x + radius, y + height);
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
ctx.lineTo(x, y + radius);
ctx.quadraticCurveTo(x, y, x + radius, y);
ctx.closePath();
// Create gradient fill
const gradient = ctx.createLinearGradient(x, y, x, y + height);
gradient.addColorStop(0, '#4CAF50'); // dark green
gradient.addColorStop(1, '#8BC34A'); // light green
ctx.fillStyle = gradient;
ctx.fill();
// Draw Text
ctx.fillStyle = 'white';
ctx.font = '16px sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(text, x + width / 2, y + height / 2);
}
drawButton("Click Me", 10, 10, 130, 30);
//]]]]><







