iPhone & iPadのナビゲーションとして使用されている、メニューリストをクリックすると、
スライドして次のリストが現れるメニューUI。
Webサイト上でもこれを使って、メニューを構成するのもおもしろいかと思い、
jQueryで実験的につくってみました。
まずはサンプルから。
リスト内の「▲(右向き)」が付いているものをクリックすると、次のリスト一覧がスライドして現れます。
スライド後は前のリストに戻るための「≪ BACK」を配置。
このサンプルのHTMLソースは以下のような記述。
◆HTML <div id="ip_menu"> <ul id="parent"> <li><a href="#">≫CONTENTS 01</a> <ul> <li><a href="#">≫SECOND CONTENTS 01</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a> <ul> <li><a href="#">≫FORTH CONTENTS 01</a> <ul> <li><a href="#">≫FIVE CONTENTS 01</a></li> <li><a href="#">≫FIVE CONTENTS 02</a></li> <li><a href="#">≫FIVE CONTENTS 03</a></li> <li><a href="#">≫FIVE CONTENTS 04</a></li> <li><a href="#">≫FIVE CONTENTS 05</a></li> </ul> </li> <li><a href="#">≫FORTH CONTENTS 02</a> <ul> <li><a href="#">≫FIVE CONTENTS 01</a></li> <li><a href="#">≫FIVE CONTENTS 02</a></li> </ul> </li> <li><a href="#">≫FORTH CONTENTS 03</a></li> <li><a href="#">≫FORTH CONTENTS 04</a></li> </ul> </li> <li><a href="#">≫THIRD CONTENTS 02</a> <ul> <li><a href="#">≫FORTH CONTENTS 01</a></li> <li><a href="#">≫FORTH CONTENTS 02</a></li> <li><a href="#">≫FORTH CONTENTS 03</a></li> </ul> </li> <li><a href="#">≫THIRD CONTENTS 03</a> <ul> <li><a href="#">≫FORTH CONTENTS 01</a></li> <li><a href="#">≫FORTH CONTENTS 02</a></li> </ul> </li> <li><a href="#">≫THIRD CONTENTS 04</a> <ul> <li><a href="#">≫FORTH CONTENTS 01</a></li> </ul> </li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 02</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> <li><a href="#">≫THIRD CONTENTS 03</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 03</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> </ul> </li> </ul> </li> <li><a href="#">≫CONTENTS 02</a> <ul> <li><a href="#">≫SECOND CONTENTS 01</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> <li><a href="#">≫THIRD CONTENTS 03</a></li> <li><a href="#">≫THIRD CONTENTS 04</a></li> <li><a href="#">≫THIRD CONTENTS 05</a></li> <li><a href="#">≫THIRD CONTENTS 06</a></li> <li><a href="#">≫THIRD CONTENTS 07</a></li> <li><a href="#">≫THIRD CONTENTS 08</a></li> <li><a href="#">≫THIRD CONTENTS 09</a></li> <li><a href="#">≫THIRD CONTENTS 10</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 02</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 03</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> <li><a href="#">≫THIRD CONTENTS 03</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 04</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> <li><a href="#">≫THIRD CONTENTS 03</a></li> <li><a href="#">≫THIRD CONTENTS 04</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 05</a></li> <li><a href="#">≫SECOND CONTENTS 06</a></li> <li><a href="#">≫SECOND CONTENTS 07</a></li> <li><a href="#">≫SECOND CONTENTS 08</a></li> </ul> </li> <li><a href="#">≫CONTENTS 03</a> <ul> <li><a href="#">≫SECOND CONTENTS 01</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> <li><a href="#">≫THIRD CONTENTS 03</a></li> <li><a href="#">≫THIRD CONTENTS 04</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 02</a> <ul> <li><a href="#">≫THIRD CONTENTS 01</a></li> <li><a href="#">≫THIRD CONTENTS 02</a></li> <li><a href="#">≫THIRD CONTENTS 03</a></li> <li><a href="#">≫THIRD CONTENTS 04</a></li> </ul> </li> <li><a href="#">≫SECOND CONTENTS 03</a></li> <li><a href="#">≫SECOND CONTENTS 04</a></li> </ul> </li> <li><a href="#">≫CONTENTS 04</a> <ul> <li><a href="#">≫SECOND CONTENTS 01</a></li> <li><a href="#">≫SECOND CONTENTS 02</a></li> <li><a href="#">≫SECOND CONTENTS 03</a></li> <li><a href="#">≫SECOND CONTENTS 04</a></li> </ul> </li> <li><a href="#">≫CONTENTS 05</a></li> </ul> </div><!--/ip_menu-->
無駄に長くなっていますが、HTML側は基本的にリストの入れ子にするのみです。
上に書いた「▲(右向き)」や「≪ BACK」ボタンはリストが入れ子になることで自動で付加されます。
全体を囲う<div>及び<ul>のIDの名前は任意ですが、
SCRIPT側で使用するので、変更する際はSCRIPTの変更も必要になります。
そしてSCRIPTの記述は以下のように。
◆SCRIPT
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('#ip_menu ul li ul').hide();
$('li:has(ul) > a').each(function(){
$(this).append('<span>►</span>');
$(this).parent('li').children('ul').prepend('<li><a href="javascript:void(0);" class="ip_back">≪ BACK</a></li>');
});
var areaWidth = 300;
var areaHeight = 300;
$('#ip_menu').css({width:(areaWidth + 20) + 'px',height:(areaHeight) + 'px'});
$('#ip_menu ul li,#ip_menu ul li a').css({width:(areaWidth) + 'px'});
$('li:has(ul) > a').click(function(){
$(this).parents('li').animate({width: '+=' + (areaWidth) + 'px'},0);
$('ul#parent').animate({marginLeft: '-=' + (areaWidth) + 'px'},300);
$(this).parent('li').children('ul').fadeIn('normal');
$(this).parent('li').prevAll().css({display:'none'});
$(this).parent('li').nextAll().css({display:'none'});
});
$('a.ip_back').click(function(){
$(this).parents('li').animate({width: '-=' + (areaWidth) + 'px'},0);
$('ul#parent').animate({marginLeft: '+=' + (areaWidth) + 'px'},300);
$(this).parent('li').parent('ul').css({display: 'none'});
$(this).parent('li').parent('ul').parent('li').prevAll('li').fadeIn('normal');
$(this).parent('li').parent('ul').parent('li').nextAll('li').fadeIn('normal');
});
});
</script>
まず入れ子になっている<ul>を非表示にすると同時に、
「▲(右向き)」や「≪ BACK」ボタンを付加しておきます。
その下の
———————————–
var areaWidth = 300;
var areaHeight = 300;
———————————–
の値はメニューリストの枠の大きさになり、
areaWidth(幅)はリストボタンの大きさに比例しています。
このサンプルでは幅300px高さ300pxの枠内でスライドメニューを展開、
高さが300px以上になったらスクロールバーを出しています。
ここの値を変更することでメニューボタンの大きさを変更することが可能になっています。
入れ子になっているメニューボタンがクリックされると、
非表示にしていた子要素<ul>を表示に切り替え、親リストをareaWidth分左にスライドさせています。
(「≪ BACK」ボタンクリック後はその逆の動作。)
こんな感じのSCRIPTでiPhoneメニューUIをWebサイト上に実装することが可能になります。
上記サンプルではメニューリストの高さを固定にしてスクロールバーを表示させていますが、
ここを高さ固定にせずに、表示される<ul>の高さをそのまま生かす場合は、
以下のようなSCRIPTになります。
◆SCRIPT
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('#ip_menu ul li ul').hide();
$('li:has(ul) > a').each(function(){
$(this).append('<span>►</span>');
$(this).parent('li').children('ul').prepend('<li><a href="javascript:void(0);" class="ip_back">≪ BACK</a></li>');
});
var areaWidth = 300;
var areaHeight = $('ul#parent').height();
$('#ip_menu').css({width:(areaWidth + 20) + 'px',height:(areaHeight) + 'px'});
$('#ip_menu ul li,#ip_menu ul li a').css({width:(areaWidth) + 'px'});
$('li:has(ul) > a').click(function(){
$(this).parents('li').animate({width: '+=' + (areaWidth) + 'px'},0);
$('ul#parent').animate({marginLeft: '-=' + (areaWidth) + 'px'},300);
$(this).parent('li').children('ul').fadeIn('normal');
$(this).parent('li').prevAll().css({display:'none'});
$(this).parent('li').nextAll().css({display:'none'});
var areaHeight = $('ul#parent').height();
$('#ip_menu').css({height:(areaHeight) + 'px'});
});
$('a.ip_back').click(function(){
$(this).parents('li').animate({width: '-=' + (areaWidth) + 'px'},0);
$('ul#parent').animate({marginLeft: '+=' + (areaWidth) + 'px'},300);
$(this).parent('li').parent('ul').css({display: 'none'});
$(this).parent('li').parent('ul').parent('li').prevAll('li').fadeIn('normal');
$(this).parent('li').parent('ul').parent('li').nextAll('li').fadeIn('normal');
var areaHeight = $('ul#parent').height();
$('#ip_menu').css({height:(areaHeight) + 'px'});
});
});
</script>
基本的な動作は同じですが、
———————————–
var areaWidth = 300;
var areaHeight = $(‘ul#parent’).height();
———————————–
高さを親リストの値をみるようにします。
リストボタンクリック毎に
———————————–
var areaHeight = $(‘ul#parent’).height();
$(‘#ip_menu’).css({height:(areaHeight) + ‘px’});
———————————–
を実行させて、親リストの高さを毎回を変更します。
HTMLソースについては変更なしです。
ちなみに上記2パターンのCSSは以下のように記述しています。
◆CSS
body {
font-size: 100%;
line-height: 140%;
font-family: Arial,Helvetica,sans-serif;
background: #fff;
}
a:link { text-decoration:none; color: #333;}
a:visited { text-decoration:none; color: #333;}
a:active { text-decoration:none; color: #333;}
a:hover { text-decoration:none; color: #333;background: #ddd;}
#ip_menu {
padding-bottom: 0;
overflow-y: auto;
overflow-x: hidden;
position: relative;
}
#ip_menu ul {
width: auto;
float: left;
overflow: hidden;
}
#ip_menu ul li {
width: auto;
display: block;
vertical-align: text-bottom;
}
#ip_menu ul li a {
padding: 15px 0;
text-indent: 10px;
display: block;
float: left;
position: relative;
background: transparent url(../img/list_rb.jpg) repeat-y top right;
border-bottom: #333 1px solid;
}
#ip_menu ul li a:hover {
background: #f1f1f1 url(../img/list_rb.jpg) repeat-y top right;
}
#ip_menu ul li a span {
right: 10px;
position: absolute;
}
#ip_menu a.ip_back {
color: #fff;
font-weight: bold;
background: #333;
}
#ip_menu a.ip_back:hover {
background: #333 url(../img/list_rb.jpg) repeat-y top right;
}
#ip_menu ul li ul {
display: none;
}
#ip_menu ul li:after {
content: ".";
height: 0;
clear: both;
display: block;
visibility: hidden;
}
#ip_menu ul {
display: inline-block;
}
CSSについてはボタンの装飾などあると思うので
その都度、変更が必要になります。
上記2パターンのサンプルは
いちよIE6、7とかでも正常に動作します。
メニューエリアの幅をブラウザのウィンドウに合わせて、めいっぱいにすることで、
iPhoneサイト用のSCRIPTとしても使えるハズ。
(まだそのサンプルは作っていませんが。。。)
まだまだ改善すべきところはある気もしますが、
Webサイト上にiPhoneメニューUIを実装する際などに是非。。。
上記サンプルのデータをダウンロードしたい場合はこちらから
≫jQuery_iPhoneMenuUI.zip
あくまで実験段階のものなので、ライセンスとか特に何もありません。
