質問に対する私の理解では、解決すべきさまざまな側面があるということです。
- インタラクション用の画像を準備する方法
- ページに画像を埋め込む方法
- SVG で CSS を使用する方法
- インタラクションに JavaScript を使用する方法
画像の準備
まず、画像をクリーンアップすることをお勧めします。sodipodi:
Inkscape は、 と 名前空間の要素と属性、およびinkscape:
反復的および/または冗長なスタイル属性を含む、必要のないすべての種類のものをそこに残します。それを削除する必要はありませんが、帯域幅/読み込み時間を節約できます。また、CSS スタイルシートを使用する場合は、スタイル属性が邪魔になります。
サンプル ファイルでは、同じスタイル属性が 472 回あります。それらをすべて削除し、同等の CSS ルールを一度作成します。
自治体に関する情報をマークアップに追加することもできます。たとえば、自治体を表す各パスの ID をその名前に従って変更できます。data-*
この目的で属性を使用することもできます。後者には、スペースを使用できるという利点があります。これが対話、特に CSS でどのように役立つかについては、以下を参照してください。
画像の埋め込み
特に CSS/JavaScript を操作する場合は、SVG インラインを使用することをお勧めします。つまり、SVG マークアップを HTML に追加するか、Ajax を使用して読み込んで挿入するだけです。後者には、周囲のページの読み込みが速くなり、応答性が向上するという利点があります.
インライン SVG 要素の例:
<div id="svgContainer">
<!-- This is an HTML div, and inside goes the SVG -->
<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px">
<circle r="50" cx="50" cy="50" fill="green"/>
</svg>
</div>
Ajax を使用して SVG をロードする方法の簡単な例:
xhr = new XMLHttpRequest();
xhr.open("GET","my.svg",false);
// Following line is just to be on the safe side;
// not needed if your server delivers SVG with correct MIME type
xhr.overrideMimeType("image/svg+xml");
xhr.onload = function(e) {
// You might also want to check for xhr.readyState/xhr.status here
document.getElementById("svgContainer")
.appendChild(xhr.responseXML.documentElement);
};
xhr.send("");
CSSの使い方
SVG は、HTML と同じようにスタイルを設定できます。もちろん、SVG にはfill-opacity
やなどの独自のプロパティ セットがあり、などstroke-dasharray
の多くの HTML のプロパティはサポートされていません。しかし、セレクターのメカニズムは 100% 同じです。margin
position
<style>
要素内または外部 CSS ファイルのいずれかで、インライン SVG の CSS と HTML の CSS を混在させることができます。<style>
SVG コードとstyle
属性内で要素を使用することもできます。
SVG 要素に意味のある ID またはdata-*
属性を与えたと仮定すると、CSS を使用して地方自治体を強調表示する 2 つの方法は次のようになります。
#Bronckhorst, #Laarbeek {fill:red}
また
*[data-gemeente=Bronckhorst], *[data-gemeente=Laarbeek] {fill:red}
もちろん、それぞれの要素のスタイル属性を変更することもできます。プロパティは属性としてもサポートされています。つまり、 のstyle="stroke-width:2"
ように指定することもできますstroke-width="2"
。属性と CSS の両方 (style 属性、style 要素、または外部スタイルシートのいずれかを使用) を使用して同じプロパティが設定されている場合、CSS は属性をオーバーライドします。
JavaScript インタラクション
少なくともプレーンなバニラ DOM を使用している限り、JavaScript の相互作用に関しては、基本的に HTML と SVG の間に違いはありません。つまり、 のような HTML 固有の機能innerHTML
は SVG ではサポートされていません (つまり、 はありませんinnerSVG
)。しかし、SVG には独自のグラフィックス固有の DOM メソッドのセットがあります ( W3C 仕様を参照してください)。
注意すべきことの 1 つは、名前空間の操作です。すべての SVG 要素は SVG 名前空間にある必要があり、JavaScript を使用してそれらを作成する場合は、createElementNS()
代わりに使用する必要がありcreateElement()
ます。
var use = document.createElementNS("http://www.w3.org/2000/svg","use")
同様に、XLink 名前空間 (つまり ) の属性は、代わりにxlink:href
を使用して操作する必要があります。setAttributeNS()
setAttribute()
use.setAttributeNS("http://www.w3.org/1999/xlink","href","#foo")
jQuery などのライブラリは HTML 固有の機能に部分的に依存しているため、SVG を操作するときはそれらを避ける方が安全です。[編集: この回答を書いてから、状況が改善された可能性があります。jQuery のユーザーではないので、最近どのように機能するかはわかりません。] D3.jsのような SVG 固有のライブラリもあり、特定の目的に役立つ可能性があり、一見の価値があります。(単純に SVG 固有のライブラリと呼ぶとき、私は D3.js の不正を行っています。それはそれ以上のものだからです)。
onclick
同様の属性と標準 DOMを使用できますaddEventListener()
。<svg>
JavaScript イベントを使用する非常に単純な例は、ユーザーがクリックした自治体の名前を報告する要素にイベント リスナーを追加することです。
document.getElementsByTagName("svg")[0]
.addEventListener("click",function(evt){
alert(evt.target.getAttribute("data-gemeente"))
},
false)
補足: ツールチップtitle
HTML で属性を
使用して得られるのと同じ効果が<title>
、SVG で要素を使用して実現できます。<title>
要素を SVG 要素内に配置してホバーすると、<title>
要素のコンテンツを含むツールチップが表示されます。
<svg xmlns="http://www.w3.org/2000/svg" width="100px" height="100px">
<rect width="100" height="100">
<title>test</title>
</rect>
</svg>