概要と目標今まで学習した知識を使って、
モーダルウインドウを作成しよう。
今まで学習した知識を使えば、様々な機能を作ることができる
まずは、モーダルウインドウをできるだけ自力で作ってみましょう。
今まで学習した知識を使えば、様々な機能を作ることができる
まずは、モーダルウインドウをできるだけ自力で作ってみましょう。
サムネイル画像をクリックすると、大きな画像がポップアップして表示する演出はよく見かける。
このように、コンテンツをウインドウ内に重ねて表示する演出をモーダルウィンドウという。
まずは、HTMLを用意します。
img要素には、サムネイル用の画像を参照し、
a要素で、ポップアップ用の画像にリンクを指定する。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>画像のモーダルウインドウ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>画像のモーダルウインドウ</h1>
<ul>
<li>
<a href="images/pizza-large.jpg">
<img src="images/pizza-thumb.jpg" alt="ピザ">
</a>
</li>
<li>
<a href="images/pasta-large.jpg">
<img src="images/pasta-thumb.jpg" alt="パスタ">
</a>
</li>
<li>
<a href="images/hamburger-large.jpg">
<img src="images/hamburger-thumb.jpg" alt="ハンバーガー">
</a>
</li>
<li>
<a href="images/onigiri-large.jpg">
<img src="images/onigiri-thumb.jpg" alt="おにぎり">
</a>
</li>
</ul>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
<script src="app.js"></script>
</body>
</html>
クリックイベント要素のclass属性を、サムネイル画像の
a要素に指定する。
後は、jQueryで、クリックイベントのメソッドを記述する。
a要素にクリックイベント用のclass属性を記述<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>画像のモーダルウインドウ</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>画像のモーダルウインドウ</h1>
<ul>
<li>
<a href="images/pizza-large.jpg" class="js-modalWindow">
<img src="images/pizza-thumb.jpg" alt="ピザ">
</a>
</li>
<li>
<a href="images/pasta-large.jpg" class="js-modalWindow">
<img src="images/pasta-thumb.jpg" alt="パスタ">
</a>
</li>
<li>
<a href="images/hamburger-large.jpg" class="js-modalWindow">
<img src="images/hamburger-thumb.jpg" alt="ハンバーガー">
</a>
</li>
<li>
<a href="images/onigiri-large.jpg" class="js-modalWindow">
<img src="images/onigiri-thumb.jpg" alt="おにぎり">
</a>
</li>
</ul>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
<script src="app.js"></script>
</body>
</html>
$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
});
});
a要素はリンクの要素の為、 クリックしたら、リンク先のページにジャンプする。
クリックイベント内の
最後にreturn false;を追加するか、
クリックイベントの無名関数に引数を指定し、preventDefault()メソッドを使えば、
デフォルトの機能を無効化出来る。
$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// リンク機能を無効化
return false;
});
});
body要素の末尾に、div要素を追加し、
CSSでウインドウ全体がオーバーレイ(黒い半透明)になるように設定する。
body要素の子要素の末尾に、空のdiv要素を追加$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// リンク機能を無効化
return false;
});
});
body要素の末尾にdiv要素が追加されることを、.overlay {
position: fixed;
top: 0;
left: 0;
overflow: hidden;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .5);
/*
rgba ・・・ Red Green Blue Alpha
CSS3で追加された色の設定方法(IE9 〜 )
RGBを10進数で指定し、最後に透明度を 0 〜 1 の範囲で指定する(半角カンマ区切り)
*/
}
CSSで.overlayをdisplay: noneで非表示にしておき、
jQueryでフェードインさせる。
.overlayを非表示にする.overlay {
display: none;
position: fixed;
top: 0;
left: 0;
overflow: hidden;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, .5);
/*
rgba ・・・ Red Green Blue Alpha
CSS3で追加された色の設定方法(IE9 〜 )
RGBを10進数で指定し、最後に透明度を 0 〜 1 の範囲で指定する(半角カンマ区切り)
*/
}
$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// .overlay をフェードイン
$('.overlay').fadeIn(300);
// リンク機能を無効化
return false;
});
});
href属性を活用し、img要素を生成。
クリックしたサムネイル画像のhref属性に指定した、
ポップアップ用の画像ファイルのパスを取得し、
新たなimg要素を生成する。
img要素を生成し、追加しようhref属性の属性値を変数に取得する(変数名: "target")$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// .overlay をフェードイン
$('.overlay').fadeIn(300);
// イベントが発生した要素のhref属性の属性値を取得
var target = $(this).attr('href');
console.log(target);
// リンク機能を無効化
return false;
});
});
href属性の属性が取得できているかを確認
console.log()をコメントにしimg要素を文字列として変数に代入$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// .overlay をフェードイン
$('.overlay').fadeIn(300);
// イベントが発生した要素のhref属性の属性値を取得
var target = $(this).attr('href');
// console.log(target);
// 新たなimg要素を生成
var largeImg = '<img src="' + target + '" class="content">';
// リンク機能を無効化
return false;
});
});
img要素を、.overlayの子要素として追加
$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// .overlay をフェードイン
$('.overlay').fadeIn(300);
// イベントが発生した要素のhref属性の属性値を取得
var target = $(this).attr('href');
// console.log(target);
// 新たなimg要素を生成
var largeImg = '<img src="' + target + '" class="content">';
// .overlay の子要素として追加
$('.overlay').append(largeImg);
// リンク機能を無効化
return false;
});
});
positionを使って、ポップアップした画像がウインドウの中央になるようにCSSを設定。
max-width: 80%;とmax-height: 80%;も記述.content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
max-width: 80%;
max-height: 80%;
}
.overlayをクリックしたら、モーダルウィンドウを非表示にしたい。
しかし、
.overlayは、jQueryによって追加された要素のため、
イベントが設定出来ない。jQueryで追加した要素にイベントを設定するには、
イベントを設定したい
親要素にon()メソッドを設定し、on()メソッドの第二引数にセレクタを指定する。
$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// .overlay をフェードイン
$('.overlay').fadeIn(300);
// イベントが発生した要素のhref属性の属性値を取得
var target = $(this).attr('href');
// console.log(target);
// 新たなimg要素を生成
var largeImg = '<img src="' + target + '" class="content">';
// .overlay の子要素として追加
$('.overlay').append(largeImg);
// リンク機能を無効化
return false;
});
// 非表示用のクリックイベント
$('body').on('click', '.overlay', function () {
// 自身をフェードアウトで非表示にし、コールバック関数発動
$(this).fadeOut(300, function () {
// フェードアウト完了後、自身を削除
$(this).remove();
});
});
});
.overlayにマウスが乗った時の.overlay {
cursor: pointer;
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
background-color: rgba(0, 0, 0, 0.5);
/*
rgba ・・・ Red Green Blue Alpha
CSS3で追加された色の設定方法(IE9 〜 )
RGBを10進数で指定し、最後に透明度を 0 〜 1 の範囲で指定する(半角カンマ区切り)
*/
}
モーダルウィンドウを表示中に、スクロールホイールを回すと、
モーダルウィンドウの後ろにあるコンテンツが、スクロールされる。
この問題を解決するコードを追記して下さい。
(ヒント: body要素に overflow: hidden を指定すればスクロールしない)
$(function () {
/* =============================
画像のモーダルウインドウ
============================= */
$('.js-modalWindow').click(function () {
// body要素内の末尾にdiv要素を追加
$('body').append('<div class="overlay"></div>');
// .overlay をフェードイン
$('.overlay').fadeIn(300);
// イベントが発生した要素のhref属性の属性値を取得
var target = $(this).attr('href');
// console.log(target);
// 新たなimg要素を生成
var largeImg = '<img src="' + target + '" class="content">';
// .overlay の子要素として追加
$('.overlay').append(largeImg);
// body要素に is-active classを追加
$('body').addClass('is-active');
// リンク機能を無効化
return false;
});
// 非表示用のクリックイベント
$('body').on('click', '.overlay', function () {
// 自身をフェードアウトで非表示にし、コールバック関数発動
$(this).fadeOut(300, function () {
// フェードアウト完了後、自身を削除
$(this).remove();
// body要素の is-active classを外す
$('body').removeClass('is-active');
});
});
});
.is-active {
overflow: hidden;
}
解答例は全問題のチェックボックスが on になるとご覧いただけます。
今まで学習してきたものを使えば、様々な機能が作れる。
あとはそれを思いつく想像力が大切。