インラインSVGのdefsとgかsymbolとuseによる呼び出しのマークアップ 結城永人 -2021年6月27日 サイトに画像を描画できるインラインSVGは小さくても乱れず、しかもサイト内にマークアップすればサーバーの呼び出しを行わず、迅速に表示できるからアイコンのデザインなどに良く使われる。 インラインSVGには同じ画像を繰り返して表示するためのマークアップがある。 一つのsvgタグの内側にdefsタグを入れてそこにid付きのgタグかsymbolタグで描画内容を纏めておく。そして内側か、または外側の場合は他のもう一つのsvgタグにuseタグを入れてhref属性でgタグかsymbolタグのidを指定してリンクのように呼び出す。 目次インラインSVGの二つの呼び出し方一つのsvgタグの中で呼び出す場合定義用と表示用のsvgタグを分ける場合呼び出しのマークアップの長所と短所SVGのgタグとsymbolタグの違い インラインSVGの二つの呼び出し方 一つのsvgタグの中で呼び出す場合 HTML <svg viewBox="0 0 124 36" width="124" height="36"> <defs class="hidden"> <g id="rect_g"> <rect x="2" y="2" width="32" height="32" stroke-width="4px" stroke="#8fbc8f" fill="#2e8b57" rx="2px" ry="2px"/> <rect x="46" y="2" width="32" height="32" stroke-width="4px" stroke="#2e8b57" fill="#3cb371" rx="2px" ry="2px"/> <rect x="90" y="2" width="32" height="32" stroke-width="4px" stroke="#3cb371" fill="#8fbc8f" rx="2px" ry="2px"/> </g> </defs> <use href="#rect_g"/> </svg> CSS .hidden {display:none} ※SVGの名前空間のxmlns属性やxmlns:xlink属性は付けなくてもHTML5のブラウザは付くものとして把握する。 複数の画像をsvgタグのviewBox/座標系に全て纏めて記載するのに向いてそうだ。 定義用と表示用のsvgタグを分ける場合 HTML /* 呼び出し元のマークアップ */ <svg class="hidden" viewBox="0 0 36 36"> <symbol id="rect_r1"> <rect x="2" y="2" width="32" height="32" stroke-width="4px" stroke="#dfc0cb" fill="#8b0000" rx="2px" ry="2px"/> </symbol> <symbol id="rect_r2"> <rect x="2" y="2" width="32" height="32" stroke-width="4px" stroke="#8b0000" fill="#ff0000" rx="2px" ry="2px"/> </symbol> <symbol id="rect_r3"> <rect x="2" y="2" width="32" height="32" stroke-width="4px" stroke="#ff0000" fill="#dfc0cb" rx="2px" ry="2px"/> </symbol> </svg> /* 呼び出し先のマークアップ */ <svg width="36" height="36"><use href="#rect_r1"/></svg> <svg width="36" height="36"><use href="#rect_r2"/></svg> <svg width="36" height="36"><use href="#rect_r3"/></svg> CSS .hidden {display:none} ※SVGの名前空間のxmlns属性やxmlns:xlink属性は付けなくてもHTML5のブラウザは付くものとして把握する。 複数の画像を一ずつ扱って色んなところに配置するのに向いてそうだ。 どちらの場合でもdefsタグは使わなくても画像の表示に支障はないけれどもSVGのマークアップとしては使うことが推進されている。 SVGでは、後で再利用できるよう描画オブジェクトを定義します。参照される要素は、可能なかぎりdefs要素内で定義されることが推奨されています。defs要素内でこれらの要素を定義することは、SVGの要素の可読性を向上させ、ひいては操作性をも向上させます。defs要素の描画要素は、そのままでは描画されません。ビューポート上で描画したい場所へそれらの要素を描画するために、<use>要素を使用します。 defs|MDN|Mozilla defsタグはサイトのソースコードでそれ自体がインラインSVGの「参照される要素」を含むという「可読性」を示すと同時に囲んだ領域を表示しないので、インラインSVGの画像を部分的に使ったり、使わずに他のuseタグの呼び出しでのみ使ったりするという「操作性」を与える。 只、symbolタグについては最初から呼び出しのuseタグとセットで使うものと決まっているからそうした描画用のマークアップを収めるだけの用途ならばdefsタグで囲わなくても不都合は特にない。 インラインSVGの呼び出しのマークアップは画像を定義する呼び出し元を表示したくない場合はデザインのCSSで親要素のsvgタグなどに非表示の「display:none」をかける。 defsタグやsymbolタグを使うとその場で描画しなくなるけれどもマークアップした分の高さが残ってしまうから余計な隙間を縮めるためにもCSSの「display:none」で要素として取り除くか、せめて「height:0」で高さをなくす必要が出て来る。 画像の大きさは表示するsvgタグに横幅のwidth属性と縦幅のheight属性を付ける(pxか%の値で、単位なしはpx値となる)かCSSの縦幅のwidthと横幅のheightを指定する(単位ありの値)のが簡単だ。 定義用と表示用のsvgタグが同じか異なる場合の何れにしても画像を呼び出して実際に表示するuseタグを含む方で大きさを調節できる。 呼び出しのマークアップの長所と短所 僕はインラインSVGの呼び出しのマークアップに関して一つのページに同じ画像が幾つも必要でなければ意味がないと思ってブログのアイコンでも使わなかったけれども表示速度などのパフォーマンスへの好影響がないわけではないかも知れないから改めて使ってみたくなったんだ。 一方defs要素に定義されたグラフィックをuse要素から参照する場合,一旦defs要素内で解析済みの内容をuse要素部に描画するだけであり,その結果スクリーンの書き換え処理の回数を極小化できる.つまり,オフスクリーンレンダリングのような効果が得られる. SVGの高速化・生DOMを直接描画するな|ゲームミュージックと生存確認をかねた画期的な ブラウザのインラインSVGのパースとレンダリング(解析と表出)が分離されるとスクリーンの描画コストを下げることができるのかも知れない。 または描画内容の比較的に長めのマークアップを定義用としてインラインSVGの実際の表示位置から外して下の方にでも置けば後続のコンテンツへのブラウザの動作もなるべく止めずに済ませられるかも知れない。 defsとgかsymbolとuseによる呼び出しのマークアップは複数のインラインSVGを一つに纏めておけるから便利だけれどもそれらを一つずつしか使わない場合でもやる価値はパフォーマンスの向上のためにありそうだ。 ただし状況によって反対の結果を招くという可能性もあるから注意を要する。 私は<use>を深く入れ子にしないことを助言する。大半のブラウザで遅鈍を引き起こすと知られている、こちらとこちらで分かる。 原文 I would advise you to not nest <use> elements deeply. That is known to cause slowdowns in most browsers, see here and here. Does reusing symbols improve SVG performance?|stackoverflow(訳出)|Stack Exchange gタグやsymbolタグの中にuseタグを記載すると階層が深くなるほどにインラインSVGのパフォーマンスの低下を招く。 その他、アニメーションを付けるとスクリーンの書き換えが増えて表示速度が下がり易くなる。 use要素とsymbol要素は、Flashで使われる「シンボル化」と違って、内部でかなり複雑な変換をしています。 動的な変更があるたびに、この複雑な変換をしますので、描画処理の性能が落ちてしまいます。 重たくなりますので、必ず、この二つの要素は避けましょう。 SVGを高速化させるためのルール|プラグインレスでSVGを表示する「SIE」開発ブログ gタグを含めてアニメーションはデザインのCSSの更新などでもパフォーマンスを低下させるからなるべくインラインSVG自体を使わない方が望ましいようだ。 その他、大きな画像の場合はインラインSVGをサイト内よりも外部ファイルのマークアップから呼び出す方がブラウザが適切に読み込んだり、保存して使い回せたりして効率的かも知れない。 大量の5k以下の小さなSVG――SVGスプライトを作る 原文 Huge number of small SVG(s) < 5k - Make SVG sprite Inline SVG vs SVG File Performance|stackoverflow(訳出)|Stack Exchange 例えばアイコンを大量に使うような場合はインラインSVGのマークアップを外部ファイルに「SVGスプライト」として全て纏めて一回で読み込む方がパフォーマンスが良いと考えられる。 useタグで外部ファイルを読み込む場合はリンクと全く同じにhref属性にインラインSVGの定義を置いたサイトのURLを入力することになる。 SVGのgタグとsymbolタグの違い どちらもidを付けるとuseタグでマークアップされた描画内容をhref属性で呼び出すことができるけれども全く同じものでもない。 gタグの特徴それ自体は表示される座標系のviewBox属性が使えない縦横比のpreserveAspectRatio属性が使えないsymbolタグの特徴useタグなしに表示されない座標系のviewBox属性が使える縦横比のpreserveAspectRatio属性が使える HTML要素としてgタグはSVGの描画内容を纏めるもの、symbolタグはuseタグで呼び出される描画内容を示すものなので、インラインSVGの呼び出しにはsymbolタグを使うのが普通だろう。 両方とも別々に使うだけではなく、gタグの中にsymbolタグ、反対にsymbolタグの中にgタグを入れ子にして一緒に使うこともできる。 useタグが呼び出せるのはgタグとsymbolタグだけではなく、svgタグやグラフィックス要素と呼ばれる一群の描画用のタグ: circle/ellipse/image/line/path/polygon/polyline/rect/text/useもidを付ければhref属性で表示できる。 コメント 新しい投稿 前の投稿
ジャパネットたかたの丸尾詩織の商品説明に気持ちが入っていて素晴らしい理由 ジャパネットたかた のテレビショッピングを観ていて社員の丸尾詩織の商品説明の言葉が力強くてどんどん前に出て来るように聞こえるのが凄いと感じた。声が立体的に表現されているのは飛び出す絵本とか3D映像なんて印象まで与えるから他では経験できないほどの聴覚芸術が新たに生み出されたとも過言...
菜の花の真っ黄色の世界で感じる幸運 近所に 菜の花 が密集して良い感じで真っ黄色に咲いていたのが壮観だった。 色も大きさも匂いも最盛期のセイヨウアブラナ 花の根本の萼片が開き切らず、斜めに立っているから セイヨウアブラナ だと思うけど、すると最大の150cmくらい伸びていて非常に大きいと驚く。 通り...
Dropboxで直リンクのURLを取得する方法 クラウドストレージのDropboxはサイトで自由にコンテンツを表示できる直リンクのURLをあらゆるファイル形式で取得することができる。 重要:2023年6月から Dropboxの共有リンクのURLが変更されて直リンクの方法も影響を受けた 。本稿の内容はそれ以前のファイルにしか...
スノーボードのジャンプ中のグラブには幾つもの種類がある スノーボードでジャンプして板を掴む動作をグラブ、またはグラブトリック(掴み技)としてエアー(空中)に組み込まれる。幾つもの種類があって空中での姿勢を安定させたり、ハーフパイプやスロープスタイルやビッグエアーなどの演技を競う試合では得点を左右する要因にもなっている。覚えておくと観る...
アドセンスの個人のアメリカの税務情報/W-8BEN納税フォームの書き方 アドセンスに利用者の税務情報が必要となり、2021年6月1日以降、YouTubeのサイト広告などで収益を得る場合には税務情報を提出しないとアドセンスの支払いからアメリカの源泉所得税が米国内国歳入法の第三章により、控除される。 Google は、YouTube パートナー プロ...
椎名林檎の顔が思い浮かばない理由 近頃はだいぶ慣れて来たというか、 ブログに取り上げるくらい注目する人 なので、大丈夫なんだけれども以前は 椎名林檎 というと人気歌手で色んなところで良く見ている割には、全然、顔が思い浮かばないのを不思議がっていた。 しかし2008年にテレビ番組のトップランナーに出演した際に司...
サイトの表示速度をlinkタグの「rel="preconnect"」で上げる/WebPagetestで事前接続を調べる HTMLの リソースヒント ( 日本語訳 )に載っているlinkタグの「rel="preconnect"」がサイトの表示速度を上げるのに役立つと知ってブログに取り入れたんだ。 速くなるのは確かながらほんの僅かで、体感上、殆ど変わらないようだけど、しかしブラ...
芦名星のたぶん本当の死因 芦名星は自殺した。その前後、 三浦春馬と竹内結子の自宅のクローゼットでの首吊りという同じ仕方での連続自殺 があり、他殺の陰謀論も思い浮かぶけど、しかし違うのではないか。今の 日本の芸能界には死にたくなる気持ち悪さがある し、芸能人が裕福な生活でも自殺することはさほど不思議ではない...
宜保愛子の死んだペットなどの動物の供養の仕方 宜保愛子 (霊能力者)の霊視で、死んだペットの話が出て来ることがある。そんな中で、僕も同様の経験があって辛い気持ちを抱えていたものがあった。可哀相な亡くなり方といわれる。せめて成仏できるようにペットなどの動物の供養の仕方と併せて取り上げたい。 永井美奈子の可哀相な亡くなり方をし...
Androidの無料で使い易いHTMLエディターの比較検討 Androidのスマホ/タブレットで 気に入って使っていたHTMLエディターアプリのWebMaster's HTML Editor Lite がが終了してしまって有料版しかなくなった。無料で使い易くて嬉しかったし、値段は五百円くらいの安い有料版だから移行しようかとも考えた...
コメント