もくじ
フロントエンドの業務において、期間を指定して複数ページに表示しているバナーの切り替え・表示・非表示の制御を行いたいというご要望を頂くことが時々あります。
この記事では、JavaScriptファイルを更新することで、バナーの切り替え・表示・非表示の制御を行う方法を解説します。
以下の記事で、HTML側の日時更新のみで要素の表示切替を行う方法を解説してます。
【JavaScript】指定した日時で要素の表示・非表示を切り替える方法
もくじHTMLファイルの更新のみで要素の表示・非表示を制御実装コード使用方法1.HTMLを設置する2.CSSを設置する3.JavaScriptを設置する動作しないときに確認することdata-show・ ...
JavaScriptファイルの更新のみでバナーの切り替え・表示・非表示を制御
バナーを表示したいージに、HTML、CSS、JavaScriptファイルを設置することで、JavaScriptファイルの更新のみでバナーの表示切替を制御することが可能です。
以下のコードは複数のページに同じバナーを設置し、頻繁にバナーを切り替える必要がある場合に便利です。
実装コード
<div class="banner js-banner"></div>
<script src="/script.js"></script>
.banner_inner {
display: flex;
justify-content: center;
margin-bottom: 20px;
}
.banner_inner:last-child {
margin-bottom: 0;
}
.banner_inner img {
display: block;
max-width: 100%;
height: auto;
}
// バナー設定
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner1.jpg', // バナー画像のURL
bannerLinkUrl: 'https://webdesign-programming.com/javascript-time-limit-setting/', // バナーのリンク先URL
appearTime: '2020-01-01T00:00:00', // 表示開始(タイムスタンプまたは日付文字列)
disappearTime: '2090-12-31T23:59:59', // 表示終了日(タイムスタンプまたは日付文字列)
});
/**
* バナーを追加する関数
* @param {Object} params - バナー設定オブジェクト
*/
function addBanner(params) {
const bannerContainer = document.querySelector(params.targetContainer); // バナー表示エリアを取得
if (!bannerContainer) return; // バナー表示エリアを取得できない場合処理を中止
const imageUrl = params.imageUrl; // バナー画像のURL
// バナー画像URLが指定されていない場合は処理を中止
if (!imageUrl) return;
const appearTime = params.appearTime ? Math.floor(new Date(params.appearTime).getTime() / 1000) : false; // 表示開始時刻
const disappearTime = params.disappearTime ? Math.floor(new Date(params.disappearTime).getTime() / 1000) : false; // 表示終了時刻
// 日付形式の確認
const errors = [];
if (isNaN(appearTime)) {
errors.push('表示開始日の日付形式が不正です。');
}
if (isNaN(disappearTime)) {
errors.push('表示終了日の日付形式が不正です。');
}
if (errors.length) {
errors.forEach((err, i) => console.error(`${err}`));
return;
}
// 表示条件に合わない場合は処理を中止しバナーを表示しない
const currentTime = Math.floor(new Date().getTime() / 1000);
if ((appearTime && currentTime < appearTime) || (disappearTime && currentTime > disappearTime)) {
return;
}
// バナー表示処理
const bannerDiv = document.createElement('div');
bannerDiv.className = 'banner_inner';
const img = document.createElement('img');
img.src = imageUrl;
img.alt = 'バナー';
// リンクが設定されている場合はリンクを作成
const bannerLinkUrl = params.bannerLinkUrl ? params.bannerLinkUrl : false; // バナーのリンク先URL
if (bannerLinkUrl) {
const link = document.createElement('a');
link.href = bannerLinkUrl;
link.appendChild(img);
bannerDiv.appendChild(link);
} else {
bannerDiv.appendChild(img);
}
bannerContainer.appendChild(bannerDiv);
}
使用方法
1.バナーを表示させたいページにHTMLコンテナを設置する
まず、バナーを表示するためのHTMLコンテナを設置します。
以下はその例です。
<div class="banner js-banner"></div>
<script src="/script.js"></script>
このjs-banner
クラスが付いたdiv
が、JavaScriptでバナーを動的に追加するターゲットエリアになります。
div
タグ直下でJavaScriptファイルを読み込んでますが、読み込み場所は適宜変更してください。
js-banner
クラスが付いたdiv
より前(head
タグ内等)でJavaSctiptファイルを読み込む場合、別途JavaScriptファイルの調整が必要になります。
2.バナーを表示させたいページにCSSを追加する
次に、バナーのスタイルをCSSで設定します。
実装コードのCSSはバナーを中央に配置し、画像をレスポンシブにする例です。
必要に応じて変更してください。
3.addBanner関数に渡すパラメータの調整
最後に、addBanner関数に渡すパラメータを調整します。
// バナー設定
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner1.jpg', // バナー画像のURL
bannerLinkUrl: 'https://webdesign-programming.com/javascript-time-limit-setting/', // バナーのリンク先URL
appearTime: '2020-01-01T00:00:00', // 表示開始(タイムスタンプまたは日付文字列)
disappearTime: '2090-12-31T23:59:59', // 表示終了日(タイムスタンプまたは日付文字列)
});
- targetContainer
- バナーを表示したい場所のクラス名、ID名、またはタグ名を指定します。
※クラス名等が他の要素と重複しないように設定する必要があります
- imageUrl
- バナー画像のURLを指定します。
- bannerLinkUrl
- バナーにリンクを設定したい場合、リンク先のURLを指定します。
指定しない場合、リンク先なしのバナーを表示することが可能です。
- appearTime
- バナーを表示し始める日時を指定します。
appearTime
を指定しない場合、バナーはすぐに表示されます。
- disappearTime
- バナーを非表示にする日時を指定します。
disappearTime
を指定しない場合、バナーはページに表示されたままになります。
動作しないときに確認すること
開始日・終了日で指定する日付文字列について
2024-12-31 23:59:59
のような一般的な日付と時刻の表記形式で記述すると、一部ブラウザ(古いバージョンのsafari等)で日付と認識されない場合があります。
日付文字列が原因で動作しない場合、ISO 8601という国際標準の日時表記形式に基づいて記述してみてください。
実装コードでは、ISO 8601という国際標準の日時表記形式に基づいて記述しています(2020-01-01T00:00:00
)。
ISO 8601では、日付と時刻の間にT
入れることで、日付と時刻が一緒に書かれているということを示しています。
使用例
期間を指定せずにバナーを常に表示する
appearTime
とdisappearTime
を指定しないことで、バナーを常に表示することができます。
// バナー設定
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner1.jpg', // バナー画像のURL
bannerLinkUrl: 'https://webdesign-programming.com/javascript-time-limit-setting/', // バナーのリンク先URL
});
/**
* バナーを追加する関数
* @param {Object} params - バナー設定オブジェクト
*/
function addBanner(params) {
const bannerContainer = document.querySelector(params.targetContainer); // バナー表示エリアを取得
if (!bannerContainer) return; // バナー表示エリアを取得できない場合処理を中止
const imageUrl = params.imageUrl; // バナー画像のURL
// バナー画像URLが指定されていない場合は処理を中止
if (!imageUrl) return;
const appearTime = params.appearTime ? Math.floor(new Date(params.appearTime).getTime() / 1000) : false; // 表示開始時刻
const disappearTime = params.disappearTime ? Math.floor(new Date(params.disappearTime).getTime() / 1000) : false; // 表示終了時刻
// 日付形式の確認
const errors = [];
if (isNaN(appearTime)) {
errors.push('表示開始日の日付形式が不正です。');
}
if (isNaN(disappearTime)) {
errors.push('表示終了日の日付形式が不正です。');
}
if (errors.length) {
errors.forEach((err, i) => console.error(`${err}`));
return;
}
// 表示条件に合わない場合は処理を中止しバナーを表示しない
const currentTime = Math.floor(new Date().getTime() / 1000);
if ((appearTime && currentTime < appearTime) || (disappearTime && currentTime > disappearTime)) {
return;
}
// バナー表示処理
const bannerDiv = document.createElement('div');
bannerDiv.className = 'banner_inner';
const img = document.createElement('img');
img.src = imageUrl;
img.alt = 'バナー';
// リンクが設定されている場合はリンクを作成
const bannerLinkUrl = params.bannerLinkUrl ? params.bannerLinkUrl : false; // バナーのリンク先URL
if (bannerLinkUrl) {
const link = document.createElement('a');
link.href = bannerLinkUrl;
link.appendChild(img);
bannerDiv.appendChild(link);
} else {
bannerDiv.appendChild(img);
}
bannerContainer.appendChild(bannerDiv);
}
複数のバナーを表示する
// バナー設定
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner1.jpg', // バナー画像のURL
});
addBanner()
部分を複数回実行することで、複数のバナーを表示することができます。
// バナー設定
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner1.jpg', // バナー画像のURL
});
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner2.jpg', // バナー画像のURL
});
/**
* バナーを追加する関数
* @param {Object} params - バナー設定オブジェクト
*/
function addBanner(params) {
const bannerContainer = document.querySelector(params.targetContainer); // バナー表示エリアを取得
if (!bannerContainer) return; // バナー表示エリアを取得できない場合処理を中止
const imageUrl = params.imageUrl; // バナー画像のURL
// バナー画像URLが指定されていない場合は処理を中止
if (!imageUrl) return;
const appearTime = params.appearTime ? Math.floor(new Date(params.appearTime).getTime() / 1000) : false; // 表示開始時刻
const disappearTime = params.disappearTime ? Math.floor(new Date(params.disappearTime).getTime() / 1000) : false; // 表示終了時刻
// 日付形式の確認
const errors = [];
if (isNaN(appearTime)) {
errors.push('表示開始日の日付形式が不正です。');
}
if (isNaN(disappearTime)) {
errors.push('表示終了日の日付形式が不正です。');
}
if (errors.length) {
errors.forEach((err, i) => console.error(`${err}`));
return;
}
// 表示条件に合わない場合は処理を中止しバナーを表示しない
const currentTime = Math.floor(new Date().getTime() / 1000);
if ((appearTime && currentTime < appearTime) || (disappearTime && currentTime > disappearTime)) {
return;
}
// バナー表示処理
const bannerDiv = document.createElement('div');
bannerDiv.className = 'banner_inner';
const img = document.createElement('img');
img.src = imageUrl;
img.alt = 'バナー';
// リンクが設定されている場合はリンクを作成
const bannerLinkUrl = params.bannerLinkUrl ? params.bannerLinkUrl : false; // バナーのリンク先URL
if (bannerLinkUrl) {
const link = document.createElement('a');
link.href = bannerLinkUrl;
link.appendChild(img);
bannerDiv.appendChild(link);
} else {
bannerDiv.appendChild(img);
}
bannerContainer.appendChild(bannerDiv);
}
サンプル
期間を指定して複数のバナーの表示切り替えを制御する
以下のコードは、2020-01-01 00:00:00 から 2024-08-31 23:59:59 までは「banner1.jpg」のバナーを表示し、2024-09-01 00:00:00 以降は「banner2.jpg」を表示するように設定しています。
// バナー設定
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner1.jpg', // バナー画像のURL
appearTime: '2020-01-01T00:00:00', // 表示開始(タイムスタンプまたは日付文字列)
disappearTime: '2024-08-31T23:59:59', // 表示終了日(タイムスタンプまたは日付文字列)
});
addBanner({
targetContainer: '.js-banner', // バナー表示エリアを取得
imageUrl: 'https://webdesign-programming.com/img/banner2.jpg', // バナー画像のURL
appearTime: '2024-09-01T00:00:00', // 表示開始(タイムスタンプまたは日付文字列)
});
/**
* バナーを追加する関数
* @param {Object} params - バナー設定オブジェクト
*/
function addBanner(params) {
const bannerContainer = document.querySelector(params.targetContainer); // バナー表示エリアを取得
if (!bannerContainer) return; // バナー表示エリアを取得できない場合処理を中止
const imageUrl = params.imageUrl; // バナー画像のURL
// バナー画像URLが指定されていない場合は処理を中止
if (!imageUrl) return;
const appearTime = params.appearTime ? Math.floor(new Date(params.appearTime).getTime() / 1000) : false; // 表示開始時刻
const disappearTime = params.disappearTime ? Math.floor(new Date(params.disappearTime).getTime() / 1000) : false; // 表示終了時刻
// 日付形式の確認
const errors = [];
if (isNaN(appearTime)) {
errors.push('表示開始日の日付形式が不正です。');
}
if (isNaN(disappearTime)) {
errors.push('表示終了日の日付形式が不正です。');
}
if (errors.length) {
errors.forEach((err, i) => console.error(`${err}`));
return;
}
// 表示条件に合わない場合は処理を中止しバナーを表示しない
const currentTime = Math.floor(new Date().getTime() / 1000);
if ((appearTime && currentTime < appearTime) || (disappearTime && currentTime > disappearTime)) {
return;
}
// バナー表示処理
const bannerDiv = document.createElement('div');
bannerDiv.className = 'banner_inner';
const img = document.createElement('img');
img.src = imageUrl;
img.alt = 'バナー';
// リンクが設定されている場合はリンクを作成
const bannerLinkUrl = params.bannerLinkUrl ? params.bannerLinkUrl : false; // バナーのリンク先URL
if (bannerLinkUrl) {
const link = document.createElement('a');
link.href = bannerLinkUrl;
link.appendChild(img);
bannerDiv.appendChild(link);
} else {
bannerDiv.appendChild(img);
}
bannerContainer.appendChild(bannerDiv);
}
udemyでJavaScriptを学ぶ
- 本格的なWEBサイトを作成する方法について学びます。
- Sass(※以下CSSと記載)、JavaScriptの基礎について深く学びます。
- CSS、JavaScriptの実践的な記述について深く学びます。
- CSS、JavaScriptアニメーションの実装について学びます。
- 最新の実践的なWEB画面の作成方法について深く学びます。
- CSS、JavaScriptのコードの最適化、安定化について学びます。
- 維持管理、持続可能なコードの記述方法について学びます。
- ドットインストールでCSS、JavaScriptの入門編を終えたレベルの方
- 他の先生のフロントエンドの入門編を終えたレベルの方
- 自分で本格的なWEBサイトを作ってみたい方
- CSS、JavaScriptの実践的な基礎を効率的に学びたい方
- CSS、JavaScriptを今後仕事で使う予定の方
- CSS、JavaScriptのコードの整理方法について学びたい方
- CSS、JavaScriptのアニメーションを学びたい方
- CSS、JavaScriptのレベルアップしたいWeb開発初級者の方
- CSS、JavaScriptでどのようにすればレベルアップできるのか悩んでいる方
- JavaScriptの動作原理について深く学びます。
- JavaScriptがどのように実行されるのかについて深く学びます。
- ES6+の最新のJavaScriptの記法について幅広く学びます。
- 変数や参照の仕組みについて深く学びます。
- オブジェクトのメカニズムについて深く学びます。
- 関数のメカニズムについて深く学びます。
- スコープの仕組みについて深く学びます。
- プロトタイプのメカニズムについて深く学びます。
- 反復処理のメカニズムについて深く学びます。
- ジェネレーターやイテレーターについて深く学びます。
- コールバック関数について深く学びます。
- 非同期処理のメカニズムについて深く学びます。
- モジュールの仕組みについて深く学びます。
- クロージャーの仕組みについて深く学びます。
- レキシカルスコープの仕組みについて深く学びます。
- アロー関数の特徴について深く学びます。
- レキシカルスコープの仕組みについて深く学びます。
- アロー関数の特徴について深く学びます。
- thisの仕組みについて深く学びます。
- bind、apply、callの動作原理について深く学びます。
- クラスと継承の仕組みについて深く学びます。
- ReflectやProxyなどの強力なオブジェクトへの理解を深めます。
- Map,Setなどの強力なコレクションについて実践を交えて学びます。
- よく使用される強力な実装パターンを演習を交えて学びます。
- 独自のフレームワークを構築していく中でJavaScriptのメカニズムについて理解を深めます。
- JavaScriptをコアの動作原理からキチンと理解したい方。
- 自分の思った通りコードが動かずに悩んでいる方。
- 自分の思った通りに動かず、気付いたら解決するのに1日経ってしまっていた経験のある方。
- React, Vue, Angularが使いこなせず悩んでいる方。
- JavaScriptの不可解な動きが理解できず、苦しんでいる方。
- 少し複雑なコードを書こうとすると、ぐちゃぐちゃになって整理しきれず、悩んでいる方。
- JavaScriptを本気で勉強したいと思っている方。
- JavaScriptの変態仕様に苦しんでいる方。
- JavaScriptが苦手なプログラマーの方。
もみじ
JavaScripの基礎的なことを理解しており、より深くJavaScriptについて理解したいという方にオススメの講座です。
初心者の方が一度の受講で全てを吸収するのは難しいですが、繰り返し受講することでフロントエンドの業務で役立つ知識を身に付けることができます。
HTMLとCSSの知識がありJavaScriptを学びたいという方におすすめの1冊
もみじ
HTMLとCSSの知識がありJavaScriptを学びたいという方に入門書としておすすめの書籍です。
実務で役立つサンプルを手を動かしながら学ぶことができ、実践的なスキルを身に付けることができます。
JavaScriptのフロントエンドエンジニアを目指している方におすすめの1冊
もみじ
この本はJavaScript初心者からフロントエンドエンジニアを目指す方にぴったりの1冊です。
非同期処理やAJAXなど、現代の開発で必要なスキルがわかりやすく解説されており、実務で役立つスキルを学ぶことができます。
もみじ
HTML・CSS・JavaScripの基礎的なことを理解しており、Webのフロントエンジニアを目指している方にオススメの講座です。
講座内容は実践で使用するものが多く、実務でも役立つ内容でした。