KANTENNA.COM

Solarized

HOME > WEBプログラム覚書 > 優れたナビゲーションを真似てみる

優れたナビゲーションを真似てみる

勉強のため優れたナビゲーションを再現してみる。もちろん完全再現ではない。 とりあえず今回はNavigation Menus: Trends and Examples | Design Showcase | Smashing Magazine で紹介されていたPlayground Blues。美しいですね。

現在の手持ちの武器は少々のJavascriptの知識と少々のjQueryの知識と少々のCSSの知識。 心許ないが仕方ない。

CSSとHTML

まずはHTMLとCSS。必要最小限で。

CSS
  1.  body {
  2.   margin: 0px;
  3.   padding: 0px;
  4.  }
HTML
  1.  <div id="SideMenu">
  2.  <ul>
  3.   <li><a href="">リスト1</a></li>
  4.   <li><a href="">リスト2</a></li>
  5.   <li><a href="">リスト3</a></li>
  6.   <li><a href="">リスト4</a></li>
  7.   <li><a href="">リスト5</a></li>
  8.  </ul>
  9.  </div>

Javascript

まずはライブラリ利用せずに書く。 実行結果はこちら。

コード

Javascript
  1.  onload = function() {
  2.   sideMenu({id:"SideMenu", height:50, width:100, img:"menu.gif"});
  3.  }
  4.  
  5.  var sideMenu = function(params)
  6.  {
  7.   var erea = document.getElementById(params["id"]);
  8.   var ul = erea.getElementsByTagName("ul")[0];
  9.   var lis = erea.getElementsByTagName("li");
  10.   var as = new Array();
  11.  
  12.   var default_height = params["height"] + "px";
  13.   var default_width = params["width"] + "px";
  14.   var default_bp = -params["width"];
  15.  
  16.   // ULの設定
  17.   ul.style.height = params["height"] * lis.length;
  18.   ul.style.width = default_width;
  19.   ul.style.margin = "0px";
  20.   ul.style.padding = "0px";
  21.   ul.style.listStyle = "none";
  22.  
  23.   for (var i=0; i<lis.length; i++) {
  24.  
  25.   // 必要なら各LIにidをセット
  26.   /*
  27.   var li_id = document.createAttribute("id");
  28.   li_id.value = params["id"] + "Li" + i;
  29.   lis[i].setAttributeNode(li_id);
  30.   */
  31.  
  32.   lis[i].style.height = default_height;
  33.   lis[i].style.width = default_width;
  34.   lis[i].style.margin = "0px";
  35.   lis[i].style.padding = "0px";
  36.   lis[i].style.listStyle = "none";
  37.   lis[i].style.textIndent = "-9999em";
  38.  
  39.   // LI a の設定
  40.   as[i] = lis[i].getElementsByTagName("a")[0];
  41.   as[i].style.display = "block";
  42.   as[i].style.height = default_height;
  43.   as[i].style.width = default_width;
  44.  
  45.   var iheight = params["height"] * i;
  46.  
  47.   as[i].style.background = "url(" + params["img"] + ") no-repeat -" + default_width + " -" + iheight + "px";
  48.  
  49.   as[i].myHeight = -iheight + "px";
  50.  
  51.   as[i].myFunc = function()
  52.   {
  53.   var default_bp = -params["width"];
  54.   var self = this;
  55.  
  56.   var over_timer = setInterval(function(){
  57.   default_bp += 10;
  58.   if (default_bp <= 0) {
  59.   self.style.background = "url(" + params["img"] + ") no-repeat " + default_bp + "px " + self.myHeight;
  60.   } else {
  61.   clearInterval(over_timer);
  62.   }
  63.   }, 1);
  64.  
  65.   // マウスはなれたとき
  66.   this.onmouseout = function()
  67.   {
  68.   clearInterval(over_timer);
  69.   var out_timer = setInterval(function(){
  70.   default_bp -= 10;
  71.   if (default_bp >= -params["width"]) {
  72.   self.style.background = "url(" + params["img"] + ") no-repeat " + default_bp + "px " + self.myHeight;
  73.   } else {
  74.   clearInterval(out_timer);
  75.   }
  76.   }, 1);
  77.   }
  78.   }
  79.  
  80.   /* マウスオーバーした時
  81.   * 自分自身の関数実行
  82.   */
  83.   as[i].onmouseover = function() {
  84.   this.myFunc();
  85.   }
  86.   }
  87.  }

firefox3、ie6、ie7にて動作確認。ie6で動いたのはうれしい誤算w ただ動きが等速直線運動で塩分高め。

paramsはget、set備えたclass作ったほうがよかった気がします。 とはいえメニューの項目が頻繁に変わるようでなければjavascriptではアニメーションだけをやって その他はCSSで静的に設定しておいた方が楽ですね。

jQuery

次はjQueryを利用して再現してみます。実行結果はこちら。

Javascript
  1.  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
  2.  <script language="javascript">
  3.  $(function(){
  4.   var params = {id:"SideMenu", height:50, width:20, img:"menu.gif"};
  5.   var ul = $("#SideMenu ul");
  6.   var lis = $("#SideMenu li");
  7.   var as = $("#SideMenu a");
  8.  
  9.   ul.css({
  10.   padding:"0px",
  11.   margin:"0px",
  12.   listStyle:"none"
  13.   });
  14.  
  15.   lis.css({
  16.   height:params["height"],
  17.   width:params["width"],
  18.   textIndent:"-9999em",
  19.   padding:"0px",
  20.   margin:"0px",
  21.   listStyle:"none"
  22.   });
  23.  
  24.   as.each(function(i){
  25.   var h = "-" + params["height"] * i + "px";
  26.   $(this).css({
  27.   background:"url(" + params["img"] + ") no-repeat right " + h,
  28.   display:"block",
  29.   height:params["height"],
  30.   width:params["width"]
  31.   });
  32.  
  33.   $(this).hover(function(){
  34.   $(this).animate({width:"100px"}, "fast", "swing");
  35.   $(this).css({background:"url(" + params["img"] + ") no-repeat left " + h});
  36.   },function(){
  37.   $(this).animate({width:params["width"]}, "nomal", "swing");
  38.   $(this).css({background:"url(" + params["img"] + ") no-repeat right " + h});
  39.   });
  40.   });
  41.  });
  42.  </script>

なんかカクカクしてますね。これは伸縮と同時にbackground-positionを変更してるからっぽい。 本家はmarginをアニメーションさせてるようです。

jQueryではイージングのプラグインjQuery Easing Pluginを 利用することで色々な動きができるようです。

javascriptだけのと違うのは当たり判定。小さくなってるんですがエリアは大きい方がいいですね。

パーフェクトJavaScript (PERFECT SERIES 4)
作者:浜辺 将太 | 価格:¥ 3,360

トラックバック(0)

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。

2012
01.21

[PHP]共有サーバーユーザーのためのPEARインストール方法

共有サーバーでは自由にPEARのパッケージがインストールできないので、 プロジェクトローカルに設置することになりますが、以前httpベースのものを使ってみたんですけど、 やたら重くて使い物にならなかったので、僕は普通にFTPでアップするようにしてます。

ってことでプロジェクトローカルへのPEARのインストール方法。