ドロップダウン メニュー

JavaScriptを使ったドロップダウンメニューのシンプルバージョンです。
わかりやすくシンプルなコードを心がけて作ってみました。

フォルダを押すとサブメニューが表示されます。
もう一度押すとサブメニューを閉じます。

使用画像

どちらも私が一から作成したものなのでご自由にお使いください。

  • フォルダ (image/bcfolder.gif)
  • ファイル (image/bcfile.gif)

html構造部分

onclickとonkeypressは同時に指定することが推奨されているのですが、今回の場合はマウスでクリック以外は想定していないのでonkeypressには何も処理をしないダミー関数を登録しました。

<ul id="dropdownMenu">
  <li><span onclick="ddMenu('ddMenu1')" 
onkeypress="dummy()">メニュー1</span>
    <ul id="ddMenu1" style="display: none;">
      <li>サブメニュー1</li>
      <li>サブメニュー2</li>
      <li>サブメニュー3</li>
    </ul>
  </li>
  <li><span onclick="ddMenu('ddMenu2')"
onkeypress="dummy()">メニュー2</span>
    <ul id="ddMenu2" style="display: none;">
      <li>サブメニュー1</li>
      <li>サブメニュー2</li>
      <li>サブメニュー3</li>
    </ul>
  </li>
  <li><span onclick="ddMenu('ddMenu3')"
onkeypress="dummy()">メニュー3</span>
    <ul id="ddMenu3" style="display: none;">
      <li>サブメニュー1</li>
      <li>サブメニュー2</li>
      <li>サブメニュー3</li>
    </ul>
  </li>
</ul>

CSS部分

ulにフォルダ画像を背景として置いた時に最初のulだけIEの後方互換モードでは表示されなかったのでspan要素を追加してそっちに背景画像を置きました。

IEの後方互換モードではheight属性の無い要素にbackgroundを指定するとたまに表示されなくなるバグがあるようなので。h3やh4などでは複数行になることはあまりないのでheightを指定できるのですが、今回みたいにulをネストした場合はheightは指定できないのでspanを入れてそこでheightとbackgroundを指定しました。

@charset "utf-8";

ul#dropdownMenu {
  list-style: none;
  margin: 12px 0 18px 0;
  padding: 0;
}
ul#dropdownMenu li {
  margin: 0;
  padding: 0;
  text-indent: 0;
}
ul#dropdownMenu li span {
  height: 18px;
  line-height: 18px;
  padding-left: 18px;
  background: left url(image/bcfolder.gif) no-repeat;
  cursor: pointer;
}
ul#dropdownMenu li img {
  margin-right: 2px;
}
ul#dropdownMenu li ul {
  list-style: none;
  margin: 0 0 0 12px;
  padding: 0;
}
ul#dropdownMenu li ul li {
  height: 18px;
  line-height: 18px;
  background: left center url(image/bcfile.gif) no-repeat;
  text-indent: 18px;
}

JavaScript部分

ddMenu関数は送られてきたIDのdisplayスタイルがnoneならblockに変更、blockならnoneに変更するだけです。

function ddMenu(ddmenu) {
  var m = document.getElementById(ddmenu);
  if(m.style.display == 'none') {
    m.style.display = 'block';
  } else if(m.style.display == 'block') {
    m.style.display = 'none';
  }
  return false;
}
function dummy() {
  return false;
}