中央の画像を強調表示するカルーセルを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
カルーセル
中央の画像を強調表示するカルーセルを作る方法
中央の画像を強調表示するカルーセルをHTML・CSS・JavaScriptで作る方法を紹介します。1画面に複数の画像を横並びで表示し、その中でも中央にある画像だけを少し大きく、前面に出ているように見せるカルーセルです。商品画像、ギャラリー、特集バナー、コーディネート紹介など、注目させたい画像を分かりやすく見せたい場面に向いています。
このサンプルでは、6枚の画像を用意し、表示位置に応じて中央の画像へ強調用クラスを付け替えます。中央の画像は拡大表示し、影を少し強くすることで、左右の画像より目立つ見た目になります。前へ・次へボタンをクリックすると画像が横へ移動し、中央に来た画像が自動的に強調されます。
1枚ずつ切り替えるカルーセルよりも、複数の画像を比較しながら見せられるため、商品一覧や作品一覧などにも使いやすい構成です。画像ファイルを差し替えるだけで利用でき、CSSの拡大率や影の強さを変更することで、中央画像の目立たせ方も調整できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
コードをコピーして使おう!
<!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="center-image-carousel_demo">
<!-- 画像表示エリア -->
<div class="center-image-carousel_view">
<!-- 画像を重ねて配置するエリア -->
<div class="center-image-carousel_track">
<!-- 画像1:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="center-image-carousel_slide">
<img src="images/【配置した画像のファイル名1】" alt="画像1">
</div>
<!-- 画像2:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="center-image-carousel_slide">
<img src="images/【配置した画像のファイル名2】" alt="画像2">
</div>
<!-- 画像3:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="center-image-carousel_slide">
<img src="images/【配置した画像のファイル名3】" alt="画像3">
</div>
<!-- 画像4:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="center-image-carousel_slide">
<img src="images/【配置した画像のファイル名4】" alt="画像4">
</div>
<!-- 画像5:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="center-image-carousel_slide">
<img src="images/【配置した画像のファイル名5】" alt="画像5">
</div>
<!-- 画像6:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="center-image-carousel_slide">
<img src="images/【配置した画像のファイル名6】" alt="画像6">
</div>
</div>
</div>
<!-- 前へ・次へボタン -->
<div class="center-image-carousel_buttons">
<!-- 前へボタン -->
<button type="button" id="center-image-carousel-prev" aria-label="前へ">
前へ
</button>
<!-- 次へボタン -->
<button type="button" id="center-image-carousel-next" aria-label="次へ">
次へ
</button>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ページ外側の余白 */
background:#f8fafc; /* ページ背景色 */
font-family:sans-serif; /* フォント */
}
/* カルーセル全体 */
.center-image-carousel_demo{
max-width:980px; /* カルーセル全体の横幅:変更すると全体サイズが変わる */
margin:40px auto; /* 上下余白・中央寄せ */
}
/* 表示エリア */
.center-image-carousel_view{
position:relative;
overflow:hidden; /* はみ出した画像を隠す */
padding:34px 0; /* 上下余白:大きくすると中央画像の余白が広がる */
}
/* スライド管理エリア */
.center-image-carousel_track{
position:relative;
height:280px; /* 表示エリア高さ:変更するとカルーセル全体の高さが変わる */
}
/* 各画像 */
.center-image-carousel_slide{
position:absolute;
top:0;
left:50%;
width:31%; /* PC時の画像横幅:大きくすると画像が大きくなる */
height:240px; /* 画像高さ:変更すると縦サイズが変わる */
overflow:hidden;
border-radius:18px; /* 角丸 */
background:#e0f2fe; /* 読み込み中背景色 */
box-shadow:0 8px 18px rgba(15,23,42,.08); /* 通常時の影 */
opacity:0;
transform:translateX(-50%) scale(.82); /* 初期サイズ:scaleを変更すると待機画像サイズが変わる */
transition:
transform .55s ease, /* スライド速度:.55sを大きくするとゆっくり、小さくすると速くなる */
opacity .55s ease, /* フェード速度 */
box-shadow .55s ease; /* 影の変化速度 */
z-index:0;
pointer-events:none;
}
/* 画像 */
.center-image-carousel_slide img{
display:block;
width:100%;
height:100%;
object-fit:cover; /* 画像を枠いっぱいに表示 */
}
/* 左画像 */
.center-image-carousel_slide.is-left{
opacity:.65; /* 左画像の透明度 */
transform:translateX(calc(-50% - 108%)) scale(.88); /* 左位置・縮小率 */
z-index:1;
pointer-events:auto;
}
/* 中央画像 */
.center-image-carousel_slide.is-center{
opacity:1;
transform:translateX(-50%) scale(1.08); /* 拡大率:大きくすると中央画像をより強調できる */
box-shadow:0 18px 38px rgba(15,23,42,.2); /* 中央画像の影 */
z-index:3;
pointer-events:auto;
}
/* 右画像 */
.center-image-carousel_slide.is-right{
opacity:.65; /* 右画像の透明度 */
transform:translateX(calc(-50% + 108%)) scale(.88); /* 右位置・縮小率 */
z-index:1;
pointer-events:auto;
}
/* 左待機 */
.center-image-carousel_slide.is-hidden-left{
opacity:0;
transform:translateX(calc(-50% - 216%)) scale(.82); /* 左待機位置 */
}
/* 右待機 */
.center-image-carousel_slide.is-hidden-right{
opacity:0;
transform:translateX(calc(-50% + 216%)) scale(.82); /* 右待機位置 */
}
/* ボタンエリア */
.center-image-carousel_buttons{
display:flex;
justify-content:center;
gap:14px; /* ボタン間隔 */
margin-top:24px; /* カルーセルとの余白 */
}
/* ボタン */
.center-image-carousel_buttons button{
position:relative;
display:flex;
align-items:center;
justify-content:center;
width:52px; /* ボタンサイズ */
height:52px; /* ボタンサイズ */
padding:0;
border:1px solid #bfdbfe;
border-radius:50%;
background:linear-gradient(135deg,#2563eb,#1e40af);
cursor:pointer;
box-shadow:0 10px 22px rgba(37,99,235,.28);
transition:
transform .2s ease, /* ホバー速度 */
box-shadow .2s ease;
font-size:0;
}
/* 矢印 */
.center-image-carousel_buttons button::before{
content:"";
width:12px; /* 矢印サイズ */
height:12px; /* 矢印サイズ */
border-top:3px solid #fff; /* 線の太さ */
border-right:3px solid #fff;
}
/* 左矢印 */
#center-image-carousel-prev::before{
transform:rotate(-135deg);
margin-left:4px;
}
/* 右矢印 */
#center-image-carousel-next::before{
transform:rotate(45deg);
margin-right:4px;
}
/* ホバー */
.center-image-carousel_buttons button:hover{
transform:translateY(-2px); /* 浮き上がり量 */
box-shadow:0 14px 28px rgba(37,99,235,.35);
}
/* タブレット */
@media(max-width:768px){
.center-image-carousel_slide{
width:46%; /* タブレット画像幅 */
}
.center-image-carousel_slide.is-left{
transform:translateX(calc(-50% - 58%)) scale(.9);
}
.center-image-carousel_slide.is-right{
transform:translateX(calc(-50% + 58%)) scale(.9);
}
.center-image-carousel_slide.is-hidden-left{
transform:translateX(calc(-50% - 130%)) scale(.82);
}
.center-image-carousel_slide.is-hidden-right{
transform:translateX(calc(-50% + 130%)) scale(.82);
}
}
/* スマホ */
@media(max-width:600px){
.center-image-carousel_view{
padding:0;
}
.center-image-carousel_track{
height:220px; /* スマホ高さ */
}
.center-image-carousel_slide{
width:100%;
height:220px; /* スマホ画像高さ */
transform:translateX(-50%) scale(1);
}
.center-image-carousel_slide.is-left,
.center-image-carousel_slide.is-right,
.center-image-carousel_slide.is-hidden-left,
.center-image-carousel_slide.is-hidden-right{
opacity:0;
transform:translateX(-50%) scale(1);
}
.center-image-carousel_slide.is-center{
transform:translateX(-50%) scale(1);
}
}
// スライド画像一覧を取得
const centerImageCarouselSlides = document.querySelectorAll(".center-image-carousel_slide");
// 前へボタンを取得
const centerImageCarouselPrev = document.getElementById("center-image-carousel-prev");
// 次へボタンを取得
const centerImageCarouselNext = document.getElementById("center-image-carousel-next");
// 現在中央に表示している画像番号
// 0 = 1枚目、1 = 2枚目、2 = 3枚目
let centerImageCarouselCurrent = 0;
// スライドの表示状態を更新する関数
function centerImageCarouselDraw(){
// 画像の総数
const total = centerImageCarouselSlides.length;
// 中央画像の左に表示する画像番号
const leftIndex = (centerImageCarouselCurrent - 1 + total) % total;
// 中央画像の右に表示する画像番号
const rightIndex = (centerImageCarouselCurrent + 1) % total;
// すべての画像に位置用クラスを付け直す
centerImageCarouselSlides.forEach(function(slide,index){
// いったん全クラスを初期化
slide.className = "center-image-carousel_slide";
// 中央画像
if(index === centerImageCarouselCurrent){
slide.classList.add("is-center");
// 左画像
}else if(index === leftIndex){
slide.classList.add("is-left");
// 右画像
}else if(index === rightIndex){
slide.classList.add("is-right");
// それ以外の画像
}else{
// 現在位置から見た距離
const distance = (index - centerImageCarouselCurrent + total) % total;
// 左側に待機させる画像
if(distance > total / 2){
slide.classList.add("is-hidden-left");
// 右側に待機させる画像
}else{
slide.classList.add("is-hidden-right");
}
}
});
}
// 次へボタンを押した時の処理
centerImageCarouselNext.addEventListener("click", function(){
// 次の画像へ進む
// 最後の次は1枚目へ戻る
centerImageCarouselCurrent =
(centerImageCarouselCurrent + 1) % centerImageCarouselSlides.length;
// 表示を更新
centerImageCarouselDraw();
});
// 前へボタンを押した時の処理
centerImageCarouselPrev.addEventListener("click", function(){
// 前の画像へ戻る
// 1枚目の前は最後へ戻る
centerImageCarouselCurrent =
(centerImageCarouselCurrent - 1 + centerImageCarouselSlides.length) % centerImageCarouselSlides.length;
// 表示を更新
centerImageCarouselDraw();
});
// 初期表示
centerImageCarouselDraw();
ファイル構成と設置方法
このサンプルは、HTML・CSS・JavaScriptの3ファイルで構成されています。HTMLにはカルーセルのレイアウト、CSSには画像の配置や中央画像を強調表示するデザイン、JavaScriptには前へ・次へボタンによる画像切り替え処理を記述しています。サンプル画像は含まれていないため、ご自身で画像を用意してください。また、sampleフォルダ内にimagesフォルダを作成し、その中へ使用する画像を配置してください。
sample/
├── index.html
├── style.css
├── script.js
└── images/ ← このフォルダは自分で作成
├── 画像1.jpg
├── 画像2.jpg
├── 画像3.jpg
├── 画像4.jpg
├── 画像5.jpg
└── 画像6.jpg
sample/index.htmlをブラウザで開くと動作を確認できます。画像はsample/images/へ配置し、index.html内の画像ファイル名を配置した画像名へ変更してください。画像を増減する場合はHTMLの画像ブロックを追加・削除することで対応できます。中央画像の大きさはstyle.cssのtransform: scale(1.08);、左右画像の大きさはtransform: scale(.88);で変更できます。数値を大きくすると中央画像がより強調され、小さくすると左右との差が少なくなります。また、スライド速度はstyle.cssのtransition: transform .55s ease;で変更できます。.55sを大きくするとゆっくり、小さくすると速く切り替わります。画像の高さはheight:240px;、カルーセル全体の高さはheight:280px;を変更することで調整できます。
中央の画像を強調表示するカルーセルを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
コメント