▲TOPへ戻る

【css】 CSS(detailsとsummary)だけでつくるアコーディオンの実装 javascriptなし

疑似要素

detailesタグとsummaryタグ

以下のHTMLコードだけで、アコーディオンが実装されます。便利になりました。しかし、これだけでは味気ないので、CSSで装飾したいと思います。

  <details>
    <summary>ここをクリック!</summary>
    <div>こんにちは!!!</div>
  </details>
details

javascriptでつくるならこちら

javascript
【Javascript】クリックしたら展開されるアコーディオンを作る方法

CSSでカッコよく

以下のように実装しました。CSSで装飾すれば、いろいろな効果を楽しめます。以下、ポイントだけ紹介します。

HTML
  <details>
    <summary class="html">CSS</summary>
    <div class="codeWrapper">
      <pre class="line-numbers"><code class="language-html"> </code></pre>
    </div>
  </details>
CSS
  details{
    height: 10px;
    margin-bottom: 100px;
    transition: all .5s ease; 
  }
  summary{
    position: relative;
    display: flex;
    align-items: center;
    width: 100%;
    height: 40px;
    padding-top: 5px;
    padding-left: 30px;
    color: #fff;
    text-shadow: 1px 1px 1px black;
    font-size: 1.5em;
    font-weight: bold;
    transition: all .3s ease;
    cursor: pointer;
  }
  .html{
    background: rgb(255, 157, 0);             
  }
  .html:hover{
    background: rgb(165, 102, 0);
  }
  .css{
    background: rgb(0, 162, 255);
  }
  .css:hover{
    background: rgb(0, 100, 158);
  }
  .js{
    background: rgb(255, 251, 0);
  }
  .js:hover{
    background: rgb(177, 150, 0);
  }
  summary::after{
    content: '+';
    position: absolute;
    right: 20px;
    transition: all .3s ease;
  }
  details[open] summary::after{
    transform: rotate(45deg);
  }
  details[open] {
    height: 300px;
  }
  details[open] .codeWrapper{
    overflow: auto;
    animation: ani 1s ;
  }
  @keyframes ani {
    0%{
      opacity: 0;
      transform: translateY(-20px);
    }
    100%{
      opacity: 1;
      transform: none;
    }
  }
javascript
  const summary = document.querySelector("summary");

  summary.addEventListener("click", ()=>{
    summary.classList.toggle("active")
  })

detailesタグ

  details {
    height: 10px;
    transition: all 0.5s ease;  /* 動きをなめらかに */
  }
  details[open] {   /* クリックしたとき */
    height: 300px;  /* 高さはお好みで */
  }

summaryの疑似要素で「+」

 summary::after { /* 最初の状態 */
    content: "+";
    position: absolute;
    right: 20px;
    transition: all 0.3s ease;
  }
  details[open] summary::after {  /* クリックしたときに「+」⇒「×」 */
    transform: rotate(45deg);
  }

クリックしたら、ふわっと表示させる

  details[open] .codeWrapper {   /* クリックしたら表示される要素 */
    overflow: auto;
    animation: ani 1s;  /* アニメーションの指定 */
  }
  @keyframes ani {
    0% {
      opacity: 0;   /* 最初は見えない状態 */
      transform: translateY(-20px); /* 20px上にずらしておく */
    }
    100% {
      opacity: 1; /* 1秒後に見えるように */
      transform: none;  /* 20pxずらしたものを取り除く */
    }
  }
point

detailsタグとsummaryタグでアコーディオンの実装ができる。

transitionやanimationにより、動きをつける

summaryの疑似要素で「+」「×」を表現

こんな記事も読まれています。

profile

パソコン好きなガオ

コロナ禍によるステイホームを機にプログラミングを学ぶ。パソコンに関してはプロではないが、ちょっと詳しい程度。

パソコン

javascript

カメラ

ブログ