上部固定メニューのお供に、jQueryを使ったクリックで開閉するメニュー

タイトルのとおりjQueryを使ったクリックで開閉するメニューを作ってみました。先日マウスを乗せると開くメニューを紹介しましたが、用途によって使い分けるといいと思います。

click-panel.png

まずはサンプルをご覧ください。

facebookにも同じようなのがありますね。それではHTMLから解説していきます。

HTML

まずはHTMLです。コンテンツの部分は省略しています。

<div id="fixed-menu">
  <div id="fixed-menu-contents">
    <a href="#" id="home"></a>
    <div class="panel-wrap">
      <a href="#" class="panel-btn">カテゴリー</a>
      <div class="panel">

    コンテンツ

      </div>
    </div>
    <div class="panel-wrap">
      <a href="#" class="panel-btn">タグ</a>
      <div class="panel">

    コンテンツ

      </div>
    </div>
  </div>
</div>

メニュー全体を真ん中に設置するなどするため、たくさんDivを使っていますが、じっくり考えると難しくないと思います。

CSS

@font-face {
  font-family: 'FontAwesome';
  src: url('fonts/fontawesome-webfont.eot?v=3.0.1');
  src: url('fonts/fontawesome-webfont.eot?#iefix&v=3.0.1') format('embedded-opentype'),
    url('fonts/fontawesome-webfont.woff?v=3.0.1') format('woff'),
    url('fonts/fontawesome-webfont.ttf?v=3.0.1') format('truetype');
  font-weight: normal;
  font-style: normal;
}
#fixed-menu {
  position: fixed;
  top: 0;
  z-index: 9999;
  width: 100%;
  padding: 0;
  background: #2e4153;
}
#fixed-menu-contents {
  width: 960px;
  margin: 0 auto;
  padding: 0;
}
a#home{
  display: block;
  position: relative;
  float: left;
  width: 50px;
  height: 40px;
  border-right: 1px solid #22303d;
  border-left: 1px solid #22303d;
  color: #e4eaf0;
}
a#home:before {
  position: absolute;
  top: 10px;
  left: 15px;
  color: #cfdae4;
  font: 20px 'FontAwesome';
  content: "\f015";
}
.panel-wrap{
  position: relative;
  float: left;
  padding: 0;
  border-right: 1px solid #22303d;
}
.panel-wrap a{
  font-size: 14px;
  text-decoration: none;
}
a.panel-btn{
  display: block;
  position: relative;
  float: left;
  padding: 0 30px 0 50px;
  color: #cfdae4;
  font-size: 14px;
  line-height: 40px;
  text-decoration: none;
}
.panel-btn:before{
  position: absolute;
  top: 10px;
  left: 20px;
  color: #cfdae4;
  font: 20px 'FontAwesome';
  content: "\f0d7";
}
a#home:hover,
a#home:hover:before,
a.panel-btn:hover,
a.panel-btn:hover:before
{
  color: #fff;
}
.panel{
  display: none;
  position: absolute;
  top: 45px;
  left: 0px;
  z-index: 1000;
  width: 200px;
  margin-left: -30px;
  padding: 10px;
  background: #fff;
  border: 5px solid #9fb5cb;
  border-radius: 3px;
  box-shadow: 0 2px 5px 1px rgba(0,0,0,.2);
}
.panel:before {
  content: "";
  position: absolute;
  top: -35px;
  left: 35px;
  height: 0;
  width: 0;
  border: 15px solid transparent;
  border-bottom: 15px solid #9fb5cb;
}

それでは個別に解説していきます。

Webフォントの読込み
@font-face {
  font-family: 'FontAwesome';
  src: url('fonts/fontawesome-webfont.eot?v=3.0.1');
  src: url('fonts/fontawesome-webfont.eot?#iefix&v=3.0.1') format('embedded-opentype'),
    url('fonts/fontawesome-webfont.woff?v=3.0.1') format('woff'),
    url('fonts/fontawesome-webfont.ttf?v=3.0.1') format('truetype');
  font-weight: normal;
  font-style: normal;
}

アイコンにWebフォント使っていますので最初に読み込みます。Webフォントについては「IEでもWebフォントが使えることを知ったので勉強してみました|Webpark」をご参考に。

メニュー全体
#fixed-menu {
  position: fixed;
  top: 0;
  z-index: 9999;
  width: 100%;
  padding: 0;
  background: #2e4153;
}
#fixed-menu-contents {
  width: 960px;
  margin: 0 auto;
  padding: 0;
}

#fixed-menuで全体を上部に固定し、#fixed-menu-contentsでコンテンツを真ん中に表示するようにしています。

ホームボタン
a#home{
  display: block;
  position: relative;
  float: left;
  width: 50px;
  height: 40px;
  border-right: 1px solid #22303d;
  border-left: 1px solid #22303d;
  color: #e4eaf0;
}
a#home:before {
  position: absolute;
  top: 10px;
  left: 15px;
  color: #cfdae4;
  font: 20px 'FontAwesome';
  content: "\f015";
}

今回の内容からは若干外れますが一番左にあるホームボタンです。アイコンはWebフォントを使って擬似要素で表示しています。

ボタンとメニュー
.panel-wrap{
  position: relative;
  float: left;
  padding: 0;
  border-right: 1px solid #22303d;
}

ボタンとクリックして現れるメニューを.panel-wrapで包んでいます。

ボタン
a.panel-btn{
  display: block;
  position: relative;
  float: left;
  padding: 0 30px 0 50px;
  color: #cfdae4;
  font-size: 14px;
  line-height: 40px;
  text-decoration: none;
}
.panel-btn:before{
  position: absolute;
  top: 10px;
  left: 20px;
  color: #cfdae4;
  font: 20px 'FontAwesome';
  content: "\f0d7";
}

カテゴリー、タグの部分です。クリックしたらメニューが開くというのを伝えるために矢印型のアイコンを表示します。

クリックしたとき
a#home:hover,
a#home:hover:before,
a.panel-btn:hover,
a.panel-btn:hover:before
{
  color: #fff;
}

クリックした際のテキストとアイコンの色の設定です。

メニュー
.panel{
  display: none;
  position: absolute;
  top: 45px;
  left: 0px;
  z-index: 1000;
  width: 200px;
  margin-left: -30px;
  padding: 10px;
  background: #fff;
  border: 5px solid #9fb5cb;
  border-radius: 3px;
  box-shadow: 0 2px 5px 1px rgba(0,0,0,.2);
}
.panel:before {
  content: "";
  position: absolute;
  top: -35px;
  left: 35px;
  height: 0;
  width: 0;
  border: 15px solid transparent;
  border-bottom: 15px solid #9fb5cb;
}

クリックした際に開くメニューです。表示される場所は親要素の.panel-wrapを基準に絶対値で指定します。

上に付いている三角形は画像ではなくCSSです。この辺の擬似要素の使い方は「CSSの擬似要素を使った見出しデザイン|Webpark」をご参考に。

jQuery

最後はjQueryです。

まず、jQueryを読み込みます。一番人気のGoogleのSDNを使います。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

jQuery2はIE8以下をサポートしていませんので、今はまだjQuery1.9.1あたりの方がいいかもしれません。

続いてjQueryの設定です。もっと効率的な方法があるかも。

$(function() {
  $(".panel-btn").click(function(){
    var clickPanel = $("+.panel",this);
    clickPanel.toggle();
    $(".panel").not(clickPanel).slideUp(0);
    $(".panel:visible").prev().css("background","#283948");
    $(".panel:hidden").prev().css("background","#2e4153");
    return false;
  });
});
$(".panel-btn").click(function(){

.panel-btn(カテゴリー、タグ)をクリックした際の動きをこの先に書くことになります。

var clickPanel = $("+.panel",this);

「this」は「.panel-btn」のことで、その隣の「.panel」を変数「clickPanel」と定義します。クリックで開閉するメニューのことです。

clickPanel.toggle();

先ほど指定した「clickPanel」を開閉します。toggleでクリックごとに開け閉めするようになります。

$(".panel").not(clickPanel).slideUp(0);

「clickPanel」に該当しない「.panel」(クリックしたメニュー以外のメニュー)を閉めます。

$(".panel:visible").prev().css("background","#283948");

表示されている状態にある「.panel」の前の要素(.panel-btn)の背景色を変更します。

$(".panel:hidden").prev().css("background","#2e4153");

表示されていない状態にある「.panel」の前の要素(.panel-btn)の背景色を変更します。

最後の2つは別になくてもいい気もしますし、他の色でもいい気もしますので、ご自由に変更してみてください。

さいごに

ということでクリックで開閉するメニューを紹介しました。

クリックすることでページを移動するのではなくメニューが開くということを伝えることが必要です。ということで今回は下向きのアイコンを付けています。

最初にも言いましたが、マウスを乗せて開閉するドロップダウンメニューと使い分けるといいと思います。

フィードやTwitterで最新情報をチェック
follow us in feedly
この記事に付いているタグの最新記事一覧
loading...
コメント
こんばんは、長崎市に住む山田健治と申します。

html,css,javascrpt,jquery勉強中の超初心者です。数ある教則(?)webページの中でこんなに親切で分かりやすいwebページに遭遇し感激し喜んでいます。

しかし超初心者ゆえに、今個人で勉強中の「accordion」で悩んでいます。当ページのhtml,jquery,cssをコピーしてエディタに貼り付けてもアコーディオンにならずに悩んでいるんです。もちろんhtmlのコードの前に打ち込まなければならない約束事があることは理解しているのですが、html4.01 、xhtml、 html5のコードなのか分かりません。

学校で今月の最後の日に個人発表がありまして何とかかっこいいページを作成したいと思っているのですが…上の点がよく分からないのです。

お忙しいことはよく理解しています。もしこのコメントページに目がとまりましたらお返事いただきたく思います。よろしくお願いいたします。

「webpark」は今日夕方検索していて見つけました。多くの興味深いことが書かれていますので今後ゆっくり見て学んでいきたいと思っております。

おやすみなさい。
【2013/06/15 00:15】 | YAMADA KENJI #TiGF9OhI | [edit]
山田健治さん

コメントありがとうございます。
今回のサンプルについては、html4.01 、xhtml、 html5
のどれで書いても問題ないと思います。
確認はしていませんが。。

作ったものを見ていませんのではっきりしたことは分かりませんが
CSSでしたら<style>~</style>内に、
jQueryでしたら<script type='text/javascript'>~</script>内に
書く必要があります。
この辺でしょうか?

後は、サンプルのページは実際動いていますので
そちらのソースを見てみてはどうでしょうか?
http://js.crap.jp/book/chapter2/open-panel.html
【2013/06/16 07:15】 | 管理人 #E2ywrYdA | [edit]









※コメントはご意見ご感想や間違いのご指摘等にしていただけますようお願いいたします。コメントを確認する時間がなく、技術的なご質問をいただいても答えできません。申し訳ございませんがご理解のほどお願いいたします。

Recent Entry
Popular Entry
  • このエントリーをはてなブックマークに追加