Menu Family: Basic Menu From Markup
メニューに入る。
Exampleのトップページ(リンクはこちら)の内容はExampleの方でフォローできそうなので、いくつかポイントだけ抑えておく。
1つは、YAHOO.widget.MenuオブジェクトがYAHOO.widget.Overlayのサブクラスということ。
このOverlayという名前の得たいの知れないクラスのAPIドキュメント(リンクはこちら)を見てみると、 YAHOO.widget.Panel(Containerででてくるのかな?)やYAHOO.widget.Tooltipも、これのサブクラスになっている。特に、
Overlayはページ・フロー上で絶対位置を決めるためのモジュールである。ポジショニングや、サイジング、zインデックス、viewpointのあわせてOverlayを制約するのに、便利なメソッドを持っている。Overlayは、その(Z軸上で)下にダイナミックに生成されるIFRAMEをもっている(IE6,5用)。
とか書いてあって興味深い。bringToTop()やcenter()というメソッドが定義されているのと同時に、位置や形状を変化されたときのイベントハンドラーの定義などできる様子。
以前に「Yahoo! UI Library: TreeViewで今風(いまふう)のメニューをつくるには」で作ったように、Menuを作るにはZ軸とポジションの操作が不可欠。こういうオブジェクトが(やっぱり)あるのですね。
Menuには、他に
があって、これらはYAHOO.widget.Menuのサブクラスだから、当然、上のメソッドをinheritateしているか、もしくはoverrideしている。
Menuを形成する各項目は、YAHOO.widget.MenuItem(APIドキュメントはこちら)。
このような構成でMenuが生成される。(だいぶ、YUIの読み方が分かってきた気がする)
他の事項は、Exampleを通じてフォローできそうな感じなので、ここでは割愛する。
一番最初の例は、Body内に記述されたMarkupからMenuを構成する例である。
TabViewをMarkupから作ったときにあったような、「決まりごと」については、調べて、ソースコード(後述)にコメントした。
サンプルの初期画面は以下
「Menuを表示」ボタンを押すを、以下のような、超簡単なメニューが現れる(Basic Menuといわれる所以?)。
YUIのサンプルでは、画面のセンターに表示されるようになっているが、出現位置をかえてみた。
以下にHTMLの全文を示す。
<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/menu/assets/skins/sam/menu.css" /> <script type="text/javascript" src="scripts/yui/yahoo-dom-event/yahoo-dom-event.js"></script> <script type="text/javascript" src="scripts/yui/container/container_core-min.js"></script> <script type="text/javascript" src="scripts/yui/menu/menu-min.js"></script> <style type="text/css" id="defaultstyle"> #container { margin: 2px; padding: 3px; width: 400px; height: auto; border:1px dashed #999999; } /* IE7とFF3でテストしている限りでは関係なさそう。 Position and hide the Menu instance to prevent a flash of unstyled content when the page is loading. div.yuimenu { position: absolute; visibility: hidden; } Set the "zoom" property to "normal" since it is set to "1" by the ".example-container .bd" rule in yui.css and this causes a Menu instance's width to expand to 100% of the browser viewport. div.yuimenu .bd { zoom: normal; } やっぱり,IE7はCtl+でzoomするとスタイルがずれていく。 */ </style> <script type="text/javascript"> //モジュールパターンで実装する。 YAHOO.namespace("EGP"); YAHOO.EGP.MarkupMenu = function() { var oMenu; return{ init: function() { // Muneのインスタンス生成 // コンストラクタの第1引数は、menuを構成するdivのid、 // 第2引数は、属性を表すオブジェクトリテラル // 属性はMenuのAPIドキュメント // http://developer.yahoo.com/yui/docs/YAHOO.widget.Menu.html oMenu = new YAHOO.widget.Menu("basicmenu", { xy: [300,45] } ); // YAHOO.widget.Menuのメソッドrenderを呼んで、レンダリング。 oMenu.render(); // Bottunのクリックイベントにメニューの表示(show)を仕掛ける。 // EventのAPIはhttp://developer.yahoo.com/yui/docs/YAHOO.util.Event.html // 第4引数は、ハンドラーへの引数、第5引数は実行scope. YAHOO.util.Event.addListener( "menubutton", "click", oMenu.show, null, oMenu ); } }; }(); //DOMが完全にloadされたら、サンプルを初期化する。 YAHOO.util.Event.onDOMReady( //DomReadyイベントで発火するハンドラ YAHOO.EGP.MarkupMenu.init, //ハンドラに渡すオブジェクト(関数) YAHOO.EGP.MarkupMenu, //ハンドラは、上記のオブジェクトのスコープをもつ。 true ); </script> </HEAD> <!-- class=" yui-skin-sam"の指定が必要 --> <BODY class="yui-skin-sam"> <div id="container"> <p> Body内のマークアップからMenuを作成します。 </p> <!-- Toggle Buttonを作るdiv <button id="menutoggle" type="button">Menuを表示</button> ここのidは自由。 --> <button id="menubutton" type="button">Menuを表示</button> <!-- Menuを作るdiv --> <!-- このdivのclassは変えてもOK --> <div id="basicmenu" class="yuimenu"> <!-- class="bd"はbodyを表す(変更不可) --> <div class="bd"> <!-- ulのclassは変えてもOK --> <ul class="first"> <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://mail.yahoo.com"> Yahoo! Mail</a></li> <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://addressbook.yahoo.com"> Yahoo! Address Book</a></li> <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://calendar.yahoo.com"> Yahoo! Calendar</a></li> <li class="yuimenuitem"><a class="yuimenuitemlabel" href="http://notepad.yahoo.com"> Yahoo! Notepad</a></li> </ul> </div> </div> </div> </BODY> </HTML>