タイトルを押すと本文をふわっと表示させる/表示と非表示を切り替える【CSS+JavaScript】
2021年12月8日
2021年12月10日
表示と非表示の切り替え&表示時のアニメーションがしたくて調べた備忘録です。
- テキストAを押すとテキストBが表示されたり消えたりする
- 基本、テキストBは非表示の状態にして、非表示時の空白を残さない
- テキストBの表示の際にはふわっと表示されるアニメーションをつける
出来上がりは以下のような感じ。
テキストA:ここを押すと…
ここには別の要素を置いておくよ
結論
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
によってふわっとした表示を見せつつ、hidden
とshow
の切り替えでdisplay
を使い、空白を残さないようにしています。
- そのため、animationプロパティで
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で完結させたい場合はこちらの使用も検討してみてはいかがかと思います。
おわり。