ã€ã³ã¿ã©ã¯ãã£ããªããããäœæããŸãããã äœãã ã€ã³ã¿ã©ã¯ãã£ããšã¯ã©ãããæå³ã§ããïŒ ãŸããããã¯ãŠãŒã¶ãŒãšããããé
眮ãããŠããWebããŒãžäžã®ããŒã¿ãšå¯Ÿè©±ããå¿
èŠããããŸãã ããã¯ã€ã³ã¿ã©ã¯ãã£ãã ãšèããã«ã¯ååã ãšæããŸãã
ããŠãSVGã䜿çšããŸãã ãªãã§ïŒ ã¯ããHTMLã«ç²ŸéããŠãã人ãšç°¡åã«äœæ¥ã§ããããã§ãã SVGã¯XMLããŒã¹ã®ãã¯ã¿ãŒåœ¢åŒã§ãã ã€ãŸããSVGã€ã¡ãŒãžã«ã¯ç¬èªã®DOMããããCSSã«ãŒã«ãããŸããŸãªèŠçŽ ã«é©çšããŠãå€ãè¯ãJavaScriptãå¶åŸ¡ã§ããŸãã
ãããå§ããŸããããïŒ
æãã€ã©ã€ã©ãã人ã¯ããã«
ãã¢ãèŠãããšãã§ããŸãããé çªã«ãã¹ãŠãèªãããšããå§ãããŸãã
å°å³ãæºåããŠããŸã
æåã«èŠç¹ãå¿
èŠã§ãã ç§ã¯ã«ãŒãèªäœãæå³ããŸãã Googleãå©ãã«ãªããªããã°ã
Inkscapeãè¡ãã®ã¯é£ãããããŸããããèªåã§æãããšãã§ããŸãã
ããšãã°ã1ã€ã®äžžãåœã®å°å³ãååŸããŸãïŒ
ãŠã£ãã¡ãã£ã¢ã³ã¢ã³ãºã®ãœãŒã¹ ïŒ
ç§ã®èšç»ã«ããã°ãããããšãªã¢ã«ç°ãªãè²ã䜿çšããã¹ãã§ã¯ãªãããããŸããé¢å¿ã®ãã<path>ã¿ã°ããå¡ãã€ã¶ãã¹ã¿ã€ã«ãšã¹ãããŒã¯ã¹ã¿ã€ã«ãåãåããŸããã代ããã«ãããã®èŠçŽ ã«å¿
èŠãªã¯ã©ã¹ãšIDãæå®ããŸãã ããšãã°ãå°åã®å Žåã¯class = "area"ãéœåžã®å Žåã¯class = "city"ã§ãã
次ã«ãç»åã®<defs>ã»ã¯ã·ã§ã³ã«ãéåžžã«éŠŽæã¿ã®ãããã®ãé
眮ããŸãã
<style type="text/css"> .area { stroke: black; stroke-width: 2px; fill: #E9FFE9; } .city { stroke: black; stroke-width: 2px; fill: red; } </style>
ãããç§ãå®éã«çŽæããCSSã§ãã ååãšããŠãããã§ãã§ã«ååã§ãã
å·®åçµæïŒ
SVGãHTMLã«æ¿å
¥ãã
ãã®ããã»ã¹ã¯
ãSVGã®ã¯ãã¹ãã©ãŠã¶ãŒäœ¿çšã®åé¡ã«é¢ãã habratopicsã§ååã«è©³çŽ°ã«èª¬æãããŠã
ãŸã ã
HTML5ã䜿çšããæãåçŽã§äººéçã§æšæºçãªæ¹æ³ã䜿çšããŸãã
<object data="map.svg" type="image/svg+xml" id="imap" width="500" height="420"></object>
SVGã
ãµããŒããããã¹ãŠã®ãã©ãŠã¶ãŒã¯ã
SVGãæ£ãããé£ã¹ãŠã衚瀺ããŸãã ãããŠåœŒãšäžç·ã«åããŸãããã 1ã€ã®æ¡ä»¶äžã§ïŒWebãµãŒããŒãMIMEã¿ã€ãimage / svg + xmlã§ãããæäŸããå Žåã å¥ã®MIMEã¿ã€ãã¯ãGoogle Chromeã«ãšã£ãŠéåžžã«æ··ä¹±ãæãå¯èœæ§ããããŸãïŒãã ãOperaã¯ã¿ã°ããSVGã«è¿œåŸããæçºã«åœ¹ç«ããªãããšããã£ãããšèªèããŠããŸãïŒã
2çªç®ã®æ£ããæ¹æ³ã¯ãSVGã³ãŒããHTMLã«çŽæ¥è²Œãä»ããããšã§ãã ã¹ã¯ãªããäœæã«
ã¯æé©ã§ããããã©ãŠã¶ã®ãµããŒã
ã¯ããã«å£ããŸãã ã¡ãªã¿ã«ãããªãã©ã«ãHTMLã«æ¿å
¥ãããSVGã¯äŸç¶ãšããŠãå³ãããXML'emã®ãŸãŸã§ãã ãã®ãããåŒçšç¬Šãšçµäºã¿ã°ãå¿
èŠã§ãã
æ°Žäžçæ
ããããããã»ã©åçŽã§ã¯ãããŸããã ãã©ãŠã¶ã¯é åºã«ããããã¹ã±ãŒãªã³ã°ããããªãããšã«ããã«æ°ã¥ãããšãã§ããŸããããããåãŸããªãå Žåã¯ã次ã®ããã«ã¹ã¯ããŒã«ããŒã衚瀺ãããŸãã
æåŸ
ã©ããã«ãã©ãŠã¶ãŒãSVGã§åäœãããã«ã¯ãå¹
ãšé«ãã®å±æ§ã<svg>ã¿ã°ããåé€ïŒãŸãã¯100ïŒ
ã«èšå®ïŒããå·Šäžã®åº§æšãæã€ãã©ãŠã¶ãŒå°çšã«èšèšãããviewBoxå±æ§ãæ¿å
¥ããå¿
èŠããããŸãç»åã®å³äžé
ïŒ
viewBox="0 0 493 416"
å·®åãã®åŸãç¶æ³ã¯å€§å¹
ã«æ¹åãããŸãããGoogle Chromeã¯å¥ã®ã¬ãŒããè¿œå ããŸãïŒä»ã®ãã©ãŠã¶ãŒãåäœããããã«ãã¿ã°ã®å¹
ãšç»åã®æ¯çã«å¿ããŠ<object>ã®é«ããå¢å ããããç»åã®é«ãã<object>èŠçŽ ã®é«ãã«é 匵ã£ãŠã¹ã±ãŒãªã³ã°ããããšããŸãã
æ®å¿µã ã JavaScriptãåŒãä»ããèŠçŽ ã®é«ããæåã§èª¿æŽããå¿
èŠããããŸãã
var viewBox = svgdom.rootElement.getAttribute("viewBox").split(" "); var aspectRatio = viewBox[2] / viewBox[3]; svgobject.height = parseInt(svgobject.offsetWidth / aspectRatio);
å·®åçµæïŒ
SVGãšããåãããŸã
HTMLã§çŽæ¥èšè¿°ãããSVGãšå¯Ÿè©±ããããã«ãäœãå¿
èŠãããŸãã-ããã¯ãã§ã«WebããŒãžã®DOMã®äžéšã§ãã
<object>ãä»ããŠæ¿å
¥ãããSVGãžã®ã¢ã¯ã»ã¹ã¯ããå°ãå°é£ã§ãã
jQuery(window).load(function () {
ã¯ããjQueryã¯SVGã§åäœããŸãããéšåçã«ããåäœããŸããã ããšãã°ãaddClassé¢æ°ãšremoveClassé¢æ°ã¯æ©èœãããã¯ã©ã¹ïŒ
jQuery(".class")
ãClass
jQuery(".class")
ïŒã«ããæ€çŽ¢ãæ©èœããªãããšã«æ°ä»ããŸããã
ç§ãã¡ã¯åé¯ããªããã°ãªããŸãããç§ã¯window.onloadã€ãã³ãã䜿çšããŠããããšã«æ³šæããŠãã ãããããã¯ãé¢é£ãããã¹ãŠã®èŠçŽ ïŒããããå«ãïŒãšãšãã«ããŒãžãå®å
šã«ããŒãããããŸã§åŸ
ã€å¿
èŠãããããã§ãã ãã ããããã§ãGoogle Chromeã¯æ¥ãã§è±ãæ€ããŠããŸãïŒwindow.onloadãå«ãã¹ã¯ãªããã<object>ã¿ã°ã®åã®htmlã³ãŒãã«ããå Žåããã³ãã©ãŒã®ã³ãŒãã¯ããããå®éã«ããŒããããåã«å®è¡ãããŸãã ãããã£ãŠããããã®åŸã«<script>ã¿ã°ãé
眮ããå¿
èŠããããŸãã æ²ãããæ¬åœã
æåã®å¯Ÿè©±æ§ïŒããŒãžã®ãã§ãã¯ããã¯ã¹ãã¯ãªãã¯ããŠããããäžã®å°åãéžæããŸãã
ãã®çžäºäœçšã®ããã«ãé åãæã€ããŒãã«ã®åè¡ã«ãã§ãã¯ããã¯ã¹ãå¿
èŠã§ãããŸãããããã®ããŒãã«ãšé åã®è¡ã«äžèŽãŸãã¯é¡äŒŒã®IDãå¿
èŠã§ãã
ããã§ããã§ãã¯ããã¯ã¹ãã¯ãªãã¯ãããšã
selected
ã¯ã©ã¹ããããäžã®å¯Ÿå¿ããé åããããŸãã¯ãã§ã«ã©ã€ã³èªäœããé
眮ãŸãã¯åé€ããŸãã ããã¯ç°¡åã§ãïŒ
$("#areas input[type=checkbox]").change(function() { var row = $(this).parent().parent(); var id = row.attr("id"); if (this.checked) { row.addClass("selected"); $("#"+id, svgdom).myAddClass("selected"); } else { row.removeClass("selected"); $("#"+id, svgdom).myRemoveClass("selected"); } });
ãããã£ãŠããã®ã¯ã©ã¹ã®å®çŸ©ãè¿œå ããã³ã¹ã¿ã€ã«èšå®ããå¿
èŠããããŸãã ããªãã®å¥œã¿ã奜ã¿ã«å¿ããŠèªåã§ããããŠãã ããã
å·®å2çªç®ã®ã€ã³ã¿ã©ã¯ãã£ãæ©èœïŒããŒãžã®ãã§ãã¯ããã¯ã¹ãã¯ãªãã¯ããŠããããäžã®ååãéããã衚瀺ãããããŸãã
ãã®çžäºäœçšã¯ããã«ç°¡åã«ãªããŸãã ããŒãžã«
<input type="checkbox" id="titleswitch">
ãšãã¯ã©ã¹ã®ååã«é¢é£ä»ããããŠãããã¹ãŠã®èŠçŽ ããããã«è¿œå /åé€ããå°ããªjavascriptãæ¿å
¥ããŸã
hidden {visibility: hidden;}
ïŒ
$("#titleswitch").change(function () { var elements = $(svgdom.getElementsByClassName("areatitle")) .add($(svgdom.getElementsByClassName("citytitle"))) .add($(svgdom.getElementsByClassName("titlebox"))) .add($(svgdom.getElementsByClassName("titleline"))); if (this.checked) { elements.myAddClass("hidden"); } else { elements.myRemoveClass("hidden"); } });
ããã«è¡ããŸãã
ã€ã³ã¿ã©ã¯ãã£ããã£3çªç®ïŒããŒãã«ã®è¡ã«ã«ãŒãœã«ãåããããšãã«ãããäžã®é åã匷調衚瀺ããŸãïŒéãåæ§ïŒ
ãããè¡ãã«ã¯ãããŒãã«äžã§onhoverã€ãã³ããã³ãã©ãŒããã³ã°ãããŸãã
...ããã³ãããäžã®ãšãªã¢ãžïŒ
ããã確èªããã«ã¯ãé©åãªCSSã«ãŒã«ãããŒãžã«è¿œå ããŸãã
tr.highlight, tr:hover, tr:nth-child(even):hover { background: lightyellow; }
...ããã³SVGã«ãŒããžïŒ
.highlight, .area:hover { fill: lightyellow; stroke: black; }
ããŒãã«ã®è¡ïŒãŸãã¯ãããäžã®é åïŒã«ããŠã¹ã移åãããšã匷調衚瀺ã«å¿
èŠãªã¯ã©ã¹ããããäžã®å¯Ÿå¿ããé åïŒããŒãã«è¡ïŒã«ãã³ã°ã¢ããããŸãã äžèšã®ã³ãŒããæ©èœãããã«ã¯ããããäžã®è¡ãšããŒãã«ã®è¡ã®IDãäžèŽïŒãŸãã¯é¡äŒŒïŒããŠããå¿
èŠããããŸãã
å·®å4çªç®ã®ã€ã³ã¿ã©ã¯ãã£ãæ©èœïŒãããäžã®ããŒãžã®ããŒã¿ã衚瀺ãã
ãŸããå¹³å¡ãªã¯ã©ã¹ã®å²ãåœãŠã¯ãããããã§ã«éå±ã§ãã å°å³ã«ããŒã¿ã衚瀺ããŠã¿ãŸãããã
ãŸãæåã«ïŒããŒã¿ã ããšãã°ããPeopleãããMoneyããªã©ããã¬ãŒãã«ããã€ãã®åãè¿œå ããŸãã
泚æ ïŒããŒã¿ã¯ãã«ããŒã¶ãŒããååŸãããå®éã®ã¢ã¡ã¹ããªã¹ãšã¯é¢ä¿ãããŸããã ãŸãã衚瀺ããããŒã¿ãåãæ¿ããã©ãžãªãã¿ã³ããããŸãã
第äºã«ãããŒã¿ã衚瀺ãããå°å³äžã®å Žæãå¿
èŠã§ãã ãããã«5ã€ã®<text>ãããã¯ïŒåå°åã«1ã€ãIDãå°åã«é¢é£ä»ããŸãïŒããã³å¯Ÿå¿ãã<defs>ã®ã¹ã¿ã€ã«ãè¿œå ããŸãã
<text class="areavals" x="190.29787" y="246.35461" id="text3186"></text>
ããŠãããŒãã«ã»ã«ããããŒã¿ãååŸããŠããã¹ããããã¯ã«å
¥ããJavaScriptã³ãŒãïŒ
$("input[name=tabledata]").change(function () { var descnum = $(this).parent().prevAll().length+1; $("#areas tbody tr").each(function() { var id = $(this).attr("id").substring(4); var value = $(this).children(":nth-child("+descnum+")").text(); $("#text"+id, svgdom).text(value); }); });
ã©ãžãªãã¿ã³ãåãæ¿ãããšãã«ãŒãã«å¿
èŠãªçªå·ã衚瀺ãããŸãã
åºæ¥äžãã ïŒ
5çªç®ã®ã€ã³ã¿ã©ã¯ãã£ãæ©èœïŒããŒã«ããã
ããããããã¯ãã§ã«äœèšãªãã®ã§ããããããããŠãã ããã å®å
šãªã¢ã«ãŠã³ãã®å Žåã
ãã®çžäºäœçšã®ããã«ã
jQuery.tooltipãã©ã°ã€ã³ã
ååŸããŠããããäžã®ãšãªã¢ã«æ·»ä»ããŸãã ãã¡ããããã³ãã®ããã¹ããè¡šããååŸããŸãã
$(svgdom.getElementsByClassName("area")).tooltip({ bodyHandler: function() { var id = $(this).attr("id"); var area = $("#areas #"+id+" td:nth-child(2)").text(); var result = $("<p>").append($("<strong>").text(area)); $("#areas #"+id+" td:nth-child(2)").nextAll().each(function(){ var pos = $(this).prevAll().length+1; var title = $("#areas thead th:nth-child("+pos+")").text(); var value = $(this).text(); result.append($("<p>").text(title + ": " + value)); }); return result; } });
å·®åãªã©...
ãã¡ãããSVGãšå¯Ÿè©±ããå¯èœæ§ã¯ããã«éå®ãããŸããã ããªãã¯äœ
ã§ãã§ã
ãŸã ã DOMãã·ã£ããã«ããAJAXãªã¯ãšã¹ãã«å¿ããŠããŒãžãšSVGãå€æŽããŸãã ã©ãã
çµæ
æ®ãã®èœãšãç©Ž
æ¢ç¥ã®åé¡ã®ãã¡ããããŸã§ã®ãšããGoogle ChromeãSVGç»åãå°å·ããªãããšã«æ³šæããããšãã§ããŸãã ããã¯
圌ã®ãã°ããäžè¬çãª
WebKitã®ãã°ã§ãã
äžäœäºææ§
ã»ãšãã©ãã¹ãŠã®ææ°ãã©ãŠã¶ãŒã¯ãSVGããµããŒãããŠããŸãïŒIE 9 +ãOpera 8 +ãFirefox 3+ïŒFirefox 1.5+ã§ã®éšåçãªãµããŒãïŒããã¹ãŠã®ããŒãžã§ã³ã®ChromeãSafari 3.2+ïŒ
ããå®å
šãªãªã¹ã ïŒ
ããããæ²ããããªãæããæªæ¥ã¯å®å
šã«ã¯å°æ¥ãããããªãã¯ãŸã å€ããã©ãŠã¶ããµããŒãããããšãèããªããã°ãªããŸããã
SVGãåãªãç»åã§ããå Žåã®æšæºçã§æãç°¡åãªæ¹æ³ïŒ<object>ã¿ã°å
ã«çœ®æã³ã³ãã³ãïŒPNGç»åãšããã¹ãã®æ®µèœã«ã¬ã³ããªã³ã°ïŒãæ¿å
¥ããŸãã
<object data="map.svg" type="image/svg+xml" id="imap" width="600" height="500"> <img src="map.png" alt=" " width="600" height="500"> <p> , , .</p> </object>
ãã©ãŠã¶ãSVGããµããŒãããŠããªãå ŽåãPNGç»åãšããã¹ãã衚瀺ããããã©ãŠã¶ãå€ãããšããŠãŒã¶ãŒã«éç¥ããŸãã åæ¹åæ§ã¯ãããŸããã ãã ããããã»ã©å¿
èŠã§ã¯ãªãå ŽåããããŸãã 確ãã«ããã€ãã¹ã1ã€ãããŸããæ°ã¥ããããã«ãææ°ã®ãã©ãŠã¶ã¯ããŸã 衚瀺ãããªãã«ããããããã代ããã®PNGã€ã¡ãŒãžãç¶ç¶çã«ããŠã³ããŒãããŸãã
é¢å¿ã®ããæ¹ã¯ã
Modernizrã䜿çšããŠ
SVGãµããŒãã®
æ€åºã䜿çšããjavascriptã§ããã«è€éãªããšãè¡ãããšãã§ããŸãã
ããè€éãªã±ãŒã¹ã§ã¯ãå€æ°ã®FlashãVMLããŸãã¯Canvasãœãªã¥ãŒã·ã§ã³ïŒãŸãã¯ãã¹ãŠäžç·ã«ïŒã圹ç«ã¡ãŸãã ãªã¹ãã¯
HTML5 Crossbrowser Polyfillsã«ãããŸãããæ®å¿µãªãããç§ãè©Šãããããã®ãœãªã¥ãŒã·ã§ã³ã¯åœ¹ã«ç«ã¡ãŸããã§ããã ãããããç§ãèã®äžã§ã¹ã±ããããCSSã䜿çšããSVGã¯ã圌ãã«ãšã£ãŠã¯åŒ·ãããããã§ãããã
SVGãPNGã«å€æ
ãããã¯ãŒã¯äžã«ã¯ãSVGã€ã¡ãŒãžãå¥ã®ãã®ã«å€æã§ããå ŽæããããããããŸãã
librsvg2-binããã±ãŒãžã®
rsvg-convertã³ãã³ãã䜿çšããããšããå§ãããŸãã ãã®ãããªãã®ïŒ
cat map.svg | rsvg-convert > map.png
ãã ããä»ã®åœ¢åŒã«å€æããããç»åãå¢æžãããã§ããŸãã--helpãåç
§ããŠãã ããã
倧éã®ã³ã³ããŒãžã§ã³ã«ã€ããŠã¯ãããè€éãªããŒã ãäœæãããã
ãã©ãŒã©ã ã¹ã¬ããã®äŸãã芧ãã ããããã®ããŒã ãèŠã€ãããŸããã
çµè«ã®ä»£ããã«
ãŸããããã ãã§ãã ãã調ã¹ãŠã¿ããšãããã¯ããã»ã©é£ããã¯ãªããæãéèŠãªããšã¯ããã¹ãŠãWebéçºè
ã«ãšã£ãŠèº«è¿ã§èŠªãã¿ã®ãããã®ã§ãã äžèšã§æžãããã®ã
ãã¢ããŒãžã®åœ¢ã§èŠãŠããœãŒã¹ã³ãŒãã
ãªããžããªããåãé¢ã
ãŸã ãææ¡ãæ¹åãããå Žåã¯ãã³ã¡ã³ãã§è¡šçŸãããã
ãã«ãªã¯ãšã¹ãã®åœ¢ã§ãªããžããªã«éä¿¡ã
ãŸã ã ææ°ã®Webãã¯ãããžãŒã§ããªãã®ä»äºã楜ããã§ãã ããïŒ