デモ
とりあえずデモを作ってみました。Firefox 8で開いて、右クリックしてみてください。
※この記事は、Firefox8リリース直後に書きました。 現段階では、menuタグの仕様は確定されていません。当然今後変更になる可能性がありますので、ご注意ください。
menuタグの使い方
基本的な使い方は、以下のようになります。メニュータグをコンテキストメニューとして認識させるには、type=contextを指定し、右クリックの対象となる任意の要素のcontextmenu属性として、メニューのIDを指定することで、関連付けが行われます。メニュー項目の定義には、menuitem要素を使います。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>コンテキストメニューデモ</title> </head> <body> <div contextmenu="supermenu" style="background:#efefef; padding: 100px;"> Firefox8でこの文字の上で右クリックしてください。 </div> <menu type="context" id="supermenu"> <menuitem label="カスタムメニュー1" onclick="alert('カスタムメニュー1');"></menuitem> <menuitem label="カスタムメニュー2" onclick="alert('カスタムメニュー2');"></menuitem> </menu> </body> </html>
アイコンを変更する
メニュー項目のアイコンを設定するには、menuitemタグのicon属性に画像のパスを指定します。この記事のデモでは、16x16のPNGアイコンを使用しています。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>コンテキストメニューデモ</title> </head> <body> <div contextmenu="supermenu" style="background:#efefef; padding: 100px;"> Firefox8でこの上で右クリックしてください。 </div> <menu type="context" id="supermenu"> <menuitem label="カスタムメニュー1" onclick="alert('カスタムメニュー1');" icon="arrow-circle.png"></menuitem> <menuitem label="カスタムメニュー2" onclick="alert('カスタムメニュー2');" icon="arrow-circle.png"></menuitem> </menu> </body> </html>
ネストしたメニューを作る
ネストしたメニューを作るには、menuタグの中にmenuタグを書きます。簡単ですね。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>コンテキストメニューデモ</title> </head> <body> <div contextmenu="supermenu" style="background:#efefef; padding: 100px;"> Firefox8でこの上で右クリックしてください。 </div> <menu type="context" id="supermenu"> <menuitem label="カスタムメニュー1" onclick="alert('カスタムメニュー1');" icon="arrow-circle.png"></menuitem> <menuitem label="カスタムメニュー2" onclick="alert('カスタムメニュー2');" icon="arrow-circle.png"></menuitem> <menu label="ネストしたメニュー"> <menuitem label="メニュー1" icon="arrow-circle.png" onclick="alert('メニュー1')"></menuitem> <menuitem label="メニュー2" icon="arrow-circle.png" onclick="alert('メニュー2')"></menuitem> </menu> </menu> </body> </html>
動的にメニューを追加する
英辞郎 on the WEBでやっている方法を参考にしました。contextmenuイベントを使うことで、現在のコンテキストにあわせてメニューを追加したりできるみたいです。イベントハンドラ内では、必ずtrueを返さなければ、メニューが表示されないことに注意してください。
※jQueryを使ってやっていますが、jQueryでなければならない理由はありません。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>コンテキストメニューデモ</title> <script type="text/javascript" src="/js/jquery.js"></script> <script type="text/javascript"> $(function() { $('#container').bind('contextmenu', function() { var text = window.getSelection().toString(); if (text != '') { $('#searchMenu').attr('label', "\""+text+"\"を検索する"); $('#searchMenu').removeAttr('disabled'); } else { $('#searchMenu').attr('label', "検索する"); $('#searchMenu').attr('disabled', 'disabled'); } return true; }); }); </script> </head> <body> <div contextmenu="supermenu" id="container" style="background:#efefef; padding: 100px;"> Firefox8でこの文字を選択して右クリックしてください。 </div> <menu type="context" id="supermenu"> <menuitem id="searchMenu" label="" onclick="alert('検索します!');" icon="arrow-circle.png"></menuitem> </menu> </body> </html>
こちらからデモを見ることができます。JavaScriptと組み合わせるといろいろできそうですね。
まとめ
結構簡単ですね。メニュークリック時にJavaScriptも実行できるようなので、いろいろ補助的な機能を実装するのに使えそうです。
ただこのmenuタグですが、HTML5仕様の策定段階らしく、最終決定した仕様ではありません。Firefox8の独自仕様となる可能性もあります。
個人的には、ブログサイトなどで、「つぶやく」「ブクマする」みたいな共有メニューをコンテキストメニューとして表示させるのが流行るんじゃないかと思っています。
コメント