[CSS]この発想はなかった!inputとlabelを使って実装する美しいデザインのアコーディオン
Post on:2012年2月22日
inputとlabelで開閉機能をつけ、アニメーションでパネルが開閉するアコーディオンを実装するスタイルシートのチュートリアルを紹介します。
機能だけでなく、パネルの美しいスタイルにも注目です。
[ad#ad-2]
デモ
デモはアコーディオンの機能としてもすばらしいですが、その美しいスタイルもすばらしいです。
デモページ:チェックボックス版
パネルの開閉はチェックボックスのチェックの有無で判定します。
デフォルト時
各パネルの立体感が美しいです。
ホバー時
パネルがハイライトされ、アローが表示されます。
[ad#ad-2]
パネルが開いた時
パネルがアニメーションでスライドします。
パネルが開いた+ホバー時
パネルが開いている時のアローは上向きに変わります。
デモでは上記のチェックボックス版だけでなく、ラジオボタン版などもあります。
実装
HTML
一つのアイテムに含まれるのは、チェックボックス、ラベル、コンテンツの3つです。それらをdiv要素で内包します。
<section class="ac-container"> <div> <input id="ac-1" name="accordion-1" type="checkbox" /> <label for="ac-1">About us</label> <article class="ac-small"> <p>Some content... </p> </article> </div> <div> <input id="ac-2" name="accordion-1" type="checkbox" checked /> <label for="ac-2">How we work</label> <article class="ac-medium"> <p>Some content... </p> </article> </div> <div><!--...--></div> </section>
CSSオフ時は、下記のような表示になります。
チェックボックスとラベル、そしてコンテンツから構成されているのが分かると思います。
デモページ:CSSオフ
CSS
ここではベンダープレフィックス(-moz-など)を省略していますが、実際には記述して利用してください。
まずは、アコーディオンの幅を定義し、真ん中に配置します。
.ac-container{ width: 400px; margin: 10px auto 30px auto; }
次はラベルのスタイルです。
グラデーションやシャドウを与え、クリック可能なボタンのようにデザインします。
.ac-container label{ font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif; padding: 5px 20px; position: relative; z-index: 20; display: block; height: 30px; cursor: pointer; color: #777; text-shadow: 1px 1px 1px rgba(255,255,255,0.8); line-height: 33px; font-size: 19px; background: linear-gradient(top, #ffffff 1%,#eaeaea 100%); box-shadow: 0px 0px 0px 1px rgba(155,155,155,0.3), 1px 0px 0px 0px rgba(255,255,255,0.9) inset, 0px 2px 2px rgba(0,0,0,0.1); }
ラベルのホバー時には、背景カラーをホワイトにします。
.ac-container label:hover{ background: #fff; }
チェックボックスがチェックされた際のスタイルを定義します。
.ac-container input:checked + label, .ac-container input:checked + label:hover{ background: #c6e1ec; color: #3d7489; text-shadow: 0px 1px 1px rgba(255,255,255, 0.6); box-shadow: 0px 0px 0px 1px rgba(155,155,155,0.3), 0px 2px 2px rgba(0,0,0,0.1); }
隣接セレクタを使い、ホバー時に小さいアローアイコンを加えます。
.ac-container label:hover:after, .ac-container input:checked + label:hover:after{ content: ''; position: absolute; width: 24px; height: 24px; right: 13px; top: 7px; background: transparent url(../images/arrow_down.png) no-repeat center center; }
アローアイコンは、選択された状態の時は上向きのアローにします。
.ac-container input:checked + label:hover:after{ background-image: url(../images/arrow_up.png); }
また、input要素(チェックボックスやラジオボタン)が見えることは望まないので、非表示にします。
.ac-container input{ display: none; }
コンテンツのスタイルを定義します。
デフォルト時は「height: 0px;」にし非表示にし、立体感を出すためにbox-shadowを使用します。
.ac-container article{ background: rgba(255, 255, 255, 0.5); margin-top: -1px; overflow: hidden; height: 0px; position: relative; z-index: 10; transition: height 0.3s ease-in-out, box-shadow 0.6s linear; } .ac-container input:checked ~ article{ transition: height 0.5s ease-in-out, box-shadow 0.1s linear; box-shadow: 0px 0px 0px 1px rgba(155,155,155,0.3); }
コンテンツ内のテキストも少しスタイルを整えてみます。
.ac-container article p{ font-style: italic; color: #777; line-height: 23px; font-size: 14px; padding: 20px; text-shadow: 1px 1px 1px rgba(255,255,255,0.8); }
最後に、異なる高さ用に3つのスタイルを定義します。
.ac-container input:checked ~ article.ac-small{ height: 140px; } .ac-container input:checked ~ article.ac-medium{ height: 180px; } .ac-container input:checked ~ article.ac-large{ height: 230px; }
sponsors