Webページの背景に簡単な模様を入れるためにbackground-image
にSVG画像を指定する場合があります。
通常はSVGのデータを独立のファイルにして url();
で読み込むのですが、色々な事情で画像ファイルを用意したくない場合に、データURIスキームを使ってCSSファイルの中に画像データを埋め込むことが考えられます。
たとえば、↓の画像の右下にある三角形の場合はこんな感じ。
#hoge {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 100 100"><polygon points="70,100 100,100 100,80" fill="%23c8c8c8"/><polygon points="80,100 100,100 100,80" fill="%23cf2030"/></svg>');
background-position: right bottom; /* 画像を右下に配置 */
background-attachment: fixed; /* 画像を固定 */
background-repeat: no-repeat; /* 画像の繰り返しを防止 */
}
ちょっとした解説
url('data:image/svg+xml;utf8,
の部分
データURIスキームを使って、SVGのデータを読ませます。
utf8を指定しておくことで、<
や>
をエスケープする必要がなくなります。ただし、#
は%23
にエスケープする必要があるので、色指定などでは一手間かかります。
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 100 100">
の部分
XML宣言(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
)は無くても動くようです。
xmlns
は指定しておかないと動かないようです。
今回は画像を右下に配置したいのですが、どうもbackground-position: right bottom;
の指定ではうまくいかないようなので、適用対象のブロック要素全体を覆うSVG画像を用意します。viewBox
はパーセンテージでは指定できない(ピクセル値?でしか指定できない)ので、ともかくこのSVG画像自体はwidth="100%" height="100%"
にした上で、viewBox
の値を使って位置を指定する感じでやりました。SVGわからん。
あとは、この100x100のviewBox内に、右下角の位置に灰色の三角形と赤い三角形を並べました。上述の通り、データURIスキーム内での色指定は#c3c3c3
だとダメっぽいので%23c3c3c3
にエスケープしています。
日本語のネット情報だと、データURIスキームを使う場合はbase64にエンコードする方が多いのですが、可読性のためエンコードせずに文字列で埋め込んでいます。また、英語でチラッと検索した感じだとutf8を指定せず不等号等もエスケープする例が出てくるのですが、エスケープ混じりも可読性が低いし手間なので、utf8を指定してみたら概ねうまく行った次第。