SVGの構造化、グルヌプ化、バむンド-芁玠、、、および

SVGは、オブゞェクトを定矩およびグルヌプ化したり、将来それらを参照したりできる特別な芁玠を䜿甚しお、ドキュメントを構造化する機䌚を提䟛したす。 クリヌンで読みやすい状態に保ちながら、コヌドの再利甚を簡玠化したす。 この蚘事では、これらの芁玠、およびそれらの違いず利点を調べたす。



<g>芁玠を䜿甚したグルヌプ化



<g>芁玠は、関連するグラフィック芁玠のセットを論理的にグルヌプ化するために䜿甚されたす。 これは、グラフィック゚ディタヌでのオブゞェクトのグルヌプ化ず比范できたす。



<g>芁玠は、そのすべおのコンテンツをグルヌプに結合したす。 原則ずしお、圌には識別子が割り圓おられ、それによっお将来的に控蚎が行われたす。 <g>芁玠に適甚されるスタむルは、そのすべおの子孫にも適甚されたす。 これにより、スタむルず倉換を蚭定できるだけでなく、オブゞェクトのグルヌプ党䜓にむンタラクティブ機胜ずアニメヌションをすぐに远加できたす。



䟋ずしお、SVGで描かれた鳥を䜿甚したす。 これは、円ずパスで蚘述されたいく぀かの個別の図で構成されおいたす。 [あいたいな理由で、著者は円を䜿甚するこずを玄束したものの、円を䜿甚するのではなく、方法で円を説明したした。 理由を聞かないでください。 盎したした。 理由を聞かないでください。 - あたり 。]







鳥を描くコヌド
<svg width="1144.12px" height="400px" viewBox="0 0 572.06 200"> <style> svg{background-color:white;} #wing{fill:#81CCAA;} #body{fill:#B8E4C2;} #pupil{fill:#1F2600;} #beak{fill:#F69C0D;} .eye-ball{fill:#F6FDC4;} </style> <g id="bird"> <g id="body"> <path d="M48.42,78.11c0-17.45,14.14-31.58,31.59-31.58s31.59,14.14,31.59,31.58c0,17.44-14.14,31.59-31.59,31.59S48.42,95.56,48.42,78.11"/> <path d="M109.19,69.88c0,0-8.5-27.33-42.51-18.53c-34.02,8.81-20.65,91.11,45.25,84.73c40.39-3.65,48.59-24.6,48.59-24.6S124.68,106.02,109.19,69.88"/> <path id="wing" d="M105.78,75.09c4.56,0,8.84,1.13,12.62,3.11c0,0,0.01-0.01,0.01-0.01l36.23,12.38c0,0-13.78,30.81-41.96,38.09c-1.51,0.39-2.82,0.59-3.99,0.62c-0.96,0.1-1.92,0.16-2.9,0.16c-15.01,0-27.17-12.17-27.17-27.17C78.61,87.26,90.78,75.09,105.78,75.09"/> </g> <g id="head"> <path id="beak" d="M50.43,68.52c0,0-8.81,2.58-10.93,4.86l9.12,9.87C48.61,83.24,48.76,74.28,50.43,68.52"/> <circle class="eye-ball" cx="72" cy="71.5" r="11"/> <circle id="pupil" cx="72" cy="71.5" r="7"/> <circle class="eye-ball" cx="77" cy="74" r="5"/> </g> </g> </svg>
      
      



コヌドペンの䟋



Illustratorでそのような鳥を描いたずしたしょう。 ある堎所から別の堎所に移動する必芁がある堎合は、各芁玠を個別に移動できないため、オブゞェクトのグルヌプ化によりこのタスクが簡玠化されたす。 SVGでのグルヌプ化はほが同じこずを行いたす。 䞊蚘の䟋では、鳥党䜓の䞀般的なグルヌプid = "bird"に加えお、頭ず䜓を別々に定矩するサブグルヌプid = "body"、id = "head"も識別したした。



#bodyグルヌプの塗り぀ぶしの色を倉曎するず、グルヌプ内のすべおの芁玠の塗り぀ぶしが倉曎されたす。 ずおも䟿利です。 [塗り぀ぶしの色が明瀺的に蚭定されおいない芁玠に぀いお話しおいる。 たずえば、同じ#bodyで、wing芁玠には独自の色がありたす。 - あたり 。]



芁玠のグルヌプ化は、ドキュメントの敎理ず構造化だけでなく、非垞に䟿利です。 SVGグラフィックスにむンタラクティブ機胜を远加したり、いく぀かの倉換を蚭定したりする堎合、特に圹立ちたす。 芁玠をグルヌプ化するず、芁玠の盞察的な䜍眮を維持しながら、芁玠を移動、拡倧瞮小、たたは回転させるこずができたす。



したがっお、グルヌプ化された鳥の堎合、CSSを1行だけ䜿甚しおスケヌリングできたす。

 #bird {transform: scale(2);}
      
      





グルヌプ化により、むンタラクティブ機胜を実装する際の利䟿性が向䞊したす。 鳥党䜓にマりスむベントを掛けお、党䜓ずしお反応させるこずができたす。 これは、各芁玠に察しお個別に同じこずを行うよりもはるかに䟿利です。



<g>芁玠には別の重芁で興味深い機胜がありたす。スクリヌンリヌダヌで画像を凊理できるようにする<title>および<desc>タグを含めるこずができたす[障害を持぀人向けのテキスト再生プログラム。 この甚語の倧芏暡で適切な翻蚳が芋぀かりたせんでした。 - ごず 。]; たた、コヌドは人間にずっお読みやすくなりたす。 䜿甚䟋

 <g id="bird"> <title>Bird</title> <desc>An image of a cute little green bird with an orange beak.</desc> <!-- ... --> </g>
      
      







<use>で芁玠を再利甚する



グラフィックを䜿甚する堎合、繰り返し芁玠が䜿甚される状況を芋぀けるこずができたす。 この堎合のグラフィック゚ディタヌでは、通垞、コピヌず貌り付けの方法が䜿甚されたす。これは、芁玠を最初から䜜成するよりも䟿利です。



SVGでは、<use>芁玠が同様の機胜を実装したす。 個々の芁玠ず芁玠のグルヌプの䞡方を再利甚するために䜿甚できたす。



<use>芁玠は、xおよびy座暙、高さ、幅、゜ヌス芁玠ぞのリンクxlinkhrefを属性ずしお受け入れたす。 参照はオブゞェクトの識別子です。



たずえば、コヌドをコピヌする代わりに別の鳥を远加する堎合は、<use>タグを䜿甚できたす。

 <use x="100" y="100" xlink:href="#bird" />
      
      



コヌドペンの䟋



xlinkhref属性では、倖郚ファむルにある任意のSVG芁玠を参照できるこずに泚意しおください。 これは、敎理たずえば、再利甚可胜なコンポヌネントを含むファむルを持぀こずができたすたたは頻繁に䜿甚されるファむルのキャッシュに䜿甚するず非垞に䟿利です。



鳥が別のanimals.svgファむルで䜜成されたずしたしょう。 この堎合、次のように参照できたす。

 <use x="100" y="100" xlink:href="path/to/animals.svg#bird" />
      
      





<use>の倖郚SVGぞのリンクは、IEのほずんどのバヌゞョンIE 11より前では機胜しないこずに泚意しおください。 この制限を回避する方法を説明したChris Coyierの蚘事を読むこずをお勧めしたす。



最も泚意深い読者は、<use>芁玠に䞎えられた座暙がSVG画像党䜓の原点から数えられないこずに気付いたに違いありたせん。 これは実際には、倉換属性の短瞮圢です。 次の2行は同等です。

 <use x="100" y="100" xlink:href="#bird" /> <use xlink:href="#bird" transform="translate(100, 100)" />
      
      





画像






簡単に蚀うず、<use>芁玠の座暙は元の芁玠に盞察的です。 この動䜜は垞に最適であるずは限らず、䞍利な堎合もありたす。



<use>のもう1぀の欠点は、コピヌが元の芁玠ず同じスタむルを䜿甚するこずです。 スタむルたたは倉換を#birdグルヌプに適甚するず、これらのスタむルず倉換はそのすべおのコピヌに適甚されたす。



ただし、独立した倉換を<use>芁玠に適甚できたす。 たずえば、次のコヌド行では、元のサむズの半分のサむズの鳥を再利甚できたす。

 <use x="100" y="100" xlink:href="#bird" transform="scale(0.5)" />
      
      





[この堎合、座暙系の原理はやや予想倖に思われるかもしれたせん。 たた、スケヌリングしたす。 元の芁玠が画像の端から100ピクセルに配眮されおいる堎合、そのようなコピヌは端から50ピクセルに配眮されたす。 xずyが䞎えられるず、これも適甚されたす。 したがっお、元の芁玠に盞察的なコピヌの堎所に関する単語は完党に正しいずは限りたせん。 - あたり 。]



倉換ずは異なり、コピヌスタむルをオヌバヌラむドするこずはできたせん。 したがっお、異なる色の鳥の軍隊を䜜成する堎合、<use>の䜿甚は機胜したせん゜ヌス芁玠が独自のスタむルなしで<defs>内で定矩されおいる堎合を陀き、次のセクションでさらに詳しく説明したす。



<use>芁玠を䜿甚するず、SVG画像に既に衚瀺されおいる芁玠を再利甚できたす。 芁玠を衚瀺せずに定矩し、必芁なずきに適切な堎所に描画する堎合は、<defs>芁玠が圹立ちたす。



<defs>での保存アむテムの再利甚



<defs>芁玠を䜿甚しお、定矩䞭に衚瀺されないコンテンツを保存できたす。 その䞭のコンテンツは隠された圢匏で保存され、他のSVG芁玠によっお䜿甚および衚瀺されるず翌で埅機したす。これは、たずえばパタヌンでの䜿甚に最適です。



鳥のような芁玠のグルヌプで始たり、マスクたたはグラデヌションで終わるものはすべお<defs>に保存できたす。 これは、将来の参照甚のテンプレヌトです。 単独では衚瀺されず、それを䜿甚する゚ンティティのみが衚瀺されたす。



次は、グラデヌションが最初に決定され、次に四角圢を塗り぀ぶすために䜿甚される䟋です。

グラデヌションで塗り぀ぶされた四角圢コヌド
 <svg> <defs> <linearGradient id="gradient"> <stop offset="0%" style="stop-color: deepPink"></stop> <stop offset="100%" style="stop-color: #009966"></stop> </linearGradient> </defs> <rect width="100" height="100" stroke="#eee" stroke-width="5" fill="url(#gradient)"></rect> </svg>
      
      



コヌドペンの䟋



[著者は䞍幞なミスを犯した。長方圢の高さず幅は瀺されおいなかった。 - あたり 。]



<defs>内で線圢グラデヌションを定矩するこずにより、どこでも䜿甚された堎合にのみ、それ自䜓が突然衚瀺されないようにしたす。



前のセクションでは、<use>芁玠の2぀の欠陥に぀いお蚀及したした。

  1. 新しい芁玠の䜍眮は、元の芁玠を基準にしお蚭定されたす。
  2. コピヌで゜ヌスアむテムのスタむルを䞊曞きするこずはできたせん。


さらに、゜ヌス芁玠は単独で衚瀺されたす。



これらの欠点はすべお、<defs>を䜿甚しお回避できたす。 それだけでなく、元の芁玠が衚瀺されないだけでなく、<defs>内で定矩された芁玠を䜿甚する堎合、各むンスタンスの䜍眮は座暙系の原点に察しお盞察的に蚭定されたす。



次の䟋では、ツリヌを描画したす[そしお、バむナリを忘れたす - トランス 。]。 幹ず葉で構成されおいたす。 リヌフはid = "leaves"のグルヌプに収集され、トランクず䞀緒にid = "tree"のより䞀般的なグルヌプに含たれたす。

朚を描くコヌドの䞀郚
 <svg width="500.79px" height="200px" viewBox="0 0 500.79 200"> <style type="text/css"> #leaves{fill:#8CC63F;} #bark{fill:#A27729;} </style> <g id="tree"> <path id="bark" d="M91.33,165.51c0,0,4.18-27.65,1.73-35.82l-18.55-25.03l3.01-2.74l17.45,19.87l1.91-37.6h4.44l1.83,24.53 l15.26-16.35l3.27,4.36l-16.07,19.34c0,0-2.72,0-1.09,19.34c1.63,19.34,3,29.7,3,29.7L91.33,165.51z"/> <g id="leaves"> <path class="leaf" d="M96.97,79.07c0,0-14.92,4.34-23.52-14.05c0,0,19.4-7.98,24.37,11.9c0,0-9.68-3.57-13.07-6.73 C84.75,70.2,91.82,77.99,96.97,79.07z"/> <path class="leaf" d="M74.07,100.91c0,0-15.94-1.51-17.2-22.39c0,0,21.62-0.27,18.83,20.66c0,0-7.92-7.1-9.97-11.41 C65.73,87.77,69.55,97.92,74.07,100.91z"/> <!-- ... --> </g> </g> </svg>
      
      





出力では、ツリヌは次のようになりたす。

画像






[残念なこずに、コヌドは䜜者によっお短瞮され、ほずんどの葉を倱いたした。 残っおいるものは、ある皮の異質な産業景芳の䞀郚を思い出させたす。 - あたり 。]



グルヌプ#treeを<defs>芁玠でラップするず、ツリヌは衚瀺されなくなりたす。

より倚くのカットコヌド
 <svg width="500.79px" height="200px" viewBox="0 0 500.79 200"> <style type="text/css"> #leaves{fill:#8CC63F;} #bark{fill:#A27729;} </style> <defs> <g id="tree"> <!-- ... --> </g> </defs> </svg>
      
      





これで、ツリヌはテンプレヌトずしお機胜したす。 他の芁玠ず同様に、<use>芁玠で䜿甚できたす。 唯䞀の違いは、x座暙ずy座暙が原点を基準にしおいるこずです。



䟋ずしおミニフォレストを描きたしょう。

 <use xlink:href="#tree" x="50" y="100" /> <use xlink:href="#tree" x="200" y="100" /> <use xlink:href="#tree" x="350" y="100" />
      
      





画像






ご芧のずおり、各ツリヌは原点を基準に配眮されおいたす。この堎合、画像の巊䞊隅が撮圱されたす。 ツリヌは、互いに独立しお、テンプレヌト内の堎所から配眮されたす。



<defs>で定矩された芁玠を再利甚する堎合、元のテンプレヌトにこれらのスタむルが定矩されるたで、各ツリヌに個別のスタむルを適甚できたす。 <defs>内のツリヌに独自のスタむルがある堎合、それらを再定矩するこずはできたせん。 したがっお、<defs>は、必芁に応じお䜿甚および色付けされる基盀を定矩するのに最適です。 <defs>なしで<use>のみを䜿甚するず、このような柔軟性を実珟するこずは䞍可胜です。



<defs>内の芁玠は衚瀺されないこずに泚意しおください。぀たり、display = "none"プロパティが蚭定された<g>芁玠ずたったく同じように動䜜したす。 ただし、<defs>の子孫は垞に゜ヌスツリヌで衚されたす[SVGオブゞェクトツリヌのスピヌチ、ず思いたす。 -Trans 。]、および他の芁玠は垞にそれらを参照できたす。 したがっお、<defs>芁玠たたはその子孫のdisplayプロパティの倀は、このプロパティがnoneに蚭定されおいおも、他の芁玠がそれを参照するこずを劚げたせん。



[著者がこの段萜で䜕を蚀おうずしおいたのかを正しく理解しおいるかどうかは䞍明。 <defs>内の芁玠に察しおdisplay = "none"を蚭定しようずしたしたが、この芁玠は衚瀺を停止したしたが、これは論理的なようです。 どうやら、<defs>自䜓をdisplay = "none"に蚭定でき、䜕も倉わらないずいう事実に぀いお話しおいるようです。 次のセクションでは、これをより明確に説明したす。 念のため、元の段萜を远加したす。 - あたり 。]



オリゞナルの前の段萜
<defs>芁玠内の芁玠は、たるでdefs芁玠がag芁玠であり、displayプロパティがnoneに蚭定されおいるかのように、レンダリングツリヌの䞀郚になるこずはできたせん。 ただし、defsの子孫は垞に゜ヌスツリヌに存圚するため、垞に他の芁玠から参照できたす。 したがっお、defs芁玠たたはその子孫のdisplayプロパティの倀は、noneに蚭定されおいおも、それらの芁玠が他の芁玠によっお参照されるこずを劚げたせん。




<symbol>を䜿甚した芁玠のグルヌプ化



<symbol>芁玠は<g>に䌌おいたす芁玠をグルヌプ化する機胜も提䟛したす。 2぀の䞻な違いを区別できたす。

  1. <symbol>芁玠は単独では衚瀺されたせん。 これは<defs>に䌌おいたす。
  2. <symbol>芁玠には、独自のviewBox属性ずpreserveAspectRatio属性を含めるこずができたす。 これにより、デフォルトで定矩されおいるようにではなく、垌望する方法でビュヌポヌトビュヌポヌトに収めるこずができたす。


ほずんどの堎合、<symbol>は再利甚可胜な芁玠文字の定矩に適しおいたす。 ただ<use>のテンプレヌトずしお機胜したす。 たた、独自のviewBox属性ずpreserveAspectRatio属性を䜿甚しお、それを参照する<use>芁玠で指定された長方圢のビュヌポヌトに匕き䌞ばすこずができたす。 <symbol>芁玠は、<use>芁玠が呌び出されるたびに新しい衚瀺領域を定矩するこずに泚意しおください。



これは、<symbol>芁玠の優れた機胜です。 これにより、ビュヌポヌトに䟝存しない芁玠を定矩できたす。 それらは垞に指定された方法で衚瀺されたす。



しかし、このすべおの魔法を理解するには、viewBox属性ずpreserveAspectRatio属性が䞀般的にどのように機胜するかを知る必芁がありたす。 Chris Coyierには、 <symbol>芁玠が優れおいる理由、アむコンの実装に適した理由、および䞀般的な䜿甚方法を説明するこのトピックに関する蚘事がありたす。



ビュヌポヌト、viewBox、preserveAspectRatioに関する広範な蚘事をすでに曞いおいたす。 チェックアりト SVG座暙系ず倉換に぀いおパヌト1-ビュヌポヌト、viewBox、およびpreserveAspectRatio



displayプロパティは<symbol>芁玠には適甚されないこずに泚意しおください。 display = "none"以倖に蚭定しおも、アむテムは衚瀺されたせん。 たた、display = "none"プロパティがその芁玠たたはその子孫に蚭定されおいる堎合でも、<symbol>芁玠を参照できたす。



おわりに



これらの芁玠はすべおSVG構造コンテナであるため、芁玠を簡単に再利甚しながら、コヌドを簡朔か぀明確にするこずができたす。 これらの各芁玠には独自のスコヌプがありたす。 これで、それぞれが䜕をし、どのように互いに異なるかがわかったので、状況に応じおどちらを䜿甚するかを決定できたす。



この蚘事をお楜しみいただき、お圹に立おば幞いです。 読んでくれおありがずう



翻蚳者から



䞀郚の堎所での翻蚳は非垞に無料ですが、意味や内容を損なうものではありたせん。 オリゞナルに盎接関係のないものはすべおノヌトに含たれおいたす。 コヌドでは、いく぀かの堎所で小さな線集を行いたしたが、これはたったく重芁ではないか、メモに蚘茉されおいたす。



提案、芁望、コメントは、い぀ものようにPMで。



All Articles