Step1-A. ベースのHTMLを記述
まずは、1階層目(メイン)のプルダウンメニューと、それに連動して表示される2階層目(サブ)のプルダウンメニューを作るHTMLを記述しましょう。ここでは例として、「最初に市の名称を選択すると、次にその市内に限定した区の名称が出てくる」というプルダウンメニュー群を作ります。下記のHTMLソースでは、所々にclass属性やid属性を使って名称を付加しています。これはCSSで装飾する目的だけでなく、後からJavaScriptを使って表示/非表示を調整する目的でも使います。省略してしまうとスクリプトが動かなくなりますので、省略せずに記述して下さい。
■2段階のプルダウンメニューすべてのHTMLソース:
<!-- ▼2段階プルダウンメニューの例(市を選択すると区が出てくる) -->
<div class="pulldownset">
<!-- ========================================== -->
<!-- (※1)▼1段階目(メイン)のプルダウンメニュー -->
■住所を選択:
<select class="mainselect">
<option value="">市を選択</option>
<option value="kobe">神戸市</option>
<option value="osaka">大阪市</option>
<option value="kyoto">京都市</option>
<option value="other">その他</option>
</select>
<!-- ================================================================ -->
<!-- (※2)▼項目「神戸市」に対応する2段階目(サブ)のプルダウンメニュー -->
<select id="kobe" class="subbox">
<option value="">神戸の区を選択</option>
<option value="hn">東灘区</option>
: : :
<option value="hg">兵庫区</option>
<option value="sm">須磨区</option>
</select>
<!-- ================================================================ -->
<!-- (※3)▼項目「大阪市」に対応する2段階目(サブ)のプルダウンメニュー -->
<select id="osaka" class="subbox">
<option value="">大阪の区を選択</option>
<option value="kt">北区</option>
: : :
<option value="tj">天王寺区</option>
<option value="ab">阿倍野区</option>
<option value="se">住之江区</option>
</select>
<!-- ================================================================ -->
<!-- (※4)▼項目「京都市」に対応する2段階目(サブ)のプルダウンメニュー -->
<select id="kyoto" class="subbox">
<option value="">京都の区を選択</option>
<option value="uk">右京区</option>
: : :
<option value="fs">伏見区</option>
<option value="ys">山科区</option>
</select>
<!-- ====================================================== -->
<!-- (※5)▼項目「その他」に対応する2段階目(サブ)のボックス -->
<span id="other" class="subbox">
自由入力:<input type="text" value="" size="15">
</span>
</div>
上記は、1階層目と2階層目のプルダウンメニューをすべて記述したHTMLソースです。この「1階層目と2階層目のセット」(=<div class="pulldownset">~</div>)は、同一ページ内にいくつ記述しても構いません。完全なソースは、サンプルページ「2段階の連動プルダウンメニューの動作サンプル」をご覧下さい。上記のHTMLソースは、下図のように「メインメニューの各項目に記述したvalue属性値が、連動するサブメニューに付加されたid名を示す」という構造になっています。
メイン項目のvalue属性値が、連動する要素のid名になっている
■1階層目のプルダウンメニュー(1つ):
1階層目のプルダウンメニューの各項目には、それぞれ異なるvalue属性値を記述
※今回ご紹介するサンプルJavaScriptでは、この1階層目は必ず「select要素で作るプルダウンメニュー」である必要があります。また、select要素には属性「class="mainselect"」を付加して、1階層目(メイン)であることを示す必要もあります。
2階層目のプルダウンメニューには、個別のid名と共通のclass名を記述
- id属性を用いて一意の名称を付ける (=1階層目のプルダウンメニューで記述したvalue属性値と一致する名称を記述する)
- 2階層目であることを示す共通のclass名を付けるため、「class="subbox"」と記述する
例えば、1階層目のプルダウンメニューでは「神戸市」の項目として、
<option value="kobe">神戸市</option>と記述しました。ですから、この「神戸市」項目に相当する2階層目の要素には、以下のように同じ名称をid属性で指定しておきます。
<select id="kobe" class="subbox"> ~ </select>
これらの条件を満たしていれば、2階層目は必ずしもプルダウンメニューでなくても構いません。先のHTMLソースでは、2階層目として以下の4つを記述しています。
- select要素で作るプルダウンメニュー(神戸の区を選択)
- select要素で作るプルダウンメニュー(大阪の区を選択)
- select要素で作るプルダウンメニュー(京都の区を選択)
- span要素で作るボックス(自由入力欄付き)
このように、プルダウンメニュー以外の要素も2階層目として表示可能です。ここではspan要素を使っていますが、value属性値とid属性値の対応が取れてさえいれば、div要素など他の要素も使用可能です。
■注1:1階層目と2階層目は同じ親要素に含まれている必要がある
本記事でご紹介するJavaScriptの都合で、連動するすべてのプルダウンメニュー(1階層目と2階層目)は同じ親要素の直下に記述されている必要があります。下図を参考にして(ここでは<div class="pulldownset">~</div>が親要素)、この点にご注意下さい。
1階層目(メイン)と2階層目(サブ)は、同じ親要素の直下に記述しておく必要がある
■注2:同一ページ内でid属性値が重複しないように
これは本記事でご紹介するJavaScriptに限った話ではありませんが、「同一ページ内で同じid名は1回しか使えない」という点にご注意下さい。id名は対象の要素を一意に特定するための名称ですから同じ名称は1回しか使えません。同じid名を持つ要素が複数個あると、JavaScriptがうまく動かなくなります。詳しくは、記事「スタイルシートの class と id の使い分け」もご参照下さい。
■現状のソースだけで表示させると……
上記のHTMLソースをブラウザで表示すると、次のように見えます。
1階層目だけでなく、2階層目のプルダウンメニューもすべて見えている
まだ、装飾もスクリプトも何も加えていないので、ただプルダウンメニューなどが並ぶだけです。どのプルダウンメニューを選択しても何も変化しません。
Step1-B. プルダウンメニューを装飾するCSSを記述
このままでは見づらいので、CSSを使って装飾を加えましょう。ここでは例として、以下のCSSソースを用意しました。このCSSの記述はどの行も必須ではありません。好きなようにデザインして下さい。■サンプルCSSソース:
/* ▼プルダウンメニューを囲む枠の装飾 */
.pulldownset {
border: 3px double #0000cc; /* 青色の二重線(3px) */
background-color: #eeeeff; /* 背景色:淡い青色 */
margin: 1em 0px; /* 外側の余白:上下に1文字分 */
padding: 1em; /* 内側の余白:周囲に1文字分 */
overflow: auto; /* はみ出る場合は自動調整(スクロールバーを表示) */
}
/* ▼プルダウンメニューそのものの装飾 */
select {
font-size: 1.2em; /* 項目の文字サイズを1.2倍に */
}
ここでは、プルダウンメニュー群のセット全体を囲むボックス(.pulldownset)に対して枠線や余白を加えています。さらに、プルダウンメニューを作るselect要素の文字サイズを1.2倍にしています。■現状のソースだけで表示させると……
これまでにご紹介したHTMLソースとCSSソースを使ってブラウザで表示すると、次のように見えます。
装飾を加えたところ (まだ、すべてのプルダウンメニューが見えたまま)
今の段階では、2階層目のプルダウンメニューがすべて表示されたままです。これらのプルダウンメニューはCSSを使って非表示にしておくこともできますが、そうするとJavaScriptが実行されない環境では2階層目のプルダウンメニューが一切表示されなくなってしまいます。そこで、CSSでは非表示にせず、後からJavaScriptを使って非表示にすることにします。
それでは次に、2階層目のプルダウンメニューを隠すJavaScriptを記述してみましょう。







