[CSS]この発想はなかった!inputとlabelを使って実装する美しいデザインのアコーディオン

inputとlabelで開閉機能をつけ、アニメーションでパネルが開閉するアコーディオンを実装するスタイルシートのチュートリアルを紹介します。
機能だけでなく、パネルの美しいスタイルにも注目です。

サイトのキャプチャ

Accordion with CSS3

デモ

デモはアコーディオンの機能としてもすばらしいですが、その美しいスタイルもすばらしいです。

デモのキャプチャ

デモページ:チェックボックス版
パネルの開閉はチェックボックスのチェックの有無で判定します。

デモのキャプチャ

デフォルト時
各パネルの立体感が美しいです。

デモのキャプチャ

ホバー時
パネルがハイライトされ、アローが表示されます。

デモのキャプチャ

パネルが開いた時
パネルがアニメーションでスライドします。

デモのキャプチャ

パネルが開いた+ホバー時
パネルが開いている時のアローは上向きに変わります。

デモでは上記のチェックボックス版だけでなく、ラジオボタン版などもあります。

実装

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;
}

top of page

©2017 coliss