SVG/パターン

パターン配列定義  pattern 要素

属性
width, height パターンの幅と高さ
id パターンの名称
patternUnits パターンの配置方法
userSpaceOnUse 隙間なく埋めるようにパターンを配置。
objectBoundingBox %か0~1の割合で領域内を分割した間隔で配置(デフォルト)。
patternContentUnits 配置するパターンの座標単位
userSpaceOnUse パターンの座標を描画先の座標単位で指定(デフォルト)。
objectBoundingBox パターンの座標を描画先の領域内の比率を0~1で指定(%は不可)。
viewBox パターンのグラフィックの座標系を定義
viewBoxとpatternContentUnitsが同時に指定された場合、viewBoxを優先しpatternContentUnitsを無視する。
領域内に水平・垂直方向に並べてタイル状に配置するグラフィックのパターンを定義します。
pattern要素の中にパターンとなるグラフィックを記述し、id属性にパターンの名前を設定します。これは描画されません。
width、height属性により、パターンを適用するX/Y方向それぞれのパターンの配置間隔を指定します。%で指定した場合は、パターンを適用する領域に対する間隔の比率になります。
パターンでグラフィックを塗りつぶすときのfill属性には、id属性に定義したパターン名を指定します。
    fill="url(#パターンの名前)"
<svg width="10cm" height="10cm" viewBox="0 0 100 100"
    xmlns="http://www.w3.org/2000/svg">
    <pattern id="circlepattern1" width="20%" height="30%">
        <circle cx="5" cy="5" r="5" fill="teal"/>
    </pattern>
    <rect x="10" y="10" width="60" height="40" stroke="black"
        fill="url(#circlepattern1)"/>

    <pattern id="circlepattern2"
        patternUnits="userSpaceOnUse" width="10" height="10">
        <circle cx="5" cy="5" r="5" fill="purple"/>
    </pattern>
    <rect x="10" y="50" width="60" height="40" stroke="black"
        fill="url(#circlepattern2)"/>

</svg>
Picture
patternContentUnitsobjectBoundingBoxを指定した場合は、描画先の領域のサイズに応じて、パターンの大きさが伸縮します。下の例の2つは同じパターンを指定していますが、下の方は横幅が長い領域に合わせてパターンも横に伸びています。
パターンの円の座標と半径は、0.1が指定されてますが、これは描画先領域の座標の10%を意味します。もしこれらを0.15とすると、各円が右下にずれて配置されます。
<svg width="10cm" height="10cm" viewBox="0 0 100 100"
    xmlns="http://www.w3.org/2000/svg">
    <pattern id="circlepattern"
        patternContentUnits="objectBoundingBox"
        width="20%" height="30%">
        <circle cx="0.1" cy="0.1" r="0.1" fill="teal"/>
    </pattern>
    <rect x="20" y="10" width="40" height="40" stroke="black"
        fill="url(#circlepattern)"/>
    <rect x="20" y="50" width="60" height="40" stroke="black"
        fill="url(#circlepattern)"/>
</svg>
Picture
次の例は、viewBoxで指定したパターンの座標系に描画した円を、塗りつぶす領域の座標系の中に配置しています。四角の領域の20%×30%の範囲を40×60の座標系としてその中心に半径20の円を描画したことになります。
<svg width="10cm" height="10cm" viewBox="0 0 100 100"
    xmlns="http://www.w3.org/2000/svg">
    <pattern id="circlepattern" width="20%" height="30%" viewBox="0 0 40 60">
        <circle cx="20" cy="30" r="20" fill="teal"/>
    </pattern>
    <rect x="10" y="10" width="60" height="60" stroke="black"
        fill="url(#circlepattern)"/>
</svg>
Picture
パターン自体を別のパターンで塗りつぶすことができます。
<svg width="10cm" height="10cm" viewBox="0 0 100 100"
    xmlns="http://www.w3.org/2000/svg">
    <pattern id="stripe"
        patternUnits="userSpaceOnUse" width="2" height="20">
        <line x1="1" y1="0" x2="1" y2="20" stroke-width="0.3"
        stroke="mediumblue"/>
    </pattern>
    <pattern id="circlepattern" width="20%" height="30%">
        <circle cx="5" cy="5" r="5" stroke-width="0.5" fill="url(#stripe)"/>
    </pattern>
    <rect x="10" y="10" width="60" height="60" stroke="black"
        fill="url(#circlepattern)"/>
</svg>
Picture