概要と目標今まで学習した知識を使って、
コンテンツスライダーを作成しよう。
今まで学習した知識とJavaScriptを組み合わせれば、さらにいろんな機能を作ることができる。
今回は、コンテンツスライダーをできるだけ自力で作ってみましょう。
今まで学習した知識とJavaScriptを組み合わせれば、さらにいろんな機能を作ることができる。
今回は、コンテンツスライダーをできるだけ自力で作ってみましょう。
画像やコンテンツを左右に切り替える機能をコンテンツスライダーという。
この教材のページを切り替えてる機能も同じような仕組みで動いている。
まずは、HTMLを用意します。
スライダーに表示する画像と「次」と「前」に移動するボタンを配置する。
なお、HTMLの要素が変更しても動作するように、classを指定しておく。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コンテンツスライダー</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>コンテンツスライダー</h1>
<div class="container">
<div class="slider-wrap">
<ul class="slider">
<li class="slider-item">
<img src="images/photo-sea.jpg" alt="きれいな海">
</li>
<li class="slider-item">
<img src="images/photo-mountain.jpg" alt="きれいな山">
</li>
<li class="slider-item">
<img src="images/photo-sky.jpg" alt="きれいな空">
</li>
<li class="slider-item">
<img src="images/photo-river.jpg" alt="きれいな川">
</li>
<li class="slider-item">
<img src="images/photo-town.jpg" alt="きれいな街">
</li>
</ul>
</div>
<!-- /.slider-wrap -->
<ul>
<li><button>前へ</button></li>
<li><button>次へ</button></li>
</ul>
</div>
<!-- /.container -->
<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>
floatを用いて、スライドするコンテンツを横並びにし、
1つのコンテンツだけが表示されるようにoverflow: hidden;を指定する。
後は、コンテンツの親要素をpositionで動かせば、スライダーの仕組みが出来上がる。
.container {
width: 800px;
margin: 0 auto;
}
.slider-wrap {
overflow: hidden;
}
.slider {
width: 4000px; /* 800px × 5枚 */
margin: 0;
padding: 0;
list-style: none;
}
.slider-item {
float: left;
width: 800px;
}
positionを指定し、leftを動かせば、スライドする仕組みを作る.container {
width: 800px;
margin: 0 auto;
}
.slider-wrap {
overflow: hidden;
}
.slider {
position: relative;
left: 0;
width: 4000px; /* 800px × 5枚 */
margin: 0;
padding: 0;
list-style: none;
}
.slider-item {
float: left;
width: 800px;
}
leftの値を「-800px(画像の幅分)」などに変更して、ちゃんと動くかを確認
現在表示しているコンテンツが何番目のコンテンツかを変数で管理し、
「次へ」をクリックした時、そのコンテンツの番号に、
コンテンツの幅を掛けた分「left」を移動する。「前へ」も同様の仕組みで移動させる。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コンテンツスライダー</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>コンテンツスライダー</h1>
<div class="container">
<div class="slider-wrap">
<ul class="js-slider slider">
<li class="slider-item">
<img src="images/photo-sea.jpg" alt="きれいな海">
</li>
<li class="slider-item">
<img src="images/photo-mountain.jpg" alt="きれいな山">
</li>
<li class="slider-item">
<img src="images/photo-sky.jpg" alt="きれいな空">
</li>
<li class="slider-item">
<img src="images/photo-river.jpg" alt="きれいな川">
</li>
<li class="slider-item">
<img src="images/photo-town.jpg" alt="きれいな街">
</li>
</ul>
</div>
<!-- /.slider-wrap -->
<ul>
<li><button class="js-sliderPrevButton">前へ</button></li>
<li><button class="js-sliderNextButton">次へ</button></li>
</ul>
</div>
<!-- /.container -->
<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 () {
// 現在のコンテンツ番号を変数で管理
var index = 0;
// 「前へ」ボタンが押されたとき
$('.js-sliderPrevButton').click(function () {
// 現在のコンテンツ番号に1を引く
index--;
// leftの値をアニメーションで変更
$('.js-slider').animate({
left: index * -800
}, 300);
});
// 「次へ」ボタンが押されたとき
$('.js-sliderNextButton').click(function () {
// 現在のコンテンツ番号に1を足す
index++;
// leftの値をアニメーションで変更
$('.js-slider').animate({
left: index * -800
}, 300);
});
});
今のままでは、コンテンツが存在しない場所にもスライドしてしまう。
もしも、先頭のコンテンツで「前へ」を押されれば末端に、
もしも、末端のコンテンツで「次へ」を押されれば先頭に移動するように対策する。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コンテンツスライダー</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>コンテンツスライダー</h1>
<div class="container">
<div class="slider-wrap">
<ul class="js-slider slider">
<li class="js-sliderItem slider-item">
<img src="images/photo-sea.jpg" alt="きれいな海">
</li>
<li class="js-sliderItem slider-item">
<img src="images/photo-mountain.jpg" alt="きれいな山">
</li>
<li class="js-sliderItem slider-item">
<img src="images/photo-sky.jpg" alt="きれいな空">
</li>
<li class="js-sliderItem slider-item">
<img src="images/photo-river.jpg" alt="きれいな川">
</li>
<li class="js-sliderItem slider-item">
<img src="images/photo-town.jpg" alt="きれいな街">
</li>
</ul>
</div>
<!-- /.slider-wrap -->
<ul>
<li><button class="js-sliderPrevButton">前へ</button></li>
<li><button class="js-sliderNextButton">次へ</button></li>
</ul>
</div>
<!-- /.container -->
<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 () {
// スライドコンテンツの数を取得
var count = $('.js-sliderItem').length;
// 現在のコンテンツ番号を変数で管理
var index = 0;
// 「前へ」ボタンが押されたとき
$('.js-sliderPrevButton').click(function () {
// 現在のコンテンツ番号に1を引く
index--;
// 現在のコンテンツが 「0」より小さいかチェック
if (index < 0) {
// 「0」より小さい時
index = count - 1;
}
// leftの値をアニメーションで変更
$('.js-slider').animate({
left: index * -800
}, 300);
});
// 「次へ」ボタンが押されたとき
$('.js-sliderNextButton').click(function () {
// 現在のコンテンツ番号に1を足す
index++;
// 現在のコンテンツが コンテンツの数以上かを確認
if (index > count - 1) {
// コンテンツの数より大きい
index = 0;
}
// leftの値をアニメーションで変更
$('.js-slider').animate({
left: index * -800
}, 300);
});
});
「前へ」や「次へ」を押した時の処理は、どちらもよく似ている。
目的のコンテンツまでスライドする処理を関数に登録することで、コードを効率化できる。
$(function () {
// スライドコンテンツの数を取得
var count = $('.js-sliderItem').length;
// 現在のコンテンツ番号を変数で管理
var index = 0;
// 目的のコンテンツまでスライドする関数
function sliding() {
// 現在のコンテンツが 「0」より小さいかチェック
if (index < 0) {
// 「0」より小さい時
index = count - 1;
}
// 現在のコンテンツが コンテンツの数以上かを確認
if (index > count - 1) {
// コンテンツの数より大きい
index = 0;
}
// leftの値をアニメーションで変更
$('.js-slider').animate({
left: index * -800
}, 300);
}
// 「前へ」ボタンが押されたとき
$('.js-sliderPrevButton').click(function () {
// 現在のコンテンツ番号に1を引く
index--;
sliding();
});
// 「次へ」ボタンが押されたとき
$('.js-sliderNextButton').click(function () {
// 現在のコンテンツ番号に1を足す
index++;
sliding();
});
});