すぐに使える!アコーディオンメニュー

前置き

アコーディオンと聞いたらふつうは何を思い浮かべるのでしょうか。
私は以前までは楽器を思い浮かべていたのですが、コーダーになってからはアコーディオンメニューが真っ先に頭に浮かぶようになりました。

個人的に、アコーディオンを実装すると考えたら少しやだなぁ…と感じてしまうので、私のように困っている方が少しでも実装しやすくなるように3種類のアコーディオンコードをまとめてみましたので、参考にしていただければと思います!

内容を開くとボタンも一緒に移動するアコーディオン

コードは下記↓

<div class="component-detail">
    <div class="detail-element">
        テキストテキストテキストテキスト<br>
        テキストテキストテキストテキスト<br>
        テキストテキストテキストテキスト<br>
        テキストテキストテキストテキスト
    </div>
</div>
<div class="btnset">
    <a href="#" class="button boxopen">開く</a>
</div>

<style>
    /* アコーディオンの内容 */
    .component-detail {
        width: 90%;/* 要素の横幅指定 btnsetと数値を合わせる */
        margin: 15px auto 0px;
        padding: 0;
        text-align: center;
    }

    .component-detail .detail-element {
        font-size: 16px;
    }

    /* アコーディオン */
    .btnset {
        width: 90%;/* 要素の横幅指定 component-detailと数値を合わせる */
        margin: 0 auto;
    }

    /* アコーディオンのボタン */
    .btnset .button {
        background-color: #000;
        padding: 9px 0 7px 0;
        text-align: center;
        display: inline-block;
        width: 100%;
        box-sizing: border-box;
        position: relative;
        text-decoration: none;
        font-size: 17px;
        color: #fff;
    }

    /* アコーディオンの+,- */
    .boxopen:before {
        display: block;
        content: "";
        position: absolute;
        top: 37%;
        right: 325px;
        width: 6px;
        height: 13px;
        border-left: solid 1px #fff;
    }

    .boxopen:after {
        display: block;
        content: "";
        position: absolute;
        top: 50%;
        right: 325px;
        width: 13px;
        height: 6px;
        border-top: solid 1px #fff;
    }

    .boxclose:after {
        display: block;
        content: "";
        position: absolute;
        top: 50%;
        right: 325px;
        width: 13px;
        height: 6px;
        border-top: solid 1px #fff;
    }
</style>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
    $(function () {
        $('.btnset').prev().hide();
        $('.btnset').click(function (e) {
            e.preventDefault();
            if ($(this).prev().is(':hidden')) {
                $(this).prev().slideDown();
                $(this).find('.button').text('閉じる').addClass('boxclose').removeClass('boxopen');
            } else {
                $(this).prev().slideUp();
                $(this).find('.button').text('開く').removeClass('boxclose').addClass('boxopen');
            }
        });
    });
</script>

タイトルボタンのほかに閉じるボタンが出てくるアコーディオン

コードは下記↓

<section class="accordion_one">
    <h3 class="accordion_header" id="ac1">
        タイトル
    </h3>
    <div class="inner accordion_inner">
        <div class="inner_area">
            テキストテキストテキストテキスト<br>
            テキストテキストテキストテキスト<br>
            テキストテキストテキストテキスト<br>
            テキストテキストテキストテキスト
        </div>
        <div class="closeArea">
            <div class="close_box"><a href="#ac1" class="close_btn">閉じる</a></div>
        </div>
    </div>
</section>

<style>
    /* アコーディオンのタイトルボタン */
    .accordion_one .accordion_header {
        position: relative;
        z-index: +1;
        cursor: pointer;
        transition-duration: 0.2s;
        background: #000;
        font-size: 28px;
        text-align: center;
        margin: 0;
        line-height: 100%;
        padding: 23px 0;
        font-weight: 300;
        color: #fff;
    }
    .accordion_one .accordion_header:hover {
        opacity: .8;
    }

    .accordion_one .accordion_header::before{
        content: "";
        position: absolute;
        right: 25%;
        top: 24px;
        width: 18px;
        height: 18px;
        border-top: 2px solid #fff;
        border-right: 2px solid #fff;
        -webkit-transform: rotate(135deg);
        transform: rotate(135deg);
    }
    .accordion_header::before{
        right: 28%;
    }
    .accordion_header::before{
        right: 8%;
        top: 50px;
    }

    /* アコーディオンの内容 */
    .accordion_one .inner{
        border-right: 1px solid #ccc;
        border-left: 1px solid #ccc;
        border-bottom: 1px solid #ccc;
    }
    .accordion_one .inner_area{
        padding: 15px 0;
    }
    .accordion_one .accordion_header.open:before {
        content: none;
    }
    .accordion_one .accordion_inner {
        display: none;
        text-align: center;
    }

    /* アコーディオンの閉じるボタン */
    .accordion_one .accordion_inner .closeArea .close_box a.close_btn {
        display: flex;
        justify-content: center;
        align-items: center;
        background: #000;
        text-decoration: none;
        text-align: center;
        margin: 0;
        line-height: 100%;
        padding: 23px 0;
        font-size: 28px;
        position: relative;
        cursor: pointer;
        transition-duration: 0.2s;
    }
    .accordion_one .accordion_inner .closeArea .close_box a.close_btn::before{
        content: "";
        position: absolute;
        right: 42%;
        top: 36px;
        width: 18px;
        height: 18px;
        border-top: 2px solid #fff;
        border-right: 2px solid #fff;
        -webkit-transform: rotate(315deg);
        transform: rotate(315deg);
    }
    .accordion_one .accordion_inner .closeArea .close_box a.close_btn:hover {
        opacity: .8;
    }
    a.close_btn{
        color: #fff;
    }
    
</style>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
    //  .accordion_one
        $(function(){
    //.accordion_oneの中の.accordion_headerがクリックされたら
    $('.accordion_one .accordion_header').click(function(){
        //クリックされた.accordion_oneの中の.accordion_headerに隣接する.accordion_innerが開いたり閉じたりする。
        $(this).next('.accordion_inner').slideToggle();
        $(this).toggleClass("open");
    });
    //閉じるボタンがクリックされたら
    $('a.close_btn').click(function () {
        //クリックされたa.close_btnの親要素.accordion_innerを閉じる。
        $(this).parents('.accordion_inner').slideUp();
        //クリックされたa.close_btnの親要素.accordion_innerの前要素にクラスopenがなければ追加し、あれば削除する。
        $(this).parents('.accordion_inner').prev().toggleClass("open");
    });
    });
</script>

タイトルの横に+,-ボタンがあるアコーディオン

コードは下記↓

<section class="accordion">
    <dl>
        <dt class="title"><span>タイトル1</span></dt>
        <dd class="anser"><span>内容1</span></dd>
    </dl>
    <dl>
        <dt class="title"><span>タイトル2</span></dt>
        <dd class="anser"><span>内容2</span></dd>
    </dl>
    <dl>
        <dt class="title"><span>タイトル3</span></dt>
        <dd class="anser"><span>内容3</span></dd>
    </dl>
</section>

<style>
    /* アコーディオンコンテンツの詳細 */
    .accordion dl {
        font-size: 18px;
        margin: 30px auto;
        background: #000;
        width: 80%;
    }

    /* アコーディオンのタイトル*/
    .accordion dt.title {
        position: relative;
        display: inline-block;
        font-weight: normal;
        padding: 25px 36px 26px 90px;
        position: relative;
        text-decoration: none;
        width: 80%;
        color: #fff;
        cursor: pointer;
    }

    /* アコーディオンのタイトル横の+,-*/
    .accordion dt.title:after {
        content: "";
        width: 20px;
        height: 2px;
        background: #fff;
        position: absolute;
        top: 50%;
        right: 10px;
        transform: translate(-50%, -50%) rotate(-90deg);
        transition: all .5s;
    }

    .accordion dt.title.active:after {
        transform: translate(-50%, -50%) rotate(0deg);
        background: none;
    }

    .accordion dt.title span:after {
        content: "";
        width: 20px;
        height: 2px;
        background: #fff;
        position: absolute;
        top: 50%;
        right: 10px;
        -webkit-transform: translate(-50%, -50%) rotate(-180deg);
        -ms-transform: translate(-50%, -50%) rotate(-180deg);
        transform: translate(-50%, -50%) rotate(-180deg);
        transition: all .5s;
    }

    /* アコーディオンの内容 */
    .accordion dd.anser {
        display: none;
        padding: 35px 36px 35px 90px;
        background: #fff;
        position: relative;
        border-bottom: solid 1px #ddd;
        border-right: solid 1px #ddd;
        border-left: solid 1px #ddd;
    }

    .accordion dd {
        margin: 0;
    }

</style>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
    $(document).ready(function () {
        // アコーディオン
        $('.title').on('click', function () {
            $(this).toggleClass('active');
            $(this).next(".anser").slideToggle();
        });

    });
</script>

おわりに

私自身がまだまだひよっこコーダーのため、もっとコードの短縮はできると思います。これは現時点での私のレベルになりますので、これから見返したときにもっと短いコードへ修正できるように励んでいきます。
また、このままコードを差し込んでも創造と異なったり色が違ったり~、等の問題は生じると思いますので、右クリック > 検証モードも試しながら自分の思い描いたアコーディオンメニューを作成していただければと思います。



この記事が気に入ったらサポートをしてみませんか?