3D版 中央の画像を強調表示するカルーセルを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
カルーセル
3D版 中央の画像を強調表示するカルーセルを作る方法
3D版 中央の画像を強調表示するカルーセルをHTML・CSS・JavaScriptで作る方法を紹介します。1画面に3枚の画像を表示し、中央の画像を大きく見せながら、左右の画像を内側へ傾けて立体感を出すカルーセルです。通常の横並びカルーセルよりも奥行きのある見た目になり、商品画像やギャラリー、特集バナーなどを印象的に見せたい場面で利用できます。
このサンプルでは、中央の画像を拡大表示し、左右の画像には3D回転を加えて内側を向いているように見せます。さらに、左右の画像には白い半透明のベールを重ねることで、中央の画像がより目立つ構成にしています。JavaScriptでは現在の画像番号を管理し、前へ・次へボタンをクリックすると中央画像が切り替わります。
画像は6枚を想定しており、最後の画像から最初の画像へ、最初の画像から最後の画像へも自然に切り替わる構成です。CSSの回転角度や拡大率、透明度を調整することで、3D感や中央画像の強調具合を変更できます。立体感のあるカルーセルを作りたい方におすすめのサンプルです。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマホ表示に対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>3D版 中央の画像を強調表示するカルーセル</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- 3Dカルーセル全体 -->
<div class="three-d-center-image-carousel_demo">
<!-- 画像表示エリア -->
<div class="three-d-center-image-carousel_view">
<!-- 画像を重ねて配置するエリア -->
<div class="three-d-center-image-carousel_track">
<!-- 画像1:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="three-d-center-image-carousel_slide">
<img src="images/【配置した画像のファイル名1】" alt="画像1">
</div>
<!-- 画像2:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="three-d-center-image-carousel_slide">
<img src="images/【配置した画像のファイル名2】" alt="画像2">
</div>
<!-- 画像3:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="three-d-center-image-carousel_slide">
<img src="images/【配置した画像のファイル名3】" alt="画像3">
</div>
<!-- 画像4:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="three-d-center-image-carousel_slide">
<img src="images/【配置した画像のファイル名4】" alt="画像4">
</div>
<!-- 画像5:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="three-d-center-image-carousel_slide">
<img src="images/【配置した画像のファイル名5】" alt="画像5">
</div>
<!-- 画像6:imagesフォルダに配置した画像ファイル名へ変更 -->
<div class="three-d-center-image-carousel_slide">
<img src="images/【配置した画像のファイル名6】" alt="画像6">
</div>
</div>
</div>
<!-- 前へ・次へボタン -->
<div class="three-d-center-image-carousel_buttons">
<!-- 前へボタン -->
<button type="button" id="three-d-center-image-carousel-prev" aria-label="前へ">
前へ
</button>
<!-- 次へボタン -->
<button type="button" id="three-d-center-image-carousel-next" aria-label="次へ">
次へ
</button>
</div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ページ外側の余白 */
font-family:sans-serif; /* 使用するフォント */
background:#f8fafc; /* ページ背景色 */
}
/* 3Dカルーセル全体 */
.three-d-center-image-carousel_demo{
max-width:980px; /* 最大横幅:大きくするとカルーセル全体が広くなる */
margin:40px auto; /* 上下余白と中央寄せ */
padding:24px; /* 外側余白 */
box-sizing:border-box; /* paddingを幅に含める */
}
/* 画像表示エリア */
.three-d-center-image-carousel_view{
position:relative; /* ボタン配置の基準 */
overflow:hidden; /* はみ出した画像を隠す */
padding:24px 0 18px; /* 上下余白:下余白を小さくすると画像とボタンが近づく */
perspective:1000px; /* 3Dの奥行き:数値を小さくすると立体感が強くなる */
}
/* 画像を重ねるエリア */
.three-d-center-image-carousel_track{
position:relative; /* スライド配置の基準 */
height:260px; /* 表示エリア高さ:大きくすると画像とボタンの間隔が広くなる */
transform-style:preserve-3d; /* 子要素の3D変形を維持 */
}
/* 各画像 */
.three-d-center-image-carousel_slide{
position:absolute; /* 画像を重ねて配置 */
top:0; /* 上位置 */
left:50%; /* 横中央を基準 */
width:31%; /* PC時の画像幅:大きくすると1枚が大きくなる */
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); /* 待機中の位置とサイズ */
transition:
transform .55s ease, /* スライド速度:.55sを大きくするとゆっくり、小さくすると速くなる */
opacity .55s ease, /* 透明度の変化速度 */
box-shadow .55s ease, /* 影の変化速度 */
filter .55s ease; /* 明るさ・彩度の変化速度 */
z-index:0; /* 重なり順 */
pointer-events:none; /* 非表示時はクリック不可 */
}
/* 左右画像に重ねる白いベール */
.three-d-center-image-carousel_slide::after{
content:""; /* ベール用の空要素 */
position:absolute; /* 画像全体に重ねる */
inset:0; /* 上下左右いっぱい */
background:rgba(255,255,255,.42); /* 白いベール:数値を大きくすると白っぽくなる */
opacity:0; /* 中央画像には表示しない */
transition:opacity .55s ease; /* ベールの変化速度 */
pointer-events:none; /* クリックを邪魔しない */
}
/* 画像 */
.three-d-center-image-carousel_slide img{
display:block; /* 画像下の余白を消す */
width:100%; /* 横幅いっぱい */
height:100%; /* 高さいっぱい */
object-fit:cover; /* 画像を枠いっぱいに表示 */
}
/* 左画像 */
.three-d-center-image-carousel_slide.is-left{
opacity:.9; /* 左画像の透明度 */
transform:translateX(calc(-50% - 108%)) perspective(1000px) rotateY(45deg) scale(.88); /* 左位置・内向き角度・縮小率 */
filter:saturate(.85); /* 彩度:小さくすると色が控えめになる */
z-index:1; /* 中央より後ろ */
pointer-events:auto; /* 表示中はクリック可能 */
}
/* 左画像の白いベール */
.three-d-center-image-carousel_slide.is-left::after{
opacity:1; /* 白いベールを表示 */
}
/* 中央画像 */
.three-d-center-image-carousel_slide.is-center{
opacity:1; /* 中央画像の透明度 */
transform:translateX(-50%) rotateY(0deg) scale(1.08); /* 中央画像の拡大率:大きくするとより強調 */
filter:saturate(1); /* 中央画像の彩度 */
box-shadow:0 18px 38px rgba(15,23,42,.2); /* 中央画像の影 */
z-index:3; /* 最前面 */
pointer-events:auto; /* 表示中はクリック可能 */
}
/* 右画像 */
.three-d-center-image-carousel_slide.is-right{
opacity:.9; /* 右画像の透明度 */
transform:translateX(calc(-50% + 108%)) perspective(1000px) rotateY(-45deg) scale(.88); /* 右位置・内向き角度・縮小率 */
filter:saturate(.85); /* 彩度:小さくすると色が控えめになる */
z-index:1; /* 中央より後ろ */
pointer-events:auto; /* 表示中はクリック可能 */
}
/* 右画像の白いベール */
.three-d-center-image-carousel_slide.is-right::after{
opacity:1; /* 白いベールを表示 */
}
/* 左側で待機する画像 */
.three-d-center-image-carousel_slide.is-hidden-left{
opacity:0; /* 非表示 */
transform:translateX(calc(-50% - 216%)) perspective(1000px) rotateY(45deg) scale(.82); /* 左待機位置 */
z-index:0; /* 後ろ */
}
/* 右側で待機する画像 */
.three-d-center-image-carousel_slide.is-hidden-right{
opacity:0; /* 非表示 */
transform:translateX(calc(-50% + 216%)) perspective(1000px) rotateY(-45deg) scale(.82); /* 右待機位置 */
z-index:0; /* 後ろ */
}
/* 前へ・次へボタンエリア */
.three-d-center-image-carousel_buttons{
display:flex; /* 横並び */
justify-content:center; /* 中央寄せ */
gap:14px; /* ボタン間隔 */
margin-top:8px; /* 画像との距離:大きくすると離れ、小さくすると近づく */
}
/* 前へ・次へボタン */
.three-d-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; /* ボタン内テキストを非表示 */
}
/* 矢印アイコン */
.three-d-center-image-carousel_buttons button::before{
content:""; /* 矢印用の空要素 */
width:12px; /* 矢印横幅 */
height:12px; /* 矢印高さ */
border-top:3px solid #ffffff; /* 矢印の線 */
border-right:3px solid #ffffff; /* 矢印の線 */
}
/* 前へ矢印 */
#three-d-center-image-carousel-prev::before{
transform:rotate(-135deg); /* 左向き矢印 */
margin-left:4px; /* 中央位置の微調整 */
}
/* 次へ矢印 */
#three-d-center-image-carousel-next::before{
transform:rotate(45deg); /* 右向き矢印 */
margin-right:4px; /* 中央位置の微調整 */
}
/* ボタンホバー */
.three-d-center-image-carousel_buttons button:hover{
transform:translateY(-2px); /* 浮き上がり量 */
box-shadow:0 14px 28px rgba(37,99,235,.35); /* ホバー時の影 */
}
/* タブレット表示 */
@media(max-width:768px){
.three-d-center-image-carousel_slide{
width:46%; /* タブレット時の画像幅 */
}
.three-d-center-image-carousel_slide.is-left{
transform:translateX(calc(-50% - 58%)) perspective(1000px) rotateY(38deg) scale(.9); /* タブレット時の左画像 */
}
.three-d-center-image-carousel_slide.is-right{
transform:translateX(calc(-50% + 58%)) perspective(1000px) rotateY(-38deg) scale(.9); /* タブレット時の右画像 */
}
.three-d-center-image-carousel_slide.is-hidden-left{
transform:translateX(calc(-50% - 130%)) perspective(1000px) rotateY(38deg) scale(.82); /* タブレット時の左待機 */
}
.three-d-center-image-carousel_slide.is-hidden-right{
transform:translateX(calc(-50% + 130%)) perspective(1000px) rotateY(-38deg) scale(.82); /* タブレット時の右待機 */
}
}
/* スマホ表示 */
@media(max-width:600px){
.three-d-center-image-carousel_view{
padding:0; /* スマホ時の余白 */
}
.three-d-center-image-carousel_track{
height:220px; /* スマホ時の表示高さ */
}
.three-d-center-image-carousel_slide{
width:100%; /* スマホ時は1枚表示 */
height:220px; /* スマホ時の画像高さ */
transform:translateX(-50%) scale(1); /* スマホ時は3D回転なし */
}
.three-d-center-image-carousel_slide.is-left,
.three-d-center-image-carousel_slide.is-right,
.three-d-center-image-carousel_slide.is-hidden-left,
.three-d-center-image-carousel_slide.is-hidden-right{
opacity:0; /* スマホ時は左右画像を非表示 */
transform:translateX(-50%) scale(1); /* スマホ時は中央位置で待機 */
}
.three-d-center-image-carousel_slide.is-center{
transform:translateX(-50%) scale(1); /* スマホ時は等倍表示 */
}
}
// スライド画像一覧を取得
const threeDCenterImageCarouselSlides = document.querySelectorAll(".three-d-center-image-carousel_slide");
// 前へボタンを取得
const threeDCenterImageCarouselPrev = document.getElementById("three-d-center-image-carousel-prev");
// 次へボタンを取得
const threeDCenterImageCarouselNext = document.getElementById("three-d-center-image-carousel-next");
// 現在中央に表示している画像番号
// 0 = 1枚目、1 = 2枚目、2 = 3枚目
let threeDCenterImageCarouselCurrent = 0;
// スライドの表示状態を更新する関数
function threeDCenterImageCarouselDraw(){
// 画像の総数
const total = threeDCenterImageCarouselSlides.length;
// 中央画像の左に表示する画像番号
const leftIndex = (threeDCenterImageCarouselCurrent - 1 + total) % total;
// 中央画像の右に表示する画像番号
const rightIndex = (threeDCenterImageCarouselCurrent + 1) % total;
// すべての画像に位置用クラスを付け直す
threeDCenterImageCarouselSlides.forEach(function(slide,index){
// いったん全クラスを初期化
slide.className = "three-d-center-image-carousel_slide";
// 中央画像
if(index === threeDCenterImageCarouselCurrent){
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 - threeDCenterImageCarouselCurrent + total) % total;
// 左側に待機させる画像
if(distance > total / 2){
slide.classList.add("is-hidden-left");
// 右側に待機させる画像
}else{
slide.classList.add("is-hidden-right");
}
}
});
}
// 次へボタンを押した時の処理
threeDCenterImageCarouselNext.addEventListener("click", function(){
// 次の画像へ進む
// 最後の次は1枚目へ戻る
threeDCenterImageCarouselCurrent =
(threeDCenterImageCarouselCurrent + 1) % threeDCenterImageCarouselSlides.length;
// 表示を更新
threeDCenterImageCarouselDraw();
});
// 前へボタンを押した時の処理
threeDCenterImageCarouselPrev.addEventListener("click", function(){
// 前の画像へ戻る
// 1枚目の前は最後へ戻る
threeDCenterImageCarouselCurrent =
(threeDCenterImageCarouselCurrent - 1 + threeDCenterImageCarouselSlides.length) % threeDCenterImageCarouselSlides.length;
// 表示を更新
threeDCenterImageCarouselDraw();
});
// 初期表示
threeDCenterImageCarouselDraw();
ファイル構成と設置方法
このサンプルは、HTML・CSS・JavaScriptを分離した構成です。HTMLでカルーセルのレイアウトを作成し、CSSで3D風の見た目やアニメーションを設定、JavaScriptで左右ボタンによる画像の切り替え処理を行います。表示する画像は images フォルダへ配置し、index.html の画像パスを書き換えるだけで利用できます。
sample/
├── index.html
├── style.css
├── script.js
└── images/
├── image1.jpg
├── image2.jpg
├── image3.jpg
├── image4.jpg
├── image5.jpg
└── image6.jpg
sample フォルダ内の index.html をブラウザで開くとカルーセルを確認できます。表示する画像は sample/images/ に配置し、index.html の画像ファイル名を実際の画像に合わせて変更してください。3Dの傾きや画像サイズは style.css の rotateY()、scale()、width、height を変更すると調整できます。画像切り替え速度は style.css の transition: .55s(0.55秒)を変更すると、値を大きくするとゆっくり、小さくすると速く切り替わります。
3D版 中央の画像を強調表示するカルーセルを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
コメント