JavaScriptを勉強中の方へ。この記事では、配列、乱数(Math.random)、クリックイベント(addEventListener)を使って、「今日の夕食メニューをランダムで決めるミニアプリ」の作り方を解説します。
すぐに動くサンプルコードを試しながら、配列やイベント処理などのJavaScript基本文法を実践的に学べます。
初心者の方にもわかりやすいように、コード例を丁寧に解説しているので、JavaScriptの練習として最適です。
夕食献立アプリを実際に使ってみよう
下のミニアプリでは、夕食メニューがランダムに表示されます。
ページを再読み込みすると、毎回違うメニューが自動で選ばれます。
また、「チェンジ!」ボタンを押すと、ランダムに別の献立候補が表示される仕組みです。
気に入ったメニューが出るまで、何度でも試してみてください!
今日の夕食は
【実践解説】HTML/CSS/JavaScriptでランダム献立アプリを作ろう
それでは、実際にコードを書いて夕食献立アプリを作ってみましょう。
HTML・CSS・JavaScript を使って、「配列の使い方」や「ランダムな値の生成」など、JavaScriptの基本的なテクニックを学ぶことができます。
「ボタンを押すとランダムな献立が表示される」という小さな機能にも、Webアプリを動かすための大切な要素が詰まっています。
HTML:表示エリアとチェンジボタンを用意する
<div class="randomMenu">
<p>
今日の夕食は<br /><span id="displayMenu" class="displayMenu"></span>
</p>
<button id="changeBtn" class="changeBtn">チェンジ!</button>
</div>
上記のHTMLでは、「表示エリア」と「ボタン」を用意しています。<span id="displayMenu">
の部分にランダムなメニューが表示され、<button id="changeBtn">
をクリックすると別のメニューに切り替わるしくみです。
1つの要素に id
と class
の両方を指定しているのは、JavaScriptで操作するために id
を使い、CSSでスタイルをあてるために class
を使うというのが一般的な使い方だからです。
CSS:見た目をきれいに整える
.randomMenu {
max-width: 600px;
width: 100%;
margin: 30px auto;
padding: 30px 0;
text-align: center;
border: 1px solid #ccc;
}
.randomMenu p {
font-size: 1.5em;
}
.displayMenu {
display: block;
margin: 20px;
font-size: 1.5em;
}
.changeBtn {
color: #ffffff;
background-color: #ff0000;
padding: 10px 20px;
font-size: 1.1em;
cursor: pointer;
}
.changeBtn:hover {
background-color: #cc0000;
}
CSSがなくてもアプリは動きますが、デフォルトの見た目では味気なく、使いづらい印象になります。
そこで、画面全体の中央寄せや余白の調整、文字サイズや色の設定など、最低限のスタイルを加えて見た目を整えています。
このスタイルはあくまで一例です。
ご自身の好みに合わせて色やサイズ、余白などを自由にカスタマイズしてみてください。
JavaScript:ボタンを押したときの動きを作る
Webサイトを作る際、JavaScriptのコードは主に2つの方法でHTMLに読み込ませます。
1. 外部ファイルとして読み込む方法
この方法が一般的で、おすすめの方法です。
JavaScriptのコードを「app.js」などの別のファイルに保存します。HTMLファイルには、そのファイルを読み込むためのタグを、</body>
の直前に書くだけです。
<script src="app.js"></script>
このようにすることで、HTMLとJavaScriptの役割が分かれ、コードがスッキリして管理しやすくなります。
2. HTMLファイルに直接書く方法
少しだけJavaScriptを使いたい場合に便利な方法です。
src
の部分をなくして、<script>
と</script>
の間にJavaScriptのコードを直接書き込みます。
<script>
// ここにJavaScriptのコードを書く
</script>
どちらの方法でも、スクリプトタグは</body>
の直前に置くのが一般的です。こうすることで、ページの内容がすべて読み込まれた後にJavaScriptが実行されるため、表示速度が速くなり、エラーも起きにくくなります。
以下は、今回のアプリのJavaScriptコード例です。
const menus = [
'カレーライス',
'ハンバーグ',
'トンカツ',
'パスタ',
'から揚げ',
'肉じゃが',
'オムライス',
];
const displayMenu = document.querySelector('#displayMenu');
const changeBtn = document.querySelector('#changeBtn');
// ページ読み込み時にメニューをランダム表示
const index = Math.floor(Math.random() * menus.length);
displayMenu.textContent = menus[index];
// チェンジボタンがクリックされたらメニューをランダムに切り替える
changeBtn.addEventListener('click', () => {
const index = Math.floor(Math.random() * menus.length);
displayMenu.textContent = menus[index];
});
このコードは、いくつかの料理名をまとめたリストから、毎回ランダムで一つを選んで表示するためのものです。
ページを開いた時と、「チェンジ」ボタンを押した時に、料理のリストの中からサイコロを振るようにメニューをランダムに選び直して表示しています。
JavaScriptの配列を使ってメニューを一覧にしよう
const menus = [
'カレーライス',
'ハンバーグ',
'トンカツ',
'パスタ',
'から揚げ',
'肉じゃが',
'オムライス',
];
こちらは menus
という名前の配列です。
配列は複数のデータをまとめて管理できる便利な仕組みで、
メニューは自由に書き換えたり、増やしたり減らしたりできます。
配列全体は [ ]
(角かっこ)で囲み、
それぞれの要素は ,
(カンマ)で区切ります。
例えば、配列の中の2番目のメニューを取り出すには menus[1]
と書きます。
JavaScriptの配列は番号が0から始まるため、menus[1]
は2番目の「ハンバーグ」を指します。
querySelectorでHTML要素を取得する方法
const displayMenu = document.querySelector('#displayMenu');
const changeBtn = document.querySelector('#changeBtn');
このプログラムでは、id="displayMenu"
の部分にメニューを表示し、id="changeBtn"
のボタンをクリックするとメニューが変わります。
そのため、JavaScriptでこの2つの要素を取得しています。
querySelector
を使うと、指定したCSSセレクターに合う最初の要素を取得できます。
取得した要素は変わらないので、const
(定数)として変数に代入しています。
ページ読み込み時にメニューを表示するには?
const index = Math.floor(Math.random() * menus.length);
displayMenu.textContent = menus[index];
このコードは、ページを開いたときに最初に表示されるメニューを決めています。
Math.random()
は「0以上1未満」のランダムな小数を返します。menus.length
は、配列menus
の要素数(この例では7)を表します。Math.floor()
は、小数点以下を切り捨てて整数にするメソッドです。
たとえば、Math.random()
の結果が 0.4
だった場合:
0.4 × 7 = 2.8 → Math.floor(2.8) = 2
つまり、index
は 2
になり、menus[2]
(トンカツ)が表示されます。
別の例で Math.random()
が 0.9
なら、6.3 → 6
なので menus[6]
(オムライス)が表示されます。
displayMenu.textContent = menus[index];
この一行で、指定されたメニューが画面に表示されます。
addEventListenerでボタンをクリックできるようにしよう
changeBtn.addEventListener('click', () => {
const index = Math.floor(Math.random() * menus.length);
displayMenu.textContent = menus[index];
});
このコードは、changeBtn
をクリックしたときの動きを定義しています。
addEventListener('click', …)
は、「クリックされたときにこれを実行してね」という命令です。- 実行する中身は、初期表示とほとんど同じで、新しいメニューをランダムに表示する処理です。
処理の流れは次の通りです。
Math.random()
で「0以上1未満」の小数をランダムに生成- それに
menus.length
(配列の要素数)を掛ける Math.floor()
で小数点以下を切り捨てて整数に- その
index
を使ってmenus[index]
の値を取得 - 取得したメニューを
displayMenu.textContent
に表示
ボタンを押すたびに index
が新しく生成されるので、表示されるメニューが毎回変わるという仕組みです。
関数にまとめてコードを見やすくしよう
ここまででアプリとしてはすでに完成していますが、おまけとして「関数」を使ってコードを整理する方法を紹介します。
初期表示の処理と、ボタンクリック時の処理は同じ内容なので、共通の処理を関数としてまとめるのが一般的です。
// 関数定義
function selectMenu() {
const index = Math.floor(Math.random() * menus.length);
displayMenu.textContent = menus[index];
}
このように selectMenu
という関数を定義しておきます。
中身はこれまでと同じで、メニューの中からランダムにひとつを選び、それを画面に表示する処理です。
定義した関数は、次のように使いたい場面で呼び出して使います。
// ページ読み込み時にメニューをランダム表示
selectMenu();
// チェンジボタンがクリックされたらメニューをランダムに切り替える
changeBtn.addEventListener('click', selectMenu);
selectMenu();
のように かっこ(()
)をつけると、その場ですぐに関数が実行されます。
addEventListener('click', selectMenu);
のように かっこをつけないと、「クリックされたら実行するよ」という意味になります。
関数はコードをスッキリさせてくれる便利なしくみですが、最初は難しく感じるかもしれません。
初心者のうちは無理に使う必要はありません。少しずつ慣れていきましょう。