マウスホバーで自動再生が止まるカルーセルを作る方法
Webサイトで複数の画像を順番に見せたいときは、自動で画像が切り替わるカルーセルが便利です。ただし、画像を確認しようとしている間も自動再生が続くと、見ていた画像が次へ移動してしまうことがあります。そこで今回は、通常は一定時間ごとに画像を自動で送り、カルーセルへマウスホバーしている間だけ自動再生を停止するカルーセルを作ります。
パソコンでは3枚の画像を同時に表示し、3秒ごとに1枚ずつ横方向へ移動します。最後の位置まで進むと最初の位置へ戻り、そのまま自動再生を続けます。左右の矢印ボタンやドットから手動で表示位置を変更することもできるため、自動再生を待たずに見たい位置へ移動できます。
カルーセルへマウスホバーすると自動再生が停止し、マウスを外すと再び自動再生を開始します。商品画像や作品、写真などを自動で見せながら、利用者が確認しているときは表示を止めたい場面に利用できます。また、画面幅640px以下では表示枚数を1枚へ切り替えるため、スマートフォンでも画像を見やすく表示できます。
免責事項 本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
カルーセルにマウスホバーすると自動再生が停止し、マウスを外すと再開します。
画像は3秒ごとに自動で切り替わります。カルーセルにマウスホバーすると自動再生が停止し、マウスを外すと再開します。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン表示に対応 -->
<meta
name="viewport"
content="width=device-width, initial-scale=1.0"
>
<!-- ページタイトル -->
<title>マウスホバーで自動再生が止まるカルーセル</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- カルーセル操作エリア -->
<div class="hover-pause-carousel_area">
<!-- 前の画像を表示するボタン -->
<button
class="hover-pause-carousel_button"
id="hover-pause-carousel-prev"
type="button"
aria-label="前の画像を表示"
>
<!-- 左向きのSVG矢印 -->
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M15 18 9 12l6-6"></path>
</svg>
</button>
<!-- 画像表示エリア -->
<div class="hover-pause-carousel_view">
<!-- 横方向へ移動する画像一覧 -->
<div class="hover-pause-carousel_track">
<!--
使用する画像は利用者自身で用意します。
sampleフォルダ内にimagesフォルダを作成し、
image1.pngからimage6.pngまでの画像を配置してください。
-->
<!-- 1枚目の画像 -->
<div class="hover-pause-carousel_item">
<img src="images/image1.png" alt="画像1">
</div>
<!-- 2枚目の画像 -->
<div class="hover-pause-carousel_item">
<img src="images/image2.png" alt="画像2">
</div>
<!-- 3枚目の画像 -->
<div class="hover-pause-carousel_item">
<img src="images/image3.png" alt="画像3">
</div>
<!-- 4枚目の画像 -->
<div class="hover-pause-carousel_item">
<img src="images/image4.png" alt="画像4">
</div>
<!-- 5枚目の画像 -->
<div class="hover-pause-carousel_item">
<img src="images/image5.png" alt="画像5">
</div>
<!-- 6枚目の画像 -->
<div class="hover-pause-carousel_item">
<img src="images/image6.png" alt="画像6">
</div>
</div>
</div>
<!-- 次の画像を表示するボタン -->
<button
class="hover-pause-carousel_button"
id="hover-pause-carousel-next"
type="button"
aria-label="次の画像を表示"
>
<!-- 右向きのSVG矢印 -->
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="m9 18 6-6-6-6"></path>
</svg>
</button>
</div>
<!-- 現在位置を示すドット -->
<div class="hover-pause-carousel_dots">
<button class="hover-pause-carousel_dot" type="button" aria-label="1番目の位置へ移動"></button>
<button class="hover-pause-carousel_dot" type="button" aria-label="2番目の位置へ移動"></button>
<button class="hover-pause-carousel_dot" type="button" aria-label="3番目の位置へ移動"></button>
<button class="hover-pause-carousel_dot" type="button" aria-label="4番目の位置へ移動"></button>
<button class="hover-pause-carousel_dot" type="button" aria-label="5番目の位置へ移動"></button>
<button class="hover-pause-carousel_dot" type="button" aria-label="6番目の位置へ移動"></button>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。 サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptと6枚のPNG画像で構成されています。パソコンでは3枚の画像を同時に表示し、3秒ごとに1枚ずつ自動で送ります。カルーセルへマウスホバーしている間は自動再生を停止し、マウスを外すと再開します。左右の操作ボタンとドットから手動で表示位置を変更することもできます。画像は利用者自身で用意し、sampleフォルダ内のimagesフォルダへ配置します。
sample/
├── index.html
├── style.css
├── script.js
└── images/
├── image1.png
├── image2.png
├── image3.png
├── image4.png
├── image5.png
└── image6.png
各ファイルの役割
index.htmlはカルーセルを構成するファイルです。前の位置へ戻る操作ボタン、次の位置へ進む操作ボタン、6つのhover-pause-carousel_item、表示位置を直接選択するドットを記述しています。画像はimages/image1.pngからimages/image6.pngまでを参照します。画像のファイル名や代替テキストを変更する場合もindex.htmlを編集します。
style.cssはカルーセルのレイアウトとデザインを設定するファイルです。640pxより大きい画面では3枚、640px以下では1枚の画像を同時に表示します。画像の高さ、画像同士の間隔、角丸、左右の操作ボタン、ドット、画像が横方向へ移動するときのアニメーションなどもこのファイルで設定します。
script.jsは画像の移動、自動再生、マウスホバーによる停止と再開、左右の操作ボタン、ドットの操作を設定するファイルです。3秒ごとに表示位置を1つ進め、最後の位置まで進むと最初の位置へ戻ります。カルーセルへマウスカーソルが入るとmouseenterで自動再生を停止し、カルーセルから外れるとmouseleaveで自動再生を再開します。
imagesフォルダにはカルーセルで使用する画像を配置します。このサンプルではimage1.png、image2.png、image3.png、image4.png、image5.png、image6.pngの6枚のPNG画像を使用します。画像ファイルは利用者自身で用意してください。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置し、同じsampleフォルダ内へimagesフォルダを作成します。利用者自身で用意した6枚のPNG画像をimage1.png、image2.png、image3.png、image4.png、image5.png、image6.pngというファイル名でimagesフォルダへ配置してください。別のファイル名を使用する場合は、index.htmlの各img要素にあるsrcを実際の画像パスへ変更します。
すべてのファイルと画像を配置したあと、sample/index.htmlをブラウザで開きます。index.htmlから同じ階層のstyle.cssとscript.jsを読み込み、imagesフォルダ内の画像を表示します。ページを開くと自動再生が始まり、3秒ごとに画像が1枚分移動します。カルーセルへマウスホバーすると自動再生が停止し、マウスを外すと再開します。左右の操作ボタンや下部のドットから手動で表示位置を変更することもできます。
カスタマイズできる内容
index.htmlではカルーセルに表示する画像を変更できます。各img要素のsrcを使用する画像のパスへ変更し、altも画像の内容に合わせて変更してください。画像を追加または削除する場合は、hover-pause-carousel_itemとhover-pause-carousel_dotの数を合わせて変更します。
style.cssでは画像の高さ、画像同士の間隔、角丸、操作ボタンやドットの大きさ、画像が横方向へ移動する時間などを変更できます。script.jsでは自動再生の間隔や、画面幅に応じた同時表示数を変更できます。外側を囲む固定フレームや最大横幅は設けておらず、hover-pause-carousel_areaのwidth:100%;によって設置した場所の横幅に合わせて表示されます。画像にはobject-fit:cover;を使用しているため、指定した画像領域を埋めるように表示され、元画像の縦横比によっては上下または左右の一部が切り取られます。
640pxより大きい画面では3枚、640px以下では1枚を同時表示します。表示枚数を変更する場合は、style.cssで設定している画像項目の横幅と、script.jsで使用している同時表示数を合わせて変更してください。
数値調整
style.css
margin:0;
ページ全体の外側余白です。0ではブラウザ標準の外側余白を削除します。
padding:40px 20px;
ページ全体の内側余白です。40pxは上下、20pxは左右の余白です。値を大きくすると画面端との間隔が広がり、小さくすると狭くなります。
width:100%;
カルーセル操作エリアの横幅です。100%では設置した親要素の横幅いっぱいに表示されます。
gap:18px;
左右の操作ボタンと画像表示エリアの間隔です。値を大きくすると間隔が広がり、小さくすると狭くなります。
width:48px;・height:48px;
左右の操作ボタンの横幅と高さです。値を大きくするとボタンが大きくなり、小さくすると小さくなります。
padding:0;
操作ボタンに追加する内側余白です。0では追加の余白を付けません。値を大きくするとボタン内部の余白が増えます。
border-radius:50%;
操作ボタンの角丸です。横幅と高さが同じ状態で50%を指定することで円形になります。値を小さくすると丸みが弱くなります。
width:24px;・height:24px;
操作ボタン内に表示するSVG矢印の横幅と高さです。値を大きくすると矢印が大きくなり、小さくすると小さくなります。
stroke-width:2;
SVG矢印の線の太さです。値を大きくすると線が太くなり、小さくすると細くなります。
min-width:0;
画像表示エリアや各画像項目が内容によって必要以上に横へ広がることを防ぐ指定です。Flexbox内で画像表示エリアを親要素の横幅に収めるために使用します。
gap:16px;
640pxより大きい画面で使用する画像同士の間隔です。値を大きくすると画像同士が離れ、小さくすると近くなります。
transition:transform .3s ease;
画像が次の位置へ移動する時間です。.3sは0.3秒を表します。値を大きくするとゆっくり移動し、小さくすると速く移動します。
flex:0 0 calc((100% - 32px) / 3);
640pxより大きい画面で3枚の画像を同時表示するための横幅です。32pxは16pxの画像間隔2か所分で、残った横幅を3等分しています。画像同士の間隔や表示枚数を変更する場合は、この計算式も合わせて調整します。
border:1px solid #dbe4f3;
各画像項目を囲む枠線です。1pxは線の太さです。値を大きくすると枠線が太くなり、小さくすると細くなります。
border-radius:16px;
各画像の角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
width:100%;・height:220px;
画像本体の横幅と高さです。横幅100%では画像項目いっぱいに表示します。220pxを大きくすると画像が縦方向に高くなり、小さくすると低くなります。
gap:10px;
ドット同士の間隔です。値を大きくするとドット同士が離れ、小さくすると近くなります。
margin-top:24px;
画像表示部分とドットの間隔です。値を大きくすると上下の間隔が広がり、小さくすると狭くなります。
width:12px;・height:12px;
各ドットの横幅と高さです。値を大きくするとドットが大きくなり、小さくすると小さくなります。
padding:0;
ドットに追加する内側余白です。0では追加の余白を付けません。値を大きくするとドット内部の余白が増えます。
border-radius:50%;
ドットの角丸です。横幅と高さが同じ状態で50%を指定することで円形になります。値を小さくすると丸みが弱くなります。
@media (max-width:640px)
1枚表示へ切り替える基準となる画面幅です。640px以下になると、ページ全体の余白、操作ボタンと画像表示エリアの間隔、操作ボタン、SVG矢印、画像同士の間隔、各画像項目の横幅などをスマートフォン向けへ変更します。
padding:24px 12px;
640px以下で使用するページ全体の内側余白です。24pxは上下、12pxは左右の余白です。値を大きくすると画面端との間隔が広がり、小さくすると狭くなります。
gap:8px;
640px以下で使用する左右の操作ボタンと画像表示エリアの間隔です。PC表示の18pxより狭くして、画像を表示する横幅を確保します。
width:42px;・height:42px;
640px以下で使用する左右の操作ボタンの横幅と高さです。PC表示の48pxより小さくします。
width:22px;・height:22px;
640px以下で使用するSVG矢印の横幅と高さです。PC表示の24pxより小さくします。
gap:12px;
640px以下で使用する画像同士の間隔です。PC表示の16pxより狭くします。
flex:0 0 100%;
640px以下で各画像項目を画像表示エリアと同じ横幅にする指定です。100%にすることで画像を1枚ずつ表示します。値を小さくすると次の画像の一部が見える構成に変更できます。
height:220px;
640px以下で使用する画像の高さです。値を大きくすると画像が高くなり、小さくすると低くなります。
script.js
hoverPauseCarouselIndex = 0;
最初の表示位置を保持する初期値です。0は先頭の表示位置を表します。
hoverPauseCarouselTimer = null;
自動再生タイマーを開始する前の初期状態です。自動再生を開始するとタイマー情報が保存され、停止するとタイマーを解除します。
window.innerWidth <= 640 ? 1 : 3
同時表示する画像数を切り替える処理です。画面幅が640px以下の場合は1枚、それより大きい場合は3枚を同時表示します。640は切り替え基準、1と3はそれぞれの画面幅で使用する表示枚数です。style.cssの@media (max-width:640px)と同じ基準値を使用しています。
Math.max(0, ...)
移動できる最後の位置を計算するときに使用します。画像枚数が同時表示数以下の場合などでも最後の位置が負の値にならないよう、0を最小値として設定します。
parseFloat(...columnGap) || 0
CSSで設定している画像同士の間隔を取得する処理です。取得した間隔を画像1枚分の横幅と合わせて移動距離の計算に使用し、値を取得できない場合は0として計算します。
3000
自動再生の切り替え間隔です。3000ミリ秒は3秒を表します。5000へ変更すると5秒ごとになります。値を大きくすると次の画像へ移動するまでの時間が長くなり、小さくすると短くなります。
hoverPauseCarouselIndex++・hoverPauseCarouselIndex--
表示位置を1つ進める、または1つ戻す処理です。現在は1回の操作で画像1枚分移動します。
mouseenter・mouseleave
マウスホバーによる自動再生の停止と再開に使用するイベントです。mouseenterではカルーセルへマウスカーソルが入ったときに自動再生を停止し、mouseleaveではカルーセルからマウスカーソルが外れたときに自動再生を再開します。
レスポンシブ対応
このサンプルはレスポンシブ対応です。カルーセル操作エリアにはwidth:100%;を指定しているため、外側を囲む固定フレームや最大横幅を設けず、設置した親要素の横幅に合わせて表示されます。640pxより大きい画面ではflex:0 0 calc((100% - 32px) / 3);によって3枚の画像を同時表示し、画像同士には16pxの間隔を設けます。JavaScriptも3枚表示を基準に移動できる最後の位置を計算します。
画面幅640px以下では@media (max-width:640px)を使用し、ページ全体の内側余白を24px 12pxへ変更します。左右の操作ボタンと画像表示エリアの間隔は8px、操作ボタンは42px、SVG矢印は22px、画像同士の間隔は12pxへ変更し、各画像項目をflex:0 0 100%;にすることで1枚表示へ切り替えます。script.jsでもwindow.innerWidth <= 640 ? 1 : 3を使用して同じ画面幅を基準に同時表示数を切り替えます。画面幅が変更された場合は現在位置と移動できる範囲を再計算するため、スマートフォン・タブレット・PCの画面幅に合わせて利用できます。
コメント