javascriptを使わない、
CSSのみで作る
アコーディオンメニューの
実装方法をご紹介します。
<div id="accordion"> <form> <div> <h3 class="mens">CSSのみで作るアコーディオン</h3> <div class="ttl"> <label for="button_men1"> <div class="fire">アウター/トップス</div> </label> <input type="checkbox" name="btn" id="button_men1"/> <ul> <li><a href="#">コート</a></li> <li><a href="#">ジャケット</a></li> <li><a href="#">ダウンウェア</a></li> <li><a href="#">ベスト</a></li> <li><a href="#">ニット</a></li> <li><a href="#">シャツ</a></li> <li></li> </ul> </div> <div class="ttl"> <label for="button_men2"> <div class="fire">ボトムス</div> </label> <input type="checkbox" name="btn" id="button_men2"/> <ul> <li><a href="#">ジーンズ</a></li> <li><a href="#">スウェットパンツ</a></li> <li><a href="#">コットンパンツ</a></li> <li><a href="#">コーデュロイパンツ</a></li> <li><a href="#">カーゴパンツ</a></li> <li><a href="#">ウールパンツ</a></li> </ul> </div> <div class="ttl"> <label for="button_men3"> <div class="fire">バッグ</div> </label> <input type="checkbox" name="btn" id="button_men3"/> <ul> <li><a href="#">ショルダーバッグ</a></li> <li><a href="#">トートバッグ</a></li> <li><a href="#">ボディバッグ</a></li> <li><a href="#">ボストンバッグ</a></li> <li><a href="#">リュックサック</a></li> <li></li> </ul> </div> <div class="ttl"> <label for="button_men4"> <div class="fire">シューズ</div> </label> <input type="checkbox" name="btn" id="button_men4"/> <ul> <li><a href="#">ドレスシューズ</a></li> <li><a href="#">スニーカー</a></li> <li><a href="#">スリッポン</a></li> <li><a href="#">ブーツ</a></li> <li><a href="#">デッキシューズ</a></li> <li><a href="#">サンダル</a></li> <li></li> </ul> </div> <div class="ttl"> <label for="button_men5"> <div class="fire">アクセサリー</div> </label> <input type="checkbox" name="btn" id="button_men5"/> <ul> <li><a href="#">手袋</a></li> <li><a href="#">帽子</a></li> <li><a href="#">サングラス</a></li> <li><a href="#">腕時計</a></li> <li><a href="#">ネックレス</a></li> <li><a href="#">ブレスレット</a></li> <li><a href="#">ピアス</a></li> <li><a href="#">マフラー/ストール</a></li> </ul> </div> </div> </form> </div>
今回のアコーディオンには
フォームタグの「checkbox」を利用します。
.fireが開閉ボタン、
input直下のulタグが
開閉するコンテンツの役割の担当です。
body{ background-color: #fff; margin: 0; color: #000; } #header { height: 80px; text-align: center; } #accordion a { color: #666; } h3 { position: relative; left: 2%; font-weight: 900; font-size: 22px; } #accordion { position: relative; width: 100%; margin: 0 auto; padding: 0; text-align: left; line-height: 1; } #accordion input { position: absolute; height: 0; padding: 0; display: none; } #accordion div div.ttl { position: relative; padding: 0; border-bottom: 1px solid #DDD; } div.ttl:first-child { border-top: 1px solid #DDD; } #accordion div.fire { position: relative; font-size: 18px; padding: 1.5em 2em; letter-spacing: 0.1em; color: #333; cursor: pointer; } #accordion div.fire:hover { background: #DDD; } #accordion input:checked + div div.ttl:after { top: 12px; right: 15px; -moz-transform: rotate(90deg); -webkit-transform: rotate(90deg); -o-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } #accordion ul { list-style: none; margin: 0; padding: 0; } #accordion ul:after { content: "."; display: block; height: 0; font-size: 0; clear: both; visibility: hidden; } #accordion input[type="checkbox"] + ul li { float: left; width: 49%; border-top: 0px solid #DDD; border-right: #DDD solid 0px; -moz-transition: 0.3s; -webkit-transition: 0.3s; -o-transition: 0.3s; -ms-transition: 0.3s; } #accordion input[type="checkbox"]:checked + ul li { float: left; width: 49%; border-top: 1px solid #DDD; border-right: #DDD solid 1px; } #accordion input[type="checkbox"]:checked + ul li:nth-child(even) { float: left; width: 49%; border-right: none; } #accordion ul li a { display: block; overflow: hidden; height: 0; padding: 0 0 0 10px; text-decoration: none; -moz-transition: 0.3s; -webkit-transition: 0.3s; -o-transition: 0.3s; -ms-transition: 0.3s; transition: 0.3s; } #accordion input[type="checkbox"]:checked + ul li a { position: relative; background: none; line-height: 1; height: 20px; padding: 1.3em 0px 1em 10px; font-size: 14px; } #accordion ul:before { position: absolute; top: 30px; right: 2.8em; display: inline-block; content: ""; width: 14px; height: 14px; margin-top: -4px; margin-right: -4px; vertical-align: middle; border-top: 3px solid #999; border-right: 3px solid #555; -webkit-transform: rotate(45deg); transform: rotate(45deg); -ms-transform: rotate(45deg); -moz-transition: 0.3s; -webkit-transition: 0.3s; -o-transition: 0.3s; -ms-transition: 0.3s; transition: 0.3s; } #accordion input[type="checkbox"]:checked + ul:before { position: absolute; top: 30px; -webkit-transform: rotate(135deg); transform: rotate(135deg); -ms-transform: rotate(135deg); } #accordion input[type="checkbox"] + ul li a:before { position: absolute; content: ""; -moz-transition: 0.3s; -webkit-transition: 0.3s; -o-transition: 0.3s; -ms-transition: 0.3s; transition: 0.3s; } #accordion input[type="checkbox"]:checked + ul li a:before { position: absolute; top: 23px; right: 1.2em; display: inline-block; content: ""; width: 10px; height: 10px; margin-top: -4px; margin-right: -4px; vertical-align: middle; border-top: 3px solid #999; border-right: 3px solid #555; -webkit-transform: rotate(45deg); transform: rotate(45deg); -ms-transform: rotate(45deg); -moz-transition: 0.3s; -webkit-transition: 0.3s; -o-transition: 0.3s; -ms-transition: 0.3s; transition: 0.3s; }
CSSで注目すべき点は、
checked擬似クラスで
display:none状態の
checkboxのチェック状態を取得し、
チェックされている場合は、
隣接セレクタによって、
直下のulタグ内のliタグが
高さを持つように指定している点です。
本来このアコーディオンは、
javascriptが使えない
楽天ショップサイトのコーディング案件用に
作成したものでした。
状況に応じて
様々な解決法を模索することも
コーダーの大事な仕事のうちですね。
コメント