DD; Staying in a Region

この例(Staying in a Region)は、タイトルが示すとおり、以下の図がにある小さい矩形が、同色のキャンバス(canvas)の中だけしか動けない、というものである。


サンプルソースは、意外と地道にかかれていて、キャンバス内を動く要素は、YAHOO.util.DDを継承して作成されている。
この動きに制約を与えているのが、DDにあるDD.setXConstraint()とDD.setYConstraint()の2つのメソッドである。これは、DDインスタンスのX軸、Y軸それぞれの方向への動きを制限するものである。(DDのAPIドキュメントはこちら)

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>Ajax_Sampling</TITLE>
<style type="text/css"> 
.dd-demo {
    position: relative;
    text-align: center;
    color: #fff;
    cursor: move;
    height: 60px;
    width: 60px;
    padding: 0;
    margin: 0;
}

.dd-demo div {
    border: 1px solid black;
    height: 58px;
    width: 58px;
}

#dd-demo-canvas1 {
    padding: 55px;
    background-color: #7E5B60;
    border: 1px solid black;
}
#dd-demo-canvas2 {
    padding: 25px;
    background-color: #566F4E;
    border: 1px solid black;
}
#dd-demo-canvas3 {
    padding: 15px;
    background-color: #6D739A;
    border: 1px solid black;
}

#dd-demo-1 { 
    background-color:#6D739A;top:5px; left:5px;
}

#dd-demo-2 { 
    background-color:#566F4E;top:50px; left:100px;
}

#dd-demo-3 {
    background-color:#7E5B60;top:-100px; left:200px;
}

</style>

<!-- 読み込むjs --> 
<script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js" >
</script> 
<script type="text/javascript" src="scripts/yui/dragdrop/dragdrop-min.js" >
</script> 

<script type="text/javascript">
var Dom = YAHOO.util.Dom,
Event = YAHOO.util.Event,
dd1, dd2, dd3;

// DDRegion作成の準備
YAHOO.example.DDRegion = function(id, sGroup, config) {
	this.cont = config.cont;
	YAHOO.example.DDRegion.superclass.constructor.apply(this, arguments);
};

//YAHOO.util.DDを継承して、DDRegionを作る。
YAHOO.extend(YAHOO.example.DDRegion, YAHOO.util.DD, {
	// contは呼び出し時に上書きされる。
	cont: null,
	init: function() {
    	// スーパークラスのinitを呼ぶ。
    	YAHOO.example.DDRegion.superclass.init.apply(this, arguments);

    	this.initConstraints();
    	
    	// windowがresizeされたらinirConstraintsをよぶEventを仕掛ける。
    	Event.on(window, 'resize', function() {
        	this.initConstraints();
    	}, this, true);
	},
	
	initConstraints: function() {
		// cont(canvas)の領域(top,right,bottom,left)を求める。
    	var region = Dom.getRegion(this.cont);

    	//この(DDRegion)インスタンスの要素オブジェクトの取り出し。
    	var el = this.getEl();

    	//座標(x=right、topを取り出す)
    	var xy = Dom.getXY(el);

    	//DDインスタンスの幅、高さを10進整数としてパースする。
    	var width = parseInt(Dom.getStyle(el, 'width'), 10);
    	var height = parseInt(Dom.getStyle(el, 'height'), 10);

    	//DDインスタンスのX(left)-canvasのleft値(leftとして動けるpix)
    	var left = xy[0] - region.left;

    	//canvasのright値-(DDインスタンスのleft値+インスタンスの幅)
    	//DDインスタンスがrightへ動ける距離
    	var right = region.right - xy[0] - width;

    	//Set top to y minus top
    	//DDインスタンスのY(top)-canvasのtop値(topとして動けるpix)
    	var top = xy[1] - region.top;

    	//Set bottom to bottom minus y minus height
    	//canvasのbottom値-(DDインスタンスのtop値+インスタンスの高さ)
    	//DDインスタンスがbotomへ動ける距離
    	var bottom = region.bottom - xy[1] - height;

    	//DD.setXConstraint(),DD.setYConstraint()を使って動きに
    	//制約(Constraint)を与える
    	//X軸に沿っては(上で求めたleftとrightの間を動ける)
    	this.setXConstraint(left, right);
    	//Y軸に沿っては(上で求めたtopとbottomの間を動ける)
    	this.setYConstraint(top, bottom);
	}
});


Event.onDOMReady(function() {
	// DDRegionのプロパティーcontを上書きする呼び出し。
	dd1 = new YAHOO.example.DDRegion('dd-demo-1', '', 
			{ cont: 'dd-demo-canvas3' });
	dd2 = new YAHOO.example.DDRegion('dd-demo-2', '', 
			{ cont: 'dd-demo-canvas2' }) ;
	dd3 = new YAHOO.example.DDRegion('dd-demo-3', '', 
			{ cont: 'dd-demo-canvas1' });
});

</script>
</HEAD>

<BODY>
<div id="dd-demo-canvas1">
    <div id="dd-demo-canvas2">
        <div id="dd-demo-canvas3">
            <div id="dd-demo-1" class="dd-demo"><div>1</div></div>
            <div id="dd-demo-2" class="dd-demo"><div>2</div></div>
            <div id="dd-demo-3" class="dd-demo"><div>3</div></div>
        </div>
    </div>
</div>
</BODY>
</HTML>

次にある、Using the Drag Shimのサンプリングは省略する。