タイトルを押すと本文をふわっと表示させる/表示と非表示を切り替える【CSS+JavaScript】

表示と非表示の切り替え&表示時のアニメーションがしたくて調べた備忘録です。

  • テキストAを押すとテキストBが表示されたり消えたりする
  • 基本、テキストBは非表示の状態にして、非表示時の空白を残さない
  • テキストBの表示の際にはふわっと表示されるアニメーションをつける

出来上がりは以下のような感じ。

テキストA:ここを押すと…

テキストB:これが表示されたり消えたりするよ

ここには別の要素を置いておくよ

結論

JavaScriptとCSSを使いました。

  • クリックすると表示・非表示を切り替える→elements.classList.toggle("クラス名") を使う
  • アニメーション→CSS:animationプロパティopacityを使用
  • 空白を残さないために別途CSS:display: none;display: block;を切り替える

コード

コードは以下です。自由にコピペして使用OKです。

<div class="title">ここを押すと表示/非表示が切り替わるよ</div>
<p class="article hidden">★表示されたり消えたりするよ★</p>
<div>ここには別の要素を置いておくよ</div>
.title{
  font-weight: bold;
  cursor: pointer;
}

.title-after{
	color: #CCC;
}

.hidden {
  display: none;
}

.show {
	display: block;
  animation-name: showAnime; 
  animation-duration: 2s; 
  animation-fill-mode: forwards;
  perspective: 10; /*スマホのちらつき防止*/
  -webkit-perspective: 10;
}

@keyframes showAnime {
0% {
  opacity: 0;
  color:#000;
}
90% {
 opacity: 1;
 color:#000;
}
}
let title = document.getElementsByClassName("title")[0];
let article = document.getElementsByClassName("article")[0];

title.addEventListener("click", ()=>{
  article.classList.toggle("hidden");
  article.classList.toggle("show");
  title.classList.toggle("title-after");
});

すごくあっさりしてるので解説不要かもですが、一応説明です。

  • element.classList.toggle(“クラス名”)
    • 要素の有無を切り替える(trueの場合はfalseに、falseの場合はtrueに切り替える)
  • デフォルトでhiddenクラスをつけており以下のように動きます。
    • クリック→hiddenクラス除去+showクラス追加+tile-afterクラス追加
    • 再度クリック→hiddenクラス追加+showクラス除去+title-afterクラス除去
    • 以下繰り返し…
  • displayによる切り替えではtransitionが効かない
    • そのため、animationプロパティでopacityによってふわっとした表示を見せつつ、hiddenshowの切り替えでdisplayを使い、空白を残さないようにしています。
  • perspective-webkit-perspectiveはスマホで表示した際のちらつきを防止

details/summaryタグではだめなのか

おまけ。表示・非表示の切り替えといえばdetails/summaryタグがあります。

ここがsummaryです。そして…

ここに詳細な説明を書くことができます。

<details>
  <summary>ここがsummaryです。そして...</summary>
  <p>ここに詳細な説明を書くことができます。</p>
</details>

こちらでも以下のようなアニメーションをつけることができます。

ここがsummaryです。そして…
ここに詳細な説明を書くことができます。
アニメーションに なりましたか?
<details>
  <summary>ここがsummaryです。そして...</summary>
  <div class="content">ここに詳細な説明を書くことができます。<br/>
                       アニメーションになりましたか?</div>
</details>
details[open] .content {
 animation: fadeIn 0.5s ease;
}
@keyframes fadeIn {
  0% {
    opacity: 0; 
    transform: translateY(-10px); 
  }
  100% {
    opacity: 1;
    transform: none;
  }
}

参考:details/summaryタグ CODE-KITCHEN

「タイトルを押すと本文を表示」という意味合いではdetails/summaryタグの方がアクセシビリティ的に適切なのではないかと思います。JavaScript不要でCSSも簡潔。

…が、これには少し問題があり、上記のアニメーションはパソコンからは正常に動作するのですが、スマートフォン(iOS)のブラウザから見るとアニメーションは初回のクリックだけで、二度目以降の開閉はアニメーションなしの動きになってしまうのです。解決するには今のところJavaScriptを使用するしかないらしく。

もちろん開閉自体には支障がないので、アニメーションにこだわらない場合・HTMLとCSSで完結させたい場合はこちらの使用も検討してみてはいかがかと思います。

おわり。