モーダルのように、ユーザーに「開く・閉じる」行動を矯正させることなく、もっとライトにメッセージを表示させたい時は toast(トースト)があります。
この記事ではそんな toast UIをJavaScriptの .setTimeout()
メソッドで作ってみます。
.setTimeout()
JavaScriptの setTimeout()
は、指定した時間後に一度だけ動作するタイマーを設定するメソッドです。
setTimeout(function(){
element.style.display = "none";
}, 1500);
上記の関数は、1500=1.5秒経過後に要素の display
プロパティを none
で非表示にします。
この記事では、このメソッドを使ってtoast UIを表示させています。
ページ上部にtoastを表示するサンプル
早速サンプルです。既にこのページを表示した時に、上部にtoastが表示されたと思います。
toastは、上部からスライドインして4.5秒表示されます。
ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。
再度表示させる場合は、以下の「toastを表示」のボタンをクリックすることで、ページ上部にtoastを表示させることができるので、クリックしてみてください。
実装の手順と方法
コードの解説の前に、toastの実装の手順と方法について解説します。
使用するコードは、HTML・JavaScript・CSSの3つです。
はじめに、以下のHTMLを記述します。
「toast」は、ページの上部に表示されるものなので、構文もそれに合わせてコード上部の方に記述しましょう。
<div id="topToast">
<div class="topToastFace"><img src="https://dubdesign.net/wp-content/uploads/2020/04/face2.svg" alt="face"></div>
<div class="topToastMessege"><p>ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。</p></div>
</div>
次に、JavaScriptのコードをページに記述します。
コードは <body>〜</body>
で、</body>
の閉じタグ(クロージングタグ)の前に記述しましょう。
// ページのロードが終わったらtoast表示
const toast = document.getElementById("topToast"); // toastのID指定
window.addEventListener('load', () => { //ロード完了後イベント開始
toast.className = "show"; // toastを表示
setTimeout(function(){ toast.className = toast.className.replace("show", ""); }, 4500); // toastを4.5秒後非表示
});
最後に、CSSを記述します。
#topToast {
position: fixed;
z-index: 9999;
display: flex;
top: -140px;
left: 50%;
transform: translate(-50%, 0);
width: 100%;
max-width: 600px;
padding: 20px 25px;
border-radius: 5px;
background: rgb(189,185,255);
background: linear-gradient(90deg, rgba(189,185,255,1) 0%, rgba(103,184,255,1) 100%);
align-items: center;
justify-content: flex-start;
gap: 20px;
filter: drop-shadow(0px 2px 8px #ddd);
transition: 0.8s ease-in-out;
}
#topToast.show {
top: 40px;
}
.topToastFace {
border-radius: 9999px;
background: #fff;
box-sizing: border-box;
overflow: hidden;
width: 180px;
}
.topToastMessege p {
color: #fff;
font-size: 0.9rem;
line-height: 1.7;
margin: 0;
font-weight: 600;
letter-spacing: 0.04rem;
}
これで完成です!
ざっくりとしたコードの解説
コードは、HTML・JavaScript・CSSの3種類です。順に解説していきます。
HTML
HTMLはtoast UIに関する記述のみで、アニメーションや動きはJavaScript・CSSで定義していくので、コード自体はさほど多くなりません。
<div id="topToast">
<div class="topToastFace"><img src="https://dubdesign.net/wp-content/uploads/2020/04/face2.svg" alt="face"></div>
<div class="topToastMessege"><p>ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。ここにトーストのメッセージが表示されます。</p></div>
</div>
class名「topToastMessege」の中には、表示させたいメッセージを記述します。
JavaScript
JaavScriptは、.addEventListener
の loadイベントで発動させます。
loadイベントは、ページ全体が、スタイルシートや画像などのすべての依存するリソースを含めて読み込まれたときに発生するイベントです。
// ページのロードが終わったらtoast表示
const toast = document.getElementById("topToast"); // toastのID指定
window.addEventListener('load', () => { //ロード完了後イベント開始
toast.className = "show"; // toastを表示
setTimeout(function(){ toast.className = toast.className.replace("show", ""); }, 4500); // toastを4.5秒後非表示
});
イベント発動後は、setTimeout()
を使用してclass名「show」の付け替えで 表示・非表示を切り替えます。
CSS
CSSは、toastの親要素にあたるid名「topToast」の要素を position:fixed
で配置をして、表示になる時の「show」のclass名がつくまでは top:-140px;
でウィンドウ外に置いておきます。
#topToast {
position: fixed;
z-index: 9999;
display: flex;
top: -140px;
left: 50%;
transform: translate(-50%, 0);
width: 100%;
max-width: 600px;
padding: 20px 25px;
border-radius: 5px;
background: rgb(189,185,255);
background: linear-gradient(90deg, rgba(189,185,255,1) 0%, rgba(103,184,255,1) 100%);
align-items: center;
justify-content: flex-start;
gap: 20px;
filter: drop-shadow(0px 2px 8px #ddd);
transition: 0.8s ease-in-out;
}
#topToast.show {
top: 40px;
}
.topToastFace {
border-radius: 9999px;
background: #fff;
box-sizing: border-box;
overflow: hidden;
width: 180px;
}
.topToastMessege p {
color: #fff;
font-size: 0.9rem;
line-height: 1.7;
margin: 0;
font-weight: 600;
letter-spacing: 0.04rem;
}
そして、表示になる「show」のclass名が付いたら top:40px;
でウィンドウ内に位置を変え、そこに transition
プロパティで動きのあるアニメーションで表示させます。
それ以外の記述内容は、レイアウトや要素の大きさに関するものなので好みに応じて変更してください。
さいごに
今回はtoast UIでした。
Webサイトよりは、動的に変化するWebアプリ系に向いているUIですが、少しでもユーザーの操作がある場合や、何かメッセージを出したい場合にちょうどいいUIです。
是非、参考にしてみてください。