Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

8. ダイナミックSVG4

2006.01.13 株式会社四次元データ 藤本将光

前章では、animate要素によるアニメーションを説明しましたが、本章では、JavaScriptとDOMの組み合わせによるアニメーションの解説を行います。

8.1. JavaScriptアニメーション

JavaScriptアニメーションは、SVG文書内において、JavaScriptとDOMを組み合わせることによって、アニメーション化させることができます。

スクリプトの書き方を以下に示します。

・<script>部分に処理を定義した関数を書き、それをsvg要素中に書くことによって、イベントに対応した処理を行わせることができます。

 (例) <svg width="300" height="300">
     <script> 
      <![CDATA[
         function click_transform(evt) 
           {
             ・・・・・・・・・・         
          }
       ]]> 
     </script>
       <rect onclick="click_transform(evt)" ・・・・ />
       </svg>

この例では、矩形がクリックされると、スクリプト内で定義されたclick_transform(evt)関数が呼び出され、実行されます。

・簡単な処理の場合は、svg要素中に直接スクリプトを書くことも可能です。

 (例) <svg width="300" height="300">
        <circle・・・・ onclick="evt.target.setAttribute('fill', 'green')”/>
       </svg>

ここでは、円がクリックされたとき、円が緑色に塗りつぶされます。

では、実際のサンプルを見てみましょう。
円をドラックしてみて下さい。

(サンプル)

この例では、円をドラックすることによって移動することができます。動いているときは、赤色になり、止まると青色に戻ります。

 (サンプルのソース)
 <svg width="600" height="300" onload="DoOnLoad(evt)">
 <script>
  <![CDATA[
    var dragger;
    var circleX;
    var circleY;
    var oldX;
    var oldY;
    function DoOnMouseOver(evt){}
    function DoOnMouseOut(evt){}
    function DoOnLoad(evt) {}
    function DoOnMouseDown(evt) {
        var onObject = evt.getTarget();
        if( onObject.getAttribute("id") == "bg"){
        }else{
          dragger = onObject;
          setOld(evt,dragger); ・・・ (1)
             } 
     }    
    function setOld(evt,dragger){
      oldX = evt.getClientX();
      oldY = evt.getClientY();
     }    
    function getDiff(evt){
      var difX =  evt.getClientX() - oldX;
      var difY =  evt.getClientY() - oldY;
      setOld(evt);
      return "translate("+difX+" "+difY+")";
     }
    function DoOnMouseUp(evt) {
      if(dragger != null)
       {
      dragger.getStyle().setProperty("fill", "blue"); ・・・ (2)
      dragger = null;
       }
      }
    function DoOnMouseMove(evt) {
      if(dragger == null){
        return;
      }      
      dragger.setAttribute("transform",dragger.getAttribute("transform") + getDiff(evt)); ・・・ (3)
      dragger.getStyle().setProperty("fill", "red"); ・・・ (4)
    }
    
   ]]></script>
   <g onmousedown="DoOnMouseDown( evt )" onmouseup="DoOnMouseUp( evt )" onmousemove="DoOnMouseMove( evt )" >
     <rect id="bg" x="0" y="0" width="3000" height="2500" fill="yellow"/>
     <circle id="circle" cx="300" cy="150" r="25"  fill="blue"/>
   </g>
 </svg>

上記の例では、以下のDOMを使用しています。

  • getTarget();イベントのターゲットを指定する
  • getElementById();id属性を指定し、特定の要素を取得する
  • getAttribute();オブジェクトの属性を取得する
  • setAttrubute();オブジェクトに属性を与える
  • getClientX();カーソルの現在のX座標を取得する
  • getClientY();カーソルの現在のY座標を取得する
  • setProperty():オブジェクトの属性値を設定する

(1)で円上でカーソルが押されたとき、その座標をsetOld関数によって取得します。
(3)では、カーソルが動いているとき、getDiff関数によって得られた座標の変化分を円の座標値に加えることによって、円の座標を変化させ、移動させています。
(2)で、円上をカーソルが押されていないときには、青色で塗りつぶすことを指定し、(4)で、円が移動しているときは、赤色で塗りつぶすことを指定しています。



前のページへ TECHSCOREのTOPページへ 次のページへ
techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa