Container Family: Simple Panel Example

このExampleはシンプルなYAHOO.widget.Panelの例。
Panelというよりも、PopupしないWindowといった方がいいかもしれない。
YUIの説明に、「OSのWindowに似た振る舞い」と書かれている。
この意味を正確にいえば、OSという枠の中で発生して制御されるWindowという意味で、このPanelもBrowserの一つのWindowという枠の中で発生して制御される、という意味である。したがって、Browserの新規Windowsや新規タブを起動するという意味ではない。

YAHOO.widget.PanelはYAHOO.widget.Overlayのサブクラスであるが、

  • Modality
  • Drag and Drop
  • Colseボタン
  • Style

といった機能が付加されている。(YAHOO.widget.PanelのAPIドキュメントはこちら

以下は、サンプルの初期画面。PanelもMarkupからの生成と、Javascriptでの生成が可能で、その2つの例が示されている(panel1が前者、panel2が後者)。

以下が、2つの画面を開いた時の画面である。Panelのボディー部にコンフィグ属性の指定値をtebleで表示するようにした。panel1を動かしてみると、showした順にかかわらずpanel1のZ軸が小さいことがわかる。また、Panelは起動時にそれぞれ1回だけインスタンス化されるので、panel1を閉じると、再度、開いた場合には閉じた位置にWindowが表示される。

以下がJavascriptを含む、HTMLの全文である。
Panelのインスタンス生成時に、constraintoviewportをtrueに設定すると、表示されているWindow内だけにPanelの移動が制限される。これがfalseの場合、Panelの動きにあわせてページがフローする(スクロールなど)ようになる。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Ajax_Sampling</TITLE>
<style type="text/css">
body {
	margin:0;
	padding:0;
}
</style>

<link rel="stylesheet" type="text/css" href="scripts/yui/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="scripts/yui/container/assets/skins/sam/container.css" />
<!-- Draggableなパネルのため -->
<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" src="scripts/yui/container/container-min.js"></script>

<style type="text/css" id="defaultstyle">
#main {
	margin: 2px;
	padding: 3px;
	width: 400px;
	height: auto;
	border:1px dashed #999999;
}
/*
#container {
	height:15em;
}
*/

</style>

<script type="text/javascript">
//
// モジュールパターンで実装する。
//
YAHOO.namespace("example.container");

// YAHOO.example.containerにSimplePanelを追加する。
YAHOO.example.container.SimplePanel = function() {
	var Event = YAHOO.util.Event;
	var Dom = YAHOO.util.Dom;
	var panel1,panel2;
		
	return{
    	init: function() {

			// id=panel1のMarkupから生成する。
			panel1 = new YAHOO.widget.Panel("panel1", 
					{ 	width:"320px", 
						visible:false, 
						// constraintoviewport:trueとすると、viewpoint内しかドラッグできない。
						// falseとすると、viewpoint外までドラッグできる。Dragによって画面がスクロールする。
						constraintoviewport:true 
					} );
			// id=panel1のMarkupが存在するので、引数は不要。
			panel1.render();

			// Scriptからdynamicに生成して、id=panel2とする。
			panel2 = new YAHOO.widget.Panel("panel2", 
					{ 	width:"320px", 
						visible:false, 
						draggable:false, 
						close:false 
					} );
			panel2.setHeader("Panel #2のheader: このPanelはDraggableではない");
			panel2.setBody("Scriptで生成したPanel<br/>"+
							'<table border="1">'+
							"<tr><td>パラメータ</td><td>値</td></tr>"+ 
							"<tr><td>visible</td><td>false</td></tr>"+ 
							"<tr><td>draggable</td><td>false</td></tr>"+
							"<tr><td>close</td><td>false</td></tr>"+
							"</table>"
							);
			panel2.setFooter("Panel #2のfooter");
			// id=panel1のMarkupが存在しないので、renderingする場所(div)を指定
			// div id=containerにappendされる。
			panel2.render("container");

			// Listnerの設定
			Event.addListener(	
							"show1", 
							"click", 
							panel1.show, 
							panel1, 
							true
						);
			Event.addListener(	
							"hide1", 
							"click", 
							panel1.hide, 
							panel1, 
							true
						);

			Event.addListener(	
							"show2", 
							"click", 
							panel2.show, 
							panel2, 
							true
						);
			Event.addListener(	
							"hide2", 
							"click", 
							panel2.hide, 
							panel2, 
							true
						);
		}
	};
}();

//DOMが完全にloadされたら、サンプルを初期化する。
YAHOO.util.Event.onDOMReady(
		//DomReadyイベントで発火するハンドラ
		YAHOO.example.container.SimplePanel.init,
		//ハンドラに渡すオブジェクト(関数)
		YAHOO.example.container.SimplePanel,
		//ハンドラは、上記のオブジェクトのスコープをもつ。   
		true
);

</script>
</HEAD>

<!-- class=" yui-skin-sam"の指定が必要 -->
<BODY class="yui-skin-sam">
<div id="main">
<p>
YAHOO.widget.Panelのサンプルです。
</p>
<div id="container">
	<div>
		<button id="show1">Show panel1</button> 
		<button id="hide1">Hide panel1</button>

	</div>
	
	<div id="panel1">
		<!-- classの指定が大事 -->
		<div class="hd">Panel #1 : このPanelはDraggable</div>
		<div class="bd">Markupから生成したPanel<br/>
						<table border="1">
						<tr><td>パラメータ</td><td></td></tr> 
						<tr><td>visible</td><td>false</td></tr> 
						<tr><td>constraintoviewport</td><td>true</td></tr>
						</table>
		</div>
		<div class="ft">Panel #1のfooter</div>
	</div>

	
	<div>
		<button id="show2">Show panel2</button> 
		<button id="hide2">Hide panel2</button>
	</div>
</div>

</div>
</BODY>
</HTML>