はじめに
この記事を読めば、JavaScriptで座席表予約機能を簡単に作成・カスタマイズすることができるようになります。
初心者の方でも分かりやすいように、基本概念から詳しく解説していくので、ぜひ最後までお読みください。
●座席表予約機能の基本概念
座席表予約機能とは、劇場や映画館、コンサート会場などで座席を選択して予約できる機能のことです。
通常、座席表は行(row)と列(column)で構成されており、座席の状態(空席・予約済み・選択中)に応じて表示が変わります。
今回は、初心者の方でも分かりやすいように、JavaScriptを使って座席表予約機能を作成・カスタマイズする方法を解説します。
●HTMLとCSSの準備
まずは、座席表を表示するためのHTMLとCSSを準備します。
下記のようなHTMLファイルを作成し、座席表の基本構造を定義しましょう。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>座席表予約機能</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="seat-map">
<!-- ここに座席表が表示されます -->
</div>
<script src="scripts.js"></script>
</body>
</html>
次に、座席表の見た目を整えるためのCSSを定義します。
下記のようなCSSファイル(styles.css)を作成し、座席のスタイルを定義しましょう。
#seat-map {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(30px, 1fr));
gap: 5px;
}
.seat {
width: 30px;
height: 30px;
border: 1px solid #000;
text-align: center;
line-height: 30px;
}
.seat.available {
background-color: #ccc;
}
.seat.reserved {
background-color: #f00;
}
.seat.selected {
background-color: #0f0;
}
これで、HTMLとCSSの準備ができました。
次に、JavaScriptで座席表予約機能を実装していきます。
●JavaScriptでの座席表予約機能の作成
まずは、座席の配置や選択、予約情報の表示を行う基本的な機能を実装していきましょう。
○サンプルコード1:座席の配置
座席を配置するために、次のようなコードをscripts.jsファイルに追加していきます。
// 座席の生成
function createSeats(row, column) {
const seatMap = document.getElementById('seat-map');
for (let i = 0; i < row; i++) {
for (let j = 0; j < column; j++) {
const seat = document.createElement('div');
seat.className = 'seat available';
seat.dataset.row = i;
seat.dataset.column = j;
seat.textContent = `${i + 1}-${j + 1}`;
seatMap.appendChild(seat);
}
}
}
// 座席の生成を実行
createSeats(5, 10);
このコードでは、createSeats
関数を定義し、引数で指定した行(row)と列(column)数分の座席を生成しています。
座席はdiv
要素として作成され、適切なクラス名とデータ属性が設定されます。
○サンプルコード2:座席の選択と解除
次に、座席の選択と解除を行う機能を実装しましょう。
// 座席のクリックイベント
function onSeatClick(event) {
const seat = event.target;
if (seat.classList.contains('available')) {
seat.classList.remove('available');
seat.classList.add('selected');
} else if (seat.classList.contains('selected')) {
seat.classList.remove('selected');
seat.classList.add('available');
}
}
// イベントリスナーを追加
document.getElementById('seat-map').addEventListener('click', onSeatClick);
このコードでは、onSeatClick
関数を定義して、座席がクリックされた際の処理を行っています。
空席の場合は選択状態に、選択状態の場合は空席に戻るようにクラス名を変更しています。
○サンプルコード3:予約情報の表示
最後に、選択された座席の予約情報を表示する機能を実装しましょう。
// 予約情報の表示
function showReservationInfo() {
const selectedSeats = document.querySelectorAll('.seat.selected');
const reservationInfo = document.getElementById('reservation-info');
reservationInfo.innerHTML = '';
selectedSeats.forEach((seat) => {
const row = seat.dataset.row;
const column = seat.dataset.column;
const seatInfo = document.createElement('li');
seatInfo.textContent = `座席:${row + 1}-${column + 1}`;
reservationInfo.appendChild(seatInfo);
});
}
// 予約情報の表示を更新
document.getElementById('seat-map').addEventListener('click', showReservationInfo);
このコードでは、showReservationInfo
関数を定義し、選択された座席の予約情報を表示する処理を行っています。
選択された座席のデータ属性から行と列の情報を取得し、リスト要素にして表示しています。
座席がクリックされるたびに予約情報が更新されるよう、イベントリスナーにshowReservationInfo
関数を追加しています。
これで、座席表予約機能の基本的な実装が完了しました。
次に、応用的な機能をいくつか実装していきましょう。
●応用例とサンプルコード
ここでは、基本的な座席表予約機能を拡張するための応用例とサンプルコードを提供します。
○サンプルコード4:複数の座席タイプを表示
異なる座席タイプ(通常席、特別席など)を表示する機能を実装します。
// 座席タイプのデータ
const seatTypes = [
{ type: 'normal', color: 'blue', label: '通常席' },
{ type: 'special', color: 'red', label: '特別席' },
];
// 座席タイプを適用する関数
function applySeatType(seat, type) {
seat.classList.remove('normal', 'special');
seat.classList.add(type);
seat.dataset.type = type;
}
// 座席タイプの適用例
applySeatType(document.querySelector('.seat[data-row="1"][data-column="2"]'), 'special');
このコードでは、座席タイプを定義し、座席要素に適用する関数を作成しています。
applySeatType
関数を使用して、特定の座席にタイプを適用することができます。
○サンプルコード5:座席表のスクロール機能
座席表が大きくなった際に、スクロールして表示できるようにします。
<style>
#seat-map-container {
width: 800px;
height: 600px;
overflow: auto;
}
</style>
<div id="seat-map-container">
<div id="seat-map"></div>
</div>
このコードでは、CSSスタイルを適用して、座席表を囲むコンテナにスクロール機能を追加しています。
○サンプルコード6:座席の検索機能
座席番号を入力して、該当する座席を検索・選択できるようにします。
// 座席の検索機能
function searchSeat(row, column) {
const seat = document.querySelector(`.seat[data-row="${row}"][data-column="${column}"]`);
if (seat) {
seat.click();
} else {
alert('該当する座席が見つかりませんでした。');
}
}
このコードでは、searchSeat
関数を定義し、指定された行と列に該当する座席を検索してクリック(選択)する処理を行っています。
○サンプルコード7:座席のズーム機能
座席表の拡大・縮小を実現します。
// ズームレベルの管理
let zoomLevel = 1;
// ズーム機能を適用する関数
function applyZoom(zoom) {
const seatMap = document.getElementById('seat-map');
seatMap.style.transform = `scale(${zoom})`;
}
// ズームイン
function zoomIn() {
zoomLevel += 0.1;
applyZoom(zoomLevel);
}
// ズームアウト
function zoomOut() {
zoomLevel -= 0.1;
applyZoom(zoomLevel);
}
このコードでは、ズームレベルを管理する変数 zoomLevel
を用意し、applyZoom
関数を定義して座席表にズーム変更を適用しています。
さらに、zoomIn
と zoomOut
関数を定義して、ズームレベルを増減させる処理を行っています。
○サンプルコード8:座席表のデータ保存
座席の予約情報を保存する機能を実装します。
// 座席情報の保存
function saveSeatData() {
const reservedSeats = Array.from(document.querySelectorAll('.seat.reserved'));
const seatData = reservedSeats.map(seat => ({
row: seat.dataset.row,
column: seat.dataset.column,
type: seat.dataset.type,
}));
localStorage.setItem('seatData', JSON.stringify(seatData));
}
// 座席情報の読み込み
function loadSeatData() {
const seatDataJson = localStorage.getItem('seatData');
if (seatDataJson) {
const seatData = JSON.parse(seatDataJson);
seatData.forEach(data => {
const seat = document.querySelector(`.seat[data-row="${data.row}"][data-column="${data.column}"]`);
applySeatType(seat, data.type);
seat.classList.add('reserved');
});
}
}
このコードでは、saveSeatData
関数と loadSeatData
関数を定義して、座席の予約情報を localStorage
に保存・読み込みする処理を行っています。
○サンプルコード9:座席表の印刷機能
座席表を印刷する機能を実装します。
function printSeatMap() {
window.print();
}
このコードでは、printSeatMap
関数を定義し、座席表を印刷する処理を行っています。
○サンプルコード10:座席表のレイアウト変更
座席表の行と列の数を変更する機能を実装します。
// 座席表の生成を担当する関数を更新
function createSeatMap(rows, columns) {
const seatMap = document.getElementById('seat-map');
seatMap.innerHTML = ''; // 座席表をクリア
for (let row = 1; row <= rows; row++) {
for (let column = 1; column <= columns; column++) {
const seat = document.createElement('div');
seat.className = 'seat';
seat.dataset.row = row;
seat.dataset.column = column;
seat.addEventListener('click', handleSeatClick);
seatMap.appendChild(seat);
}
const rowBreak = document.createElement('div');
rowBreak.className = 'row-break';
seatMap.appendChild(rowBreak);
}
}
// 行と列の数を変更する関数
function changeSeatLayout(rows, columns) {
createSeatMap(rows, columns);
}
// 例:10行12列の座席表に変更
changeSeatLayout(10, 12);
このコードでは、座席表の生成を担当する createSeatMap
関数を更新し、座席表をクリアしてから新しい行と列の数で座席表を生成する処理を行っています。
また、changeSeatLayout
関数を定義して、行と列の数を変更する処理を行っています。
●注意点と対処法
- ブラウザ間の互換性に注意してください。
特定のブラウザでのみ動作するコードを避け、広くサポートされている機能を利用しましょう。 - 座席表のサイズが大きくなると、パフォーマンスに影響が出る場合があります。
適切なデータ構造やアルゴリズムを使用して、効率的に処理できるようにしましょう。 - セキュリティにも注意が必要です。
ユーザー入力をそのまま使用する際は、適切なバリデーションやサニタイズを行ってください。
まとめ
このガイドでは、座席表予約機能の基本概念から応用例までを解説し、サンプルコードを提供しました。
これらのコードを参考に、独自の座席予約システムを構築できるでしょう。
注意点や対処法を押さえながら、効率的で安全な座席予約機能を実装しましょう。