Svg
ã¹ã±ãŒã©ãã«ãã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ïŒSVGïŒã¯ã2次å ã®ãã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ãèšè¿°ããããã«XMLããæ¡åŒµãããããŒã¯ã¢ããèšèªã§ãã
ãã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ã§ç»åãäœæããã«ã¯ã幟äœããªããã£ãïŒãã€ã³ããã©ã€ã³ãã«ãŒããããªãŽã³ïŒã䜿çšããŸãã 圌ãã®å©ããåããŠãã¹ã±ãŒãªã³ã°æã«å質ã倱ããªãã¹ã±ãŒã©ãã«ãªã€ã¡ãŒãžãäœæã§ããŸãã
SVG-ã¡ã¢ãªã«ãªããžã§ã¯ããä¿åããæç»æè¡ïŒä¿æã¢ãŒãã®ã°ã©ãã£ãã¯ã¹ïŒã HTMLãšåæ§ã«ãSVGã«ã¯ããã¥ã¡ã³ããªããžã§ã¯ãã¢ãã«ïŒDOMïŒããããŸãã HTMLãšåæ§ã«ãSVGã®DOMã«ã¯ã€ãã³ãã¢ãã«ããããŸãã ããã¯ãã€ãã³ããDOMèŠçŽ ã«çŽæ¥é¢é£ä»ããããããããã®æè¡ã䜿çšããŠã€ã³ã¿ã©ã¯ãã£ããªã¢ã¯ã·ã§ã³ïŒããŠã¹ã³ã³ãããŒã«ãªã©ïŒãå®è£ ããããšã§ãããã°ã©ããŒã®è² æ ã軜æžãããããšãæå³ããŸãã
SVGã«ã¯ãéåžžã®å±æ§ãšè¡šç€ºå±æ§ã®äž¡æ¹ããããŸãã éèŠãªç¹ã¯ãCSSã¹ã¿ã€ã«ã®äœ¿çšèŠåã«åŸã£ãŠãã¹ã¿ã€ã«ããã¬ãŒã³ããŒã·ã§ã³å±æ§ã«é©çšã§ããããšã§ãã ããšãã°ãå³åœ¢ã®è²ãå€æŽããã«ã¯ãfillããããã£ã䜿çšã§ããŸãã
èŠçŽ ã¯ãããã¥ã¡ã³ãã«SVGãåã蟌ãããã«äœ¿çšãããŸãã
äŸ1ïŒç·ç»
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="600" height="70"> <line x1="5" y1="5" x2="500" y2="60" stroke="#b4241b" stroke-width="3" /> </svg>
äŸ2ïŒå¡ãã€ã¶ãããåãæã
HTMLïŒ
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100" height="100"> <circle cx="50" cy="50" r="40" y2="60" stroke="#b4241b" stroke-width="3" /> </svg>
CSSïŒ
svg { fill: blue; }
Canvas 2d
<Canvas>ã¯ãJavaScriptã䜿çšããŠããããããã°ã©ãã£ãã¯ãäœæããããã«äœ¿çšãããHTMLèŠçŽ ã§ãã <canvas>èŠçŽ ã¯ãJavaScriptã䜿çšããŠ2Dã°ã©ãã£ãã¯ã¹ãæç»ããããã®äŸ¿å©ãªAPIãæäŸããŸãã
svgãšã¯ç°ãªãããã£ã³ãã¹ã¯ã©ã¹ã¿ãŒã°ã©ãã£ãã¯ã¹ã§åäœããŸãã ããã¯ã€ã³ã¹ã¿ã³ãæç»æè¡ã§ããããã®èŠçŽ ãDOMããªãŒã«ä¿åããªããããæ¢åã®æç»ãå€æŽãããã€ãã³ãã«å¿çãããããæ¹æ³ã¯ãããŸããã ã€ãŸããæ°ãããã¬ãŒã ãå¿ èŠãªå Žåã¯ãã·ãŒã³å šäœãåæç»ããå¿ èŠããããŸãã
<canvas>èŠçŽ ã«ã¯ãå¹ ãšé«ãã®2ã€ã®å±æ§ãããããŸããã é«ããšå¹ ã®å±æ§ãèšå®ãããŠããªãå Žåã html5ä»æ§ã«åŸã£ãŠãcanvasèŠçŽ ã®å¹ ã¯300ãã¯ã»ã«ã«ãªããé«ãã¯150ã«ãªããŸãããããã®å±æ§ãå€æŽããããšããã£ã³ãã¹ã¯ã¯ãªã¢ãããŸãã
CSSã§ä»»æã«ãµã€ãºãèšå®ããããšãã§ããŸãããã¬ã³ããªã³ã°äžã«ãç»åã¯ãµã€ãºãšæ¹åã«å¿ããŠæ¡å€§çž®å°ãããŸãã ããã«ãããç»åãæªãã§èŠããå ŽåããããŸãã
æç»ããã«ã¯ãæåã«APIãã°ã©ãã£ãã¯ãäœæããããã«æäŸããã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã ã³ã³ããã¹ãã¯ãcanvasèŠçŽ ã®getContextïŒïŒã¡ãœããã䜿çšããŠååŸã§ããŸãã æåã®ãã©ã¡ãŒã¿ãŒãšããŠã䜿çšããã³ã³ããã¹ãã®ã¿ã€ããæå®ããå¿ èŠããããŸãã çŸåšãææ°ã®ãã©ãŠã¶ã®ã»ãšãã©ã¯ã2çš®é¡ã®ã³ã³ããã¹ãã2dãïŒ2次å ã°ã©ãã£ãã¯ãäœæã§ããïŒãšãwebglãïŒWebGLãã¯ãããžãŒã䜿çšããŠ3次å ã°ã©ãã£ãã¯ãäœæã§ããïŒããµããŒãããŠããŸãã æå®ãããã³ã³ããã¹ãã¿ã€ãããã©ãŠã¶ã§ãµããŒããããŠããªãå ŽåãgetContextïŒïŒã¡ãœããã¯nullãè¿ããŸãã
äŸïŒç·ç»
<canvas id="myCanvas" width="600px" height="70px"></canvas> const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); context.beginPath(); context.moveTo(5, 5); context.lineTo(500, 60); context.lineWidth = 3; context.strokeStyle = '#b4241b'; context.stroke();
Webgl
WebGLã¯ããã£ã³ãã¹èŠçŽ ã䜿çšããŠã°ã©ãã£ãã¯ãäœæããå¥ã®æ°ãããã¯ãããžãŒã§ãã WebGLã§ã¯ãWebã³ã³ãã³ãã§OpenGL ES 2.0ã«åºã¥ãAPIã䜿çšããŠ3次å ã°ã©ãã£ãã¯ã¹ãã¬ã³ããªã³ã°ã§ããŸããã2次å ã°ã©ãã£ãã¯ã¹ã䜿çšããããšãã§ããŸãã
åã®å Žåãšåæ§ã«ãæç»ãéå§ããã«ã¯ãã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã ããã¯ãgetContextã¡ãœããã䜿çšããŠè¡ãããŸãã ã³ã³ããã¹ãã¿ã€ãã¯ãwebglãŸãã¯Experimental-webglã®ããããã§ãªããã°ãªããŸããã ãå®éš-webglããšåŒã°ããã³ã³ããã¹ãã¯ãä»æ§éçºããã»ã¹äžã«äœ¿çšãããã³ã³ããã¹ãã®äžæçãªååã§ãã
WebGLã¯ããããã©ã¹ã¿ãŒã°ã©ãã£ãã¯ã§åäœããŸããåã®æ®µèœã§èª¬æããæ©èœã¯ããã®ãã¯ãããžãŒã«ãé©çšã§ããŸãã ããããWebGLã¯ããŒããŠã§ã¢ã°ã©ãã£ãã¯ã¹ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšãããããWebGLã®ããã©ãŒãã³ã¹ã¯ïŒãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«å¹æµããïŒããé«ããšããç¹åŸŽããããŸãã
æè¡æ¯èŒ
ç¹å®ã®ãã¯ãããžãŒã®éžæã¯ãç¹å®ã®ãããžã§ã¯ãã®ç®çãšç®æšã«äŸåããŸãã ãããžã§ã¯ãã®1ã€ã§ã®ã¿ã¹ã¯ã¯ãå€æ°ã®ãã€ã³ãïŒçŽ10,000ãã€ã³ãïŒã§ã°ã©ããæç»ããããšã§ãããã°ã©ãã®ã¹ã±ãŒãªã³ã°ãšç§»åãããã³ãµãŒããŒäžã®ããŒã¿å€æŽã®å Žåã®ã°ã©ãã®åæç»ãå¯èœã§ãªããã°ãªããŸããã
ãã¯ãããžãŒãéžæããéã«èæ ®ãããæãéèŠãªãã©ã¡ãŒã¿ãŒã®1ã€ã¯ããã©ãŒãã³ã¹ã§ãã ãã®ãã©ã¡ãŒã¿ãŒã¯ããªããžã§ã¯ãã®æ°ãšè¡šé¢ç©ã«äŸåããŸãã äžè¬ã«ãç»é¢äžã®ãªããžã§ã¯ãã®æ°ãå¢ãããšããªããžã§ã¯ããDOMã¢ãã«ã«åŸã ã«è¿œå ãããã«ã€ããŠSVGã®ããã©ãŒãã³ã¹ãäœäžããŸããããã£ã³ãã¹ã®ããã©ãŒãã³ã¹ã¯ã»ãšãã©å€åããŸããã WebGLã®ããã©ãŒãã³ã¹ã¯éåžžã«åªããŠããŸãããææ°ã®ãã©ãŠã¶ãŒãã¹ãŠããã®ãã¯ãããžãŒããµããŒãããŠããããã§ã¯ãããŸãããããšãã°ãIEã¯ããŒãžã§ã³11ããã®ã¿webGLããµããŒããå§ããŸããã ã¢ãã€ã«ãã©ãŠã¶ãŒã§ã®WebGLã®ãµããŒãã¯éââåžžã«éãããŠãããã»ãšãã©ã®ã¢ãã€ã«ãã©ãŠã¶ãŒã¯2017幎ã«ã®ã¿WebGLããµããŒããå§ããŸããã çŸåšãäžéšã®ã¢ãã€ã«ãã©ãŠã¶ã¯ãã®ãã¯ãããžããŸã£ãããµããŒãããŠããŸããã
ãã©ãŠã¶ã«ããWebGLã®ãµããŒãã«å ããŠãã¯ã©ã€ã¢ã³ãGPUã«ããWebGLã®ãµããŒããå¿ èŠã§ãã äžéšã®ãã©ãŠã¶ã¯ãå€ãGPUãæèŒããããã€ã¹ã§WebGLãµããŒããç¡å¹ã«ããå ŽåããããŸãã ãããã®å¶éã®è©³çŽ°ã«ã€ããŠã¯ã ãã®èšäºãã芧ãã ããã
WebGLãã¯ãããžãŒã®äžååãªãµããŒãã®ããã以äžã®2ã€ã®ãã¯ãããžãŒã®ã¿ãèæ ®ãããŸãïŒcanvas 2dããã³svgã
å³1ãªããžã§ã¯ãã®æ°ïŒxïŒã«å¿ããã¬ã³ããªã³ã°æéïŒyïŒ
SVGã§ã®äœæ¥ã«ã¯DOMã§ã®å€ãã®æäœãå¿ èŠãªããããã®ãã¯ãããžãŒã¯ãããšãã°æ¥éã«å€åãã詳现ãªã°ã©ããäœæãããªã©ãéãã¢ãã¡ãŒã·ã§ã³ã«ã¯é©ããŠããŸããã
ãã ãããã£ã³ãã¹ã¯é«è§£å床ã®ç»é¢ã«ã¯ããŸãé©ããŠããŸããã äžã®ã°ã©ããããããããã«ãç»é¢ãµã€ãºã倧ãããªããšãåŠçãããã¯ã»ã«ãå¢ããããCanvasã®ããã©ãŒãã³ã¹ãäœäžããŸãã
å³2æç»é åã®é«ãïŒxïŒã«å¿ããã¬ã³ããªã³ã°æéïŒyïŒã
ãŸãããã£ã³ãã¹ã䜿çšããŠäœæããç»åãæ¡å€§ãããšãå質ãå€§å¹ ã«äœäžããããšã«ãçæããŠãã ããã 以äžã®å³ã¯ãsvgãšcanvasã§æãããç·ã瀺ããŠããŸãã
å³3ãºãŒã æã«SVGïŒäžïŒãšCanvasïŒäžïŒã䜿çšããŠæç»ãããç·
ãã£ã³ãã¹ãæäœãããšãã«çºçããå¯èœæ§ã®ããå¥ã®åé¡ã¯ãã€ãã³ãã远跡ããç»åå ã®ããŠã¹ãã€ã³ã¿ãŒã®äœçœ®ãç¹å®ããæ©èœãå¶éãããŠããããšã§ãã çµã¿èŸŒã¿API isPointInPathã䜿çšãããšãæå®ããããã€ã³ããæåŸã«æç»ããããã¹èŠçŽ ã«å«ãŸãããã©ãããå€æã§ããŸã*ã€ãã³ããéåžžã«å¿«é©ã«åŠçã§ãããµãŒãããŒãã£ã©ã€ãã©ãªããããŸãã
äžèšã®æ¬ ç¹ã«ãé¢ããããäž»ã«å€æ°ã®ãªããžã§ã¯ããã¬ã³ããªã³ã°ãããšãã«svgãšæ¯èŒããŠããã©ãŒãã³ã¹ãé«ããããcanvasã䜿çšããããšã決å®ãããŸããã
*åŸã§åå©çšã§ãããã¹ãäœæããããã«äœ¿çšã§ããå®éšçãªPath2Dã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã ããšãã°ããã®ãªããžã§ã¯ãã¯ãisPointInPathã¡ãœããã®æåã®åŒæ°ãšããŠæž¡ãããšãã§ããŸãã ãã®ãã¯ãããžãŒã¯çŸåšãFirefoxãGoogle Chromeãããã³Operaã§ãµããŒããããŠããŸãã
Canvasã䜿çšããæ©èœ
ãã£ã³ãã¹ã䜿çšããå Žåãæåã«èæ ®ãã¹ãããšã¯ãã©ã¹ã¿ãŒã€ã¡ãŒãžã䜿çšããããšã§ãã ãŸã第äžã«ãããã¯ãæç»é åã®ãµã€ãºãå€æŽãããšïŒããšãã°ããŠã£ã³ããŠã®ãµã€ãºãå€æŽãããšïŒããã£ã³ãã¹äžã®ç»åãæ¡å€§çž®å°ããæªã¿ãšå質ã®äœäžã«ã€ãªããããšãæå³ããŸãã 次ã®å³ã§ã¯ãæåã®ã±ãŒã¹ã§ã¯ããã£ã³ãã¹èŠçŽ ã®å¹ ãšé«ãã®cssããããã£ã¯ãæåã«æå®ããã察å¿ããå±æ§ã®2åã§ãã åãã°ã©ããã¹ã±ãŒãªã³ã°ãªãã§ãã®æšªã«è¡šç€ºãããŸãã ãã®ãããªåé¡ãåé¿ããã«ã¯ããŠã£ã³ããŠã®ãµã€ãºãå€æŽãããšãã«ããã£ã³ãã¹èŠçŽ ã®å¹ ãšé«ãã®å±æ§ã«å¿ èŠãªå€ãèšå®ããçŸåšã®ã·ãŒã³ãæ°ãããµã€ãºã§åæç»ããŸãã
åæ§ã®åé¡ã¯ããã¯ã»ã«å¯åºŠãé«ãç»é¢ã§äœæ¥ãããšãã«çºçããå¯èœæ§ããããŸãã ãã£ã³ãã¹äžã®ç»åããŒãããŠèŠããå ŽåããããŸãã ãã®çç±ã¯ãç©çãã¯ã»ã«ã§ã®ãã£ã¹ãã¬ã€ã®è§£å床ãšè«çïŒCSSïŒãã¯ã»ã«ã§ã®è§£å床ã®éãã§ãã ããã2ã€ã®å€ã®æ¯çã¯ãwindow.devicePixelRatioããããã£ã䜿çšããŠååŸã§ããŸãã ããšãã°ãdevicePixelRatioã2ã®å Žåããã£ã³ãã¹ã®ç©çãã¯ã»ã«ã®å¹ ã¯è«çãã¯ã»ã«ã®å¹ ïŒwidthå±æ§ã§æå®ïŒã®2åã«ãªããŸãã ã€ãŸããæåã®ã±ãŒã¹ãšåãå¹æãåŸãããŸãã ãã®åé¡ã解決ãã1ã€ã®æ¹æ³ã¯ãdevicePixelRatioã®å€ã®ã¹ã¿ã€ã«ããã倧ãããã£ã³ãã¹å±æ§ã®å€ãæå®ããããšã§ãã
äŸïŒ
canvas.width = canvasWidth * window.devicePixelRatio; canvas.height = canvasHeight * window.devicePixelRatio; canvas.style.width = canvasWidth + 'px'; canvas.style.height = canvasHeight + 'px';
ãã®å Žåãã¬ã³ããªã³ã°æã«ãç·ã®å€ªãããã©ã³ããµã€ãºãªã©ã®å€ãdevicePixelRatioã®å€ã ãæžå°ããããšãèæ ®ããå¿ èŠããããŸãã ãããã£ãŠããã©ã³ããµã€ãºãèšå®ãããšãã¯ããã¯ã»ã«å¯åºŠãå¢å ãããã£ã¹ãã¬ã€äžã§ããã¹ããå°ããããªãããã«ãdevicePixelRatioãæããå¿ èŠããããŸãã
ãã£ã³ãã¹ã®æé©åïŒ
ãã£ã³ãã¹ãæäœããéã®æãé«äŸ¡ãªæäœã®1ã€ã¯ããã€ã³ãã§ãã ãããã£ãŠã倧ããªç»åãåæç»ããªãããã«ããããšããå§ãããŸãã
ãããè¡ã1ã€ã®æ¹æ³ã¯ããã£ã³ãã¹èŠçŽ ãè€æ°ã®ã¬ã€ã€ãŒã«é©çšããããšã§ãã ããã«ãããã·ãŒã³å šäœã§ã¯ãªããã·ãŒã³ã®å¿ èŠãªéšåã®ã¿ãåæç»ã§ããŸãã
äŸïŒ2ã€ã®ã¬ã€ã€ãŒã§ã®ãã£ã³ãã¹èŠçŽ ã®é 眮ïŒ
<canvas id="bg" width="640" height="480" style="position: absolute; z-index: 0"></canvas> <canvas id="fg" width="640" height="480" style="position: absolute; z-index: 1"></canvas>
ã¬ã³ããªã³ã°ã«è²»ããããæéãççž®ããå¥ã®æ¹æ³ã¯ãæµ®åå°æ°ç¹åº§æšãæŸæ£ããŠæŽæ°åº§æšã䜿çšããããšã§ãã ãã£ã³ãã¹èŠçŽ ã§åæ°åº§æšã䜿çšããå Žåããµããã¯ã»ã«ã¬ã³ããªã³ã°ã䜿çšãããŸãã ããã¯ãå¹³æ»åå¹æãäœæããããã«ãè¿œå ã®èšç®ãå®è¡ããããšããäºå®ã«ã€ãªãããŸãã
ãã£ã³ãã¹èŠçŽ ãæé©åããã«ã¯å€ãã®æ¹æ³ããããŸãã ãããã®æå¹æ§ã¯ããããžã§ã¯ãã®æ©èœãšæãŸããçµæã«äŸåããŸãã ãã®èšäºã§ã¯ãããŸããŸãªæé©åã¢ãããŒãã«ã€ããŠè©³ããèªãããšãã§ããŸãã
ãããã«
SVGã¯ãéçç»åãã€ã³ã¿ã©ã¯ãã£ãã°ã©ãã£ãã¯ã¹ã®é«å質ã§è€éãªãã¯ã¿ãŒããã¥ã¡ã³ãïŒããšãã°ãå³é¢ãå³ïŒã®äœæã«é©ããŠããŸãã ãããããªããžã§ã¯ãã®æ°ãå¢ãããšãã¬ã³ããªã³ã°é床ãå€§å¹ ã«äœäžããããšãèæ ®ãã䟡å€ããããŸãã canvasèŠçŽ ã䜿çšãããšãç»é¢äžã«ç»åããã°ããæç»ã§ããŸãããã®ããããã®ãã¯ãããžãŒã¯è€éãªã·ãŒã³ãã¢ãã¡ãŒã·ã§ã³ããªã¢ã«ã¿ã€ã ã§è¡šç€ºããã®ã«é©ããŠããŸãã Canvasã䜿çšããŠãããŸããŸãªèŠèŠå¹æãè€éãª3Dã·ãŒã³ãäœæã§ããŸãã ãããããã®æè¡ã䜿çšããå Žåãç»åãŸãã¯ã°ã©ããã€ã³ã¿ã©ã¯ãã£ãã«ããããšã¯éåžžã«å°é£ã§ãã