×ボタンで閉じられるトーストの作り方
×ボタンで閉じられるトーストの作り方を紹介します。このサンプルでは、「トーストを表示」ボタンをクリックすると画面右下へ通知が表示され、通知内の×ボタンをクリックするとトーストを閉じられます。HTML・CSS・JavaScriptのみで実装し、外部ライブラリは使用しません。
保存完了、送信完了、設定変更、お知らせなど、画面を移動せずに短いメッセージを伝えたい場面で利用できます。文字付きの閉じるボタンよりもコンパクトに配置できるため、通知メッセージの表示領域を広く保ちながら、利用者が必要なタイミングで閉じられるトーストを作成できます。
通知メッセージや表示ボタンの文字はHTMLから変更できます。CSSではトーストの表示位置、背景色、文字色、余白、角丸、影、×ボタンのサイズなどを調整できます。JavaScriptでは表示ボタンと×ボタンによる表示切り替えを行っており、レスポンシブにも対応しているため、スマートフォン・タブレット・PCで利用できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
「トーストを表示」をクリックすると画面右下へ表示され、×ボタンをクリックすると非表示になります。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>×ボタンで閉じられるトースト</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- トースト表示エリア -->
<div class="x-button-toast_wrap">
<!-- タイトル -->
<div class="x-button-toast_title">
×ボタンで閉じられるトースト
</div>
<!-- 説明文 -->
<p class="x-button-toast_text">
ボタンをクリックすると画面右下へトーストが表示されます。
</p>
<!-- トースト表示ボタン -->
<button type="button" class="x-button-toast_open">
トーストを表示
</button>
</div>
<!-- トースト本体 -->
<div class="x-button-toast_message">
<!-- 通知内容 -->
<div class="x-button-toast_content">
保存しました
</div>
<!-- ×ボタン -->
<button
type="button"
class="x-button-toast_close"
aria-label="トーストを閉じる">
×
</button>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ブラウザ標準の外側余白を削除 */
padding:40px 20px; /* 上下40px・左右20pxの余白。値を大きくすると画面端との間隔が広がる */
background:#ffffff; /* ページ全体の背景色 */
color:#111827; /* ページ全体の基本文字色 */
font-family:sans-serif; /* ページ全体で使用するフォント */
}
/* トースト表示エリア */
.x-button-toast_wrap{
width:100%; /* 画面幅に合わせて横幅を縮小 */
max-width:700px; /* 最大横幅。値を大きくすると全体が横に広がる */
margin:40px auto; /* 上下40pxの余白を付けて左右中央へ配置 */
padding:32px; /* 内側余白。値を大きくすると内容と枠線の間隔が広がる */
border:1px solid #e5e7eb; /* 全体を囲む枠線 */
border-radius:18px; /* 全体の角丸。値を大きくすると丸みが強くなる */
background:#f8fafc; /* 表示エリアの背景色 */
text-align:center; /* 内容を中央揃えにする */
box-sizing:border-box; /* paddingとborderを横幅へ含める */
}
/* タイトル */
.x-button-toast_title{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると説明文との間隔が広がる */
font-size:22px; /* タイトルの文字サイズ。値を大きくすると文字が大きくなる */
font-weight:700; /* タイトルを太字にする */
}
/* 説明文 */
.x-button-toast_text{
margin:0 0 24px; /* 下側24pxの余白。値を大きくするとボタンとの間隔が広がる */
color:#4b5563; /* 説明文の文字色 */
line-height:1.8; /* 説明文の行間。値を大きくすると行間が広がる */
}
/* トースト表示ボタン */
.x-button-toast_open{
padding:12px 24px; /* 上下12px・左右24pxの余白。値を大きくするとボタンが大きくなる */
border:none; /* ブラウザ標準の枠線を削除 */
border-radius:8px; /* ボタンの角丸。値を大きくすると丸みが強くなる */
background:#0b6bff; /* ボタンの背景色 */
color:#ffffff; /* ボタンの文字色 */
font-size:16px; /* ボタンの文字サイズ */
font-weight:700; /* ボタンの文字を太字にする */
cursor:pointer; /* マウスを重ねたときに指の形へ変更 */
}
/* トースト本体 */
.x-button-toast_message{
position:fixed; /* 画面を基準に固定配置する */
right:24px; /* 画面右端から24px離す */
bottom:24px; /* 画面下端から24px離す */
z-index:9999; /* 他の要素より前面へ表示 */
display:flex; /* 通知内容と×ボタンを横並びにする */
align-items:center; /* 縦方向の中央へ配置 */
gap:18px; /* 通知内容と×ボタンの間隔 */
max-width:calc(100% - 48px); /* 画面幅から左右24pxずつ差し引く */
padding:14px 14px 14px 18px; /* 上14px・右14px・下14px・左18pxの内側余白 */
border-radius:10px; /* トーストの角丸。値を大きくすると丸みが強くなる */
background:#0b6bff; /* トーストの背景色 */
color:#ffffff; /* トーストの文字色 */
box-shadow:0 12px 30px rgba(0,0,0,.18); /* トーストの影 */
box-sizing:border-box; /* paddingを横幅へ含める */
opacity:0; /* 初期状態では透明にする */
visibility:hidden; /* 初期状態では非表示にする */
transform:translateY(12px); /* 初期状態では下へ12px移動 */
pointer-events:none; /* 非表示中はクリックできないようにする */
transition:.3s; /* 0.3秒で表示状態を切り替える */
}
/* トースト表示状態 */
.x-button-toast_message.is-show{
opacity:1; /* 表示状態では不透明にする */
visibility:visible; /* 表示状態では見えるようにする */
transform:translateY(0); /* 元の位置へ戻す */
pointer-events:auto; /* 表示中はクリックできるようにする */
}
/* 通知内容 */
.x-button-toast_content{
font-weight:700; /* 通知内容を太字にする */
line-height:1.6; /* 通知内容の行間 */
}
/* ×ボタン */
.x-button-toast_close{
display:flex; /* ×を中央へ配置する */
flex-shrink:0; /* ボタンが縮まないようにする */
align-items:center; /* 縦方向の中央へ配置 */
justify-content:center; /* 横方向の中央へ配置 */
width:32px; /* ボタンの横幅 */
height:32px; /* ボタンの高さ */
padding:0; /* 内側余白を削除 */
border:1px solid rgba(255,255,255,.7); /* 半透明の白い枠線 */
border-radius:50%; /* ボタンを円形にする */
background:#ffffff; /* ボタンの背景色 */
color:#0b6bff; /* ×の文字色 */
font-size:22px; /* ×の文字サイズ */
font-weight:700; /* ×を太字にする */
line-height:1; /* 行間を詰める */
cursor:pointer; /* マウスを重ねたときに指の形へ変更 */
}
/* 画面幅640px以下 */
@media (max-width:640px){
/* トースト表示エリア */
.x-button-toast_wrap{
padding:24px 18px; /* スマートフォンでは内側余白を小さくする */
}
/* トースト本体 */
.x-button-toast_message{
right:18px; /* 画面右端から18px離す */
bottom:18px; /* 画面下端から18px離す */
left:18px; /* 画面左端から18px離す */
max-width:none; /* 最大横幅の制限を解除 */
justify-content:space-between; /* 通知内容と×ボタンを左右へ配置 */
}
}
// トースト表示ボタンを取得
const xButtonToastOpen=document.querySelector(
".x-button-toast_open"
);
// トースト本体を取得
const xButtonToastMessage=document.querySelector(
".x-button-toast_message"
);
// ×ボタンを取得
const xButtonToastClose=document.querySelector(
".x-button-toast_close"
);
// トースト表示ボタンをクリックしたとき
xButtonToastOpen.addEventListener("click",function(){
// トーストを表示する
xButtonToastMessage.classList.add("is-show");
});
// ×ボタンをクリックしたとき
xButtonToastClose.addEventListener("click",function(){
// トーストを非表示にする
xButtonToastMessage.classList.remove("is-show");
});
コードをコピーする場合
使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合
HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではトーストを表示するボタンと通知本体を配置し、CSSでは画面右下へ表示するデザインや×ボタンの見た目、表示・非表示時のアニメーションを設定しています。JavaScriptでは表示ボタンを押したときにトーストを表示し、×ボタンを押したときに閉じる処理を実装しています。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはトーストを表示するボタン、通知メッセージ、×ボタンを配置するファイルです。表示する文章やボタン名を用途に合わせて変更できます。
style.cssはトースト全体のデザインを設定するファイルです。背景色、文字色、角丸、余白、影、表示位置、×ボタンのサイズや色、表示アニメーションなどを変更できます。
script.jsはトーストの表示・非表示を制御するファイルです。表示ボタンを押すとトーストを表示し、×ボタンを押すと閉じる動作を行います。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。「トーストを表示」をクリックすると画面右下へ通知が表示され、×ボタンを押すと任意のタイミングで閉じられます。
カスタマイズできる内容
index.htmlではタイトル、説明文、表示ボタンの文字、通知メッセージを変更できます。保存完了や送信完了、エラー通知など用途に合わせた内容へ変更できます。
style.cssではトーストの背景色、文字色、表示位置、横幅、余白、角丸、影、×ボタンのサイズや色、ボタンデザイン、アニメーション速度などを変更できます。用途に合わせて自由にデザインを調整できます。
script.jsでは表示・非表示の動作を編集できます。表示条件や閉じるタイミング、独自の処理を追加することも可能です。
数値調整
style.css
max-width:700px;
サンプル全体の最大横幅です。値を大きくすると全体が横へ広がり、小さくするとコンパクトになります。
padding:32px;
サンプル全体の内側余白です。値を大きくすると余白が広がり、小さくすると詰まった表示になります。
right:24px;
トーストを画面右端から配置する距離です。値を変更すると左右位置が変わります。
bottom:24px;
トーストを画面下端から配置する距離です。値を変更すると上下位置が変わります。
padding:14px 14px 14px 18px;
トースト内部の余白です。値を大きくすると通知全体にゆとりが生まれます。
gap:18px;
通知メッセージと×ボタンの間隔です。値を大きくすると離れ、小さくすると近付きます。
border-radius:10px;
トースト本体の角丸です。値を大きくすると丸みが強くなります。
width:32px;
×ボタンの横幅です。値を変更するとボタンサイズが変わります。
height:32px;
×ボタンの高さです。横幅と同じ値にすると円形を維持できます。
font-size:22px;
×記号の文字サイズです。値を大きくすると押しやすく、小さくすると控えめな表示になります。
transform:translateY(12px);
非表示時に下へ移動する距離です。値を大きくすると表示アニメーションの移動量が増えます。
transition:.3s;
表示・非表示が切り替わる時間です。0.3秒でアニメーションします。値を大きくするとゆっくり、小さくすると素早く切り替わります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxにより画面幅に合わせてレイアウトが調整されます。また、640px以下では余白やトーストの左右位置を変更しているため、スマートフォン・タブレット・PCで利用できます。
コメント