How to use CSS3 gradients with your canvas tag

  Read comments...

Summary
A guide for using CSS3 gradients as backgrounds to your canvas tag

[No canvas support]

CSS3 gradients can be used to provide a graduated background to your chart. Since things drawn on the canvas are not subject to CSS rules you must use the gradients provided to you by the canvas API or the shortcuts (eg Gradient(red:white)) provided by RGraph to give your charts (eg the bars in a bar chart) gradients.

But if what you want is to give your chart a background color, like the chart here, CSS3 gradients can be used.

 

Linear gradients

The gradients are specified using the background-image CSS property and the linear-gradient() function like this:

<canvas id="cvs2" width="600" height="250" style="background-image: linear-gradient(red, white)">
    [No canvas support]
</canvas>
[No canvas support]

As you can see the gradient starts at the top of the canvas and graduates towards the bottom. The angle of the gradient can be changed by specifying an angle in the linear-gradient() function:

 

 

 

<canvas id="cvs3" width="600" height="250" style="background-image: linear-gradient(0deg, red, white)">
    [No canvas support]
</canvas>
[No canvas support]

But when you specify an angle the direction reverses and the gradient starts at the bottom, for 0deg at least. If you wanted to mimick the previous behaviour you would need to use an angle of 180deg.

 

 

 

<canvas id="cvs4" width="600" height="250" style="background-image: linear-gradient(90deg, red, white)">
    [No canvas support]
</canvas>
[No canvas support]

Here an angle of 90deg is used to achieve a horizontal gradient - from th left hand-side to the right.

 

 

 

<canvas id="cvs5" width="600" height="250" style="background-image: linear-gradient(45deg, red, white)">
    [No canvas support]
</canvas>
[No canvas support]

And here the gradient starts in the top-right corner and graduates towards the bottom-left - using an angle of 45deg.

 

 

 

<canvas id="cvs6" width="600" height="250" style="background-image: linear-gradient(45deg, red, white 75%)">
    [No canvas support]
</canvas>
[No canvas support]

This shows you that instead of the colors that you give being spread equally across the whole canvas you can specify color-stops - so for example the gradient is centered around the 75% point of the length that is graduated (for example the width or height etc). By using multiple colors (eg four or more) you can get sriping effect the doesn't have any gradiated regions and the colors just change immediately from one to the other. For example:

 

 

 

<canvas id="cvs7" width="600" height="250" style="background-image: linear-gradient(45deg, red 25%, white 25%, white 50%, yellow 50%, yellow 75%, green 75%)">
    [No canvas support]
</canvas>
[No canvas support]

As mentioned above here the gradient here is not graduated but instead the color changes happen immediately. Multiple color stops are used in the gradient specification:

 

 

 

Radial gradients

Radial gradients aren't more difficult - but there is more to them so there's a bit more remember in terms of syntax. They can be quite simple though as this first example shows:

<canvas id="cvs8" width="600" height="250" style="background-image: radial-gradient(red, white 75%)">
    [No canvas support]
</canvas>
[No canvas support]

The gradient, because the canvas is wider than it is high, is elliptical initially. So to contain the gradient within the boundaries of the canvas a little more than the default does it's been changed so that the white color is at 75%.

 

 

 

<canvas id="cvs9" width="600" height="250" style="background-image: radial-gradient(circle closest-side, red, white)">
    [No canvas support]
</canvas>
[No canvas support]

Here we specify the circle closest-side modifier so that instead of an elliptical gradient it's circular and it uses the nearest side of the rectangle as the end point of the gradient. This way the gradient is shown as a circle - not an ellipse and the extra width if just ignored.

 

 

 

<canvas id="cvs10" width="600" height="250" style="background-image: radial-gradient(circle at top right, red, white)">
    [No canvas support]
</canvas>
[No canvas support]

The radial gradient isn't forced to start in the center. Here we have specified the circle at top right modifier as part of the gradient specification which means that the gradient will start, unsurprisingly, at the top right of the canvas. Instead of the keywords top right you can also use pixels like this:

<canvas id="cvs10" width="600" height="250" style="background-image: radial-gradient(circle at 150px 150px, red, white)">
    [No canvas support]
</canvas>

You can mix and match pixel values with the top and right keywords but for clarity I would advise against this. You can also use percent values as well as pixels.

 

 

 

<canvas id="cvs11" width="600" height="250" style="background-image: radial-gradient(circle at top right, red, white)">
    [No canvas support]
</canvas>
[No canvas support]

The radial gradient isn't forced to start in the center. Here we have specified the circle at top right modifier as part of the gradient specification which means that the gradient will start, unsurprisingly, at the top right of the canvas. Instead of the keywords top right you can also use pixels like this:

 

 

 

Repeating linear gradients

<canvas id="cvs12" width="600" height="250" style="background-image: repeating-linear-gradient(90deg, red, white 50px)">
    [No canvas support]
</canvas>
[No canvas support]

If you want to specify a gradient that repeats itself to he end of whatever you're using the gradient on you can use the repeating-linear-gradient() function or the repeating-radial-gradient() function (below) With this function you give the colors and then also you give a width/height that the gradient ends at. It will then repeat itself until the end of the container.

 

 

 

Repeating radial gradients

<canvas id="cvs13" width="600" height="250" style="background-image: repeating-radial-gradient(circle at top left, red, white 50px)">
    [No canvas support]
</canvas>
[No canvas support]

Here's a nice effect that is achieved by using the repeating-radial-gradient() function in place of the radial-gradient() function. After setting the point at which the gradient ends (in this case 50px) the gradient is then repeated to cover the rest of the required space.

An example effective use case

As can be seen below, by replacing the background image from this chart a gradient could be used to good effect by replacing the background image with a CSS gradient on the canvas tag. By not having to draw the image there will be a very slight performance gain - though if you notice any difference I would be surprised.

<canvas id="cvs_example" width="500" height="200" style="background-image: radial-gradient(circle at 150px 50px, yellow 50px, #33f 100px)">
    [No canvas support]
</canvas>
[No canvas support]

 

 

 

Share RGraph
X

Comments