
14 January 2003
With SVG, you can fill (i.e., paint the interior) or stroke (i.e., paint the outline) of shapes and text using one of the following:
SVG uses the general notion of apaint server. Gradients and patterns are just specific types of built-in paint servers. The'solidColor' element is another built-in paint server, described inColor.
Paint servers are referenced using aURI reference on a'fill' or'stroke' property.
Gradients consist of continuously smooth color transitions along a vector from one color to another, possibly followed by additional transitions along the same vector to other colors. SVG provides for two types of gradients,linear gradients andradial gradients.
Once defined, gradients are then referenced using'fill' or'stroke' properties on a givengraphics element to indicate that the given element shall be filled or stroked with the referenced gradient.
Linear gradients are defined by a'linearGradient' element.
<!ENTITY % SVG.linearGradient.extra.content "" ><!ENTITY % SVG.linearGradient.element "INCLUDE" ><![%SVG.linearGradient.element;[<!ENTITY % SVG.linearGradient.content "(( %SVG.Description.class; )*, ( %SVG.stop.qname; | %SVG.animate.qname; | %SVG.set.qname; | %SVG.animateTransform.qname; %SVG.linearGradient.extra.content; )*)"><!ELEMENT %SVG.linearGradient.qname; %SVG.linearG\radient.content; ><!-- end of SVG.linearGradient.element -->]]><!ENTITY % SVG.linearGradient.attlist "INCLUDE" ><![%SVG.linearGradient.attlist;[<!ATTLIST %SVG.linearGradient.qname; %SVG.Core.attrib; %SVG.Style.attrib; %SVG.Color.attrib; %SVG.Gradient.attrib; %SVG.XLink.attrib; %SVG.External.attrib; x1 %Coordinate.datatype; #IMPLIED y1 %Coordinate.datatype; #IMPLIED x2 %Coordinate.datatype; #IMPLIED y2 %Coordinate.datatype; #IMPLIED gradientUnits ( userSpaceOnUse | objectBoundingBox ) #IMPLIED gradientTransform %TransformList.datatype; #IMPLIED spreadMethod ( pad | reflect | repeat ) #IMPLIED> |
Attribute definitions:
Percentages are allowed forx1, y1, x2, y2. For gradientUnits="userSpaceOnUse", percentages represent values relative to the current viewport. For gradientUnits="objectBoundingBox", percentages represent values relative to the bounding box for the object.
Ifx1 =x2 andy1 =y2, then the area to be painted will be painted as a single color using the color and opacity of the lastgradient stop.
Properties inherit into the'linearGradient' element from its ancestors; properties donot inherit from the element referencing the'linearGradient' element.
'linearGradient' elements are never rendered directly; their only usage is as something that can be referenced using the'fill' and'stroke' properties. The'display' property does not apply to the'linearGradient' element; thus,'linearGradient' elements are not directly rendered even if the'display' property is set to a value other thannone, and'linearGradient' elements are available for referencing even when the'display' property on the'linearGradient' element or any of its ancestors is set tonone.
Example lingrad01 shows how to fill a rectangle by referencing a linear gradient paint server.
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="8cm" height="4cm" viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <desc>Example lingrad01 - fill a rectangle using a linear gradient paint server</desc> <g> <defs> <linearGradient> <stop offset="5%" stop-color="#F60" /> <stop offset="95%" stop-color="#FF6" /> </linearGradient> </defs> <!-- Outline the drawing area in blue --> <rect fill="none" stroke="blue" x="1" y="1" width="798" height="398"/> <!-- The rectangle is filled using a linear gradient paint server --> <rect fill="url(#MyGradient)" stroke="black" stroke-width="5" x="100" y="100" width="600" height="200"/> </g></svg>
![]() |
View this example as SVG (SVG-enabled browsers only)
Radial gradients are defined by a'radialGradient' element.
<!ENTITY % SVG.radialGradient.extra.content "" ><!ENTITY % SVG.radialGradient.element "INCLUDE" ><![%SVG.radialGradient.element;[<!ENTITY % SVG.radialGradient.content "(( %SVG.Description.class; )*, ( %SVG.stop.qname; | %SVG.animate.qname; | %SVG.set.qname; | %SVG.animateTransform.qname; %SVG.radialGradient.extra.content; )*)"><!ELEMENT %SVG.radialGradient.qname; %SVG.radialG\radient.content; ><!-- end of SVG.radialGradient.element -->]]><!ENTITY % SVG.radialGradient.attlist "INCLUDE" ><![%SVG.radialGradient.attlist;[<!ATTLIST %SVG.radialGradient.qname; %SVG.Core.attrib; %SVG.Style.attrib; %SVG.Color.attrib; %SVG.Gradient.attrib; %SVG.XLink.attrib; %SVG.External.attrib; cx %Coordinate.datatype; #IMPLIED cy %Coordinate.datatype; #IMPLIED r %Length.datatype; #IMPLIED fx %Coordinate.datatype; #IMPLIED fy %Coordinate.datatype; #IMPLIED gradientUnits ( userSpaceOnUse | objectBoundingBox ) #IMPLIED gradientTransform %TransformList.datatype; #IMPLIED spreadMethod ( pad | reflect | repeat ) #IMPLIED> |
Attribute definitions:
Percentages are allowed for attributescx,cy,r,fx andfy. ForgradientUnits="userSpaceOnUse", percentages represent values relative to the current viewport. ForgradientUnits="objectBoundingBox", percentages represent values relative to the bounding box for the object.
If the point defined byfx andfy lies outside the circle defined bycx,cy andr, then the user agent shall set the focal point to the intersection of the line from (cx,cy) to (fx,fy) with the circle defined bycx,cy andr.
Properties inherit into the'radialGradient' element from its ancestors; properties donot inherit from the element referencing the'radialGradient' element.
'radialGradient' elements are never rendered directly; their only usage is as something that can be referenced using the'fill' and'stroke' properties. The'display' property does not apply to the'radialGradient' element; thus,'radialGradient' elements are not directly rendered even if the'display' property is set to a value other thannone, and'radialGradient' elements are available for referencing even when the'display' property on the'radialGradient' element or any of its ancestors is set tonone.
Example radgrad01 shows how to fill a rectangle by referencing a radial gradient paint server.
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="8cm" height="4cm" viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <desc>Example radgrad01 - fill a rectangle by referencing a radial gradient paint server</desc> <g> <defs> <radialGradient gradientUnits="userSpaceOnUse" cx="400" cy="200" r="300" fx="400" fy="200"> <stop offset="0%" stop-color="red" /> <stop offset="50%" stop-color="blue" /> <stop offset="100%" stop-color="red" /> </radialGradient> </defs> <!-- Outline the drawing area in blue --> <rect fill="none" stroke="blue" x="1" y="1" width="798" height="398"/> <!-- The rectangle is filled using a radial gradient paint server --> <rect fill="url(#MyGradient)" stroke="black" stroke-width="5" x="100" y="100" width="600" height="200"/> </g></svg>
![]() |
View this example as SVG (SVG-enabled browsers only)
The ramp of colors to use on a gradient is defined by the'stop' elements that are child elements to either the'linearGradient' element or the'radialGradient' element.
<!ENTITY % SVG.stop.extra.content "" ><!ENTITY % SVG.stop.element "INCLUDE" ><![%SVG.stop.element;[<!ENTITY % SVG.stop.content "( %SVG.animate.qname; | %SVG.set.qname; | %SVG.animateColor.qname; %SVG.stop.extra.content; )*"><!ELEMENT %SVG.stop.qname; %SVG.stop.content; ><!-- end of SVG.stop.element -->]]><!ENTITY % SVG.stop.attlist "INCLUDE" ><![%SVG.stop.attlist;[<!ATTLIST %SVG.stop.qname; %SVG.Core.attrib; %SVG.Style.attrib; %SVG.Color.attrib; %SVG.Gradient.attrib; offset %NumberOrPercentage.datatype; #REQUIRED> |
Attribute definitions:
The'stop-color' property indicates what color to use at that gradient stop. The keywordcurrentColor and ICC colors can be specified in the same manner as within a<paint> specification for the'fill' and'stroke' properties.
| Value: | currentColor | <color> [icc-color(<name>[,<icccolorvalue>]*)] | inherit |
| Initial: | black |
| Applies to: | 'stop' elements |
| Inherited: | no |
| Percentages: | N/A |
| Media: | visual |
| Animatable: | yes |
The'stop-opacity' property defines the opacity of a given gradient stop.
| Value: | <opacity-value> |inherit |
| Initial: | 1 |
| Applies to: | 'stop' elements |
| Inherited: | no |
| Percentages: | N/A |
| Media: | visual |
| Animatable: | yes |
Some notes on gradients:
<stop offset="0" stop-color="white"/><stop offset=".2" stop-color="red"/><stop offset=".2" stop-color="blue"/><stop offset="1" stop-color="black"/>will have approximately the same effect as:
<stop offset="0" stop-color="white"/><stop offset=".1999999999" stop-color="red"/><stop offset=".2" stop-color="blue"/><stop offset="1" stop-color="black"/>which is a gradient that goes smoothly from white to red, then abruptly shifts from red to blue, and then goes smoothly from blue to black.
A pattern is used to fill or stroke an object using a pre-defined graphic object which can be replicated ("tiled") at fixed intervals inx andy to cover the areas to be painted. Patterns are defined using a'pattern' element and then referenced by properties'fill' and'stroke' on a givengraphics element to indicate that the given element shall be filled or stroked with the referenced pattern.
Attributesx,y,width,height andpatternUnits define a reference rectangle somewhere on the infinite canvas. The reference rectangle has its top/left at (x,y) and its bottom/right at (x+width,y+height). The tiling theoretically extends a series of such rectangles to infinity in X and Y (positive and negative), with rectangles starting at (x + m*width, y + n*height) for each possible integer value form andn.
<!ENTITY % SVG.pattern.extra.content "" ><!ENTITY % SVG.pattern.element "INCLUDE" ><![%SVG.pattern.element;[<!ENTITY % SVG.pattern.content "( %SVG.Description.class; | %SVG.Animation.class; %SVG.Structure.class; %SVG.Conditional.class; %SVG.Image.class; %SVG.Style.class; %SVG.Shape.class; %SVG.Text.class; %SVG.Marker.class; %SVG.ColorProfile.class; %SVG.Gradient.class; %SVG.Pattern.class; %SVG.Clip.class; %SVG.Mask.class; %SVG.Filter.class; %SVG.Cursor.class; %SVG.Hyperlink.class; %SVG.View.class; %SVG.Script.class; %SVG.Font.class; %SVG.pattern.extra.content; )*"><!ELEMENT %SVG.pattern.qname; %SVG.pattern.content; ><!-- end of SVG.pattern.element -->]]><!ENTITY % SVG.pattern.attlist "INCLUDE" ><![%SVG.pattern.attlist;[<!ATTLIST %SVG.pattern.qname; %SVG.Core.attrib; %SVG.Conditional.attrib; %SVG.Style.attrib; %SVG.Presentation.attrib; %SVG.XLink.attrib; %SVG.External.attrib; x %Coordinate.datatype; #IMPLIED y %Coordinate.datatype; #IMPLIED width %Length.datatype; #IMPLIED height %Length.datatype; #IMPLIED patternUnits ( userSpaceOnUse | objectBoundingBox ) #IMPLIED patternContentUnits ( userSpaceOnUse | objectBoundingBox ) #IMPLIED patternTransform %TransformList.datatype; #IMPLIED viewBox %ViewBoxSpec.datatype; #IMPLIED preserveAspectRatio %PreserveAspectRatioSpec.datatype; 'xMidYMid meet'> |
Attribute definitions:
SVG'suser agent style sheet sets the'overflow' property for'pattern' elements tohidden, which causes a rectangular clipping path to be created at the bounds of the pattern tile. Unless the'overflow' property is overridden, any graphics within the pattern which goes outside of the pattern rectangle will be clipped.Example pattern01 below shows the effect of clipping to the pattern tile.
The contents of the'pattern' are relative to a new coordinate system. If there is aviewBox attribute, then the new coordinate system is fitted into the region defined by thex,y,width,height andpatternUnits attributes on the'pattern' element using the standard rules forviewBox andpreserveAspectRatio. If there is noviewBox attribute, then the new coordinate system has its origin at (x,y), where x is established by thex attribute on the'pattern' element, and y is established by they attribute on the'pattern' element. Thus, in the following example:
<pattern x="10" y="10" width="20" height="20"> <rect x="5" y="5" width="10" height="10"/></pattern>
the rectangle has its top/left located 5 units to the right and 5 units down from the origin of the pattern tile.
TheviewBox attribute introduces a supplemental transformation which is applied on top of any transformations necessary to create a new pattern coordinate system due to attributesx,y,width,height andpatternUnits.
Properties inherit into the'pattern' element from its ancestors; properties donot inherit from the element referencing the'pattern' element.
'pattern' elements are never rendered directly; their only usage is as something that can be referenced using the'fill' and'stroke' properties. The'display' property does not apply to the'pattern' element; thus,'pattern' elements are not directly rendered even if the'display' property is set to a value other thannone, and'pattern' elements are available for referencing even when the'display' property on the'pattern' element or any of its ancestors is set tonone.
Event attributes andevent listeners attached to the contents of a'pattern' element are not processed; only the rendering aspects of'pattern' elements are processed.
Example pattern01 shows how to fill a rectangle by referencing a pattern paint server. Note how the blue stroke of each triangle has been clipped at the top and the left. This is due to SVG'suser agent style sheet setting the'overflow' property for'pattern' elements tohidden, which causes the pattern to be clipped to the bounds of the pattern tile.
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="8cm" height="4cm" viewBox="0 0 800 400" xmlns="http://www.w3.org/2000/svg" version="1.1"> <defs> <pattern patternUnits="userSpaceOnUse" x="0" y="0" width="100" height="100" viewBox="0 0 10 10" > <path d="M 0 0 L 7 0 L 3.5 7 z" fill="red" stroke="blue" /> </pattern> </defs> <!-- Outline the drawing area in blue --> <rect fill="none" stroke="blue" x="1" y="1" width="798" height="398"/> <!-- The ellipse is filled using a triangle pattern paint server and stroked with black --> <ellipse fill="url(#TrianglePattern)" stroke="black" stroke-width="5" cx="400" cy="200" rx="350" ry="150" /></svg>
![]() |
View this example as SVG (SVG-enabled browsers only)
| Elements | Attributes | Content Model |
|---|---|---|
| linearGradient | Core.attrib, XLink.attrib, Paint.attrib, Gradient.attrib, Style.attrib, External.attrib, gradientUnits, gradientTransform, x1, y1, x2, y2, spreadMethod | (Description.class | Animation.class | stop)* |
| radialGradient | Core.attrib, XLink.attrib, Paint.attrib, Gradient.attrib, Style.attrib, External.attrib, gradientUnits, gradientTransform, cx, cy, r, fx, fy, spreadMethod | (Description.class | Animation.class | stop)* |
| stop | Core.attrib, Style.attrib, Paint.attrib, Gradient.attrib, offset | (Description.class | Animation.class)* |
| Elements | Attributes | Content Model |
|---|---|---|
| pattern | Core.attrib,, XLink.attrib, Conditional.attrib, External.attrib, Style.attrib, Presentation.attrib, viewBox, preserveAspectRatio, patternUnits, patternTransform, x, y, width, height | (Description.class | Structure.class | Shape.class | Text.class | Image.class | Hyperlink.class | Script.class | Style.class | Clip.class | Mask.class | Gradient.class | Pattern.class | Filter.class | Cursor.class | Font.class | ColorProfile.class | Animation.class)* |
The following interfaces are defined below:SVGGradientElement,SVGLinearGradientElement,SVGRadialGradientElement,SVGStopElement,SVGPatternElement.
TheSVGGradientElement interface is a base interface used bySVGLinearGradientElement andSVGRadialGradientElement.
interface SVGGradientElement : SVGElement, SVGURIReference, SVGExternalResourcesRequired, SVGStylable, SVGUnitTypes { // Spread Method Types const unsigned short SVG_SPREADMETHOD_UNKNOWN = 0; const unsigned short SVG_SPREADMETHOD_PAD = 1; const unsigned short SVG_SPREADMETHOD_REFLECT = 2; const unsigned short SVG_SPREADMETHOD_REPEAT = 3; readonly attribute SVGAnimatedEnumeration gradientUnits; readonly attribute SVGAnimatedTransformList gradientTransform; readonly attribute SVGAnimatedEnumeration spreadMethod;};| SVG_SPREADMETHOD_UNKNOWN | The type is not one of predefined types. It is invalid to attempt to define a new value of this type or to attempt to switch an existing value to this type. | |
| SVG_SPREADMETHOD_PAD | Corresponds to valuepad. | |
| SVG_SPREADMETHOD_REFLECT | Corresponds to valuereflect. | |
| SVG_SPREADMETHOD_REPEAT | Corresponds to valuerepeat. |
TheSVGLinearGradientElement interface corresponds to the'linearGradient' element.
interface SVGLinearGradientElement : SVGGradientElement { readonly attribute SVGAnimatedLength x1; readonly attribute SVGAnimatedLength y1; readonly attribute SVGAnimatedLength x2; readonly attribute SVGAnimatedLength y2;};TheSVGRadialGradientElement interface corresponds to the'radialGradient' element.
interface SVGRadialGradientElement : SVGGradientElement { readonly attribute SVGAnimatedLength cx; readonly attribute SVGAnimatedLength cy; readonly attribute SVGAnimatedLength r; readonly attribute SVGAnimatedLength fx; readonly attribute SVGAnimatedLength fy;};TheSVGStopElement interface corresponds to the'stop' element.
interface SVGStopElement : SVGElement, SVGStylable { readonly attribute SVGAnimatedNumber offset;};TheSVGPatternElement interface corresponds to the'pattern' element.
interface SVGPatternElement : SVGElement, SVGURIReference, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGStylable, SVGFitToViewBox, SVGUnitTypes { readonly attribute SVGAnimatedEnumeration patternUnits; readonly attribute SVGAnimatedEnumeration patternContentUnits; readonly attribute SVGAnimatedTransformList patternTransform; readonly attribute SVGAnimatedLength x; readonly attribute SVGAnimatedLength y; readonly attribute SVGAnimatedLength width; readonly attribute SVGAnimatedLength height;};