画像比較スライダー
2枚の画像を重ねて、スライダーのドラッグ操作で左右に切り替えてビフォーアフターを比較できるインタラクティブな画像比較UIツールです。HTML/CSS/JSコードを取得できます。
プレビュー
<div class="comparison-view" id="my-comparison-slider">
<div class="comparison-item comparison-after">
<img src="https://web-tools.repop.jp/images/bg-image-2.webp" alt="After">
<span class="comparison-label right">プレビュー</span>
</div>
<div class="comparison-item comparison-original">
<img src="https://web-tools.repop.jp/images/bg-image-1.webp" alt="Before">
<span class="comparison-label left">オリジナル</span>
</div>
<div class="comparison-slider" id="comparison-slider">
<div class="slider-handle">↔</div>
</div>
</div>
/* スライダー全体のコンテナ */
.comparison-view {
position: relative;
width: 100%;
height: 400px;
display: flex;
--split-pos: 50%; /* 仕切り位置の初期設定(パーセンテージ) */
user-select: none;
-webkit-user-select: none;
}
/* 前面(クリップされる側)の画像アイテム */
.comparison-original {
clip-path: inset(0 calc(100% - var(--split-pos)) 0 0); /* 位置に応じて右側をクリップ */
z-index: 1;
}
/* 背面(ベースとなる側)の画像アイテム */
.comparison-after {
z-index: 0;
}
/* 各画像アイテムの配置枠 */
.comparison-item {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
/* 画像のスタイル設定 */
.comparison-item img {
width: 100%;
height: 100%;
object-fit: cover;
pointer-events: none; /* 画像自体の標準ドラッグ挙動を無効化 */
}
/* スライド用ドラッグ線(バー) */
.comparison-slider {
position: absolute;
top: 0;
left: var(--split-pos);
width: 4px;
height: 100%;
background: #00d2ff;
z-index: 3;
transform: translateX(-50%);
cursor: pointer;
box-shadow: 0 0 10px rgba(0, 210, 255, 0.5);
}
/* 中央のスライダーハンドル(丸形ノブ) */
.slider-handle {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 48px;
height: 48px;
background: #00d2ff;
color: #fff;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
z-index: 4;
font-weight: bold;
box-shadow: 0 0 20px rgba(0, 210, 255, 0.6);
cursor: pointer;
border: 3px solid rgba(255, 255, 255, 0.3);
font-size: 1.2rem;
}
/* ドラッグ動作中のカーソル指定 */
.slider-handle:active {
cursor: grabbing;
}
/* 比較用テキストラベルの共通枠 */
.comparison-label {
position: absolute;
bottom: 20px;
padding: 6px 15px;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(8px);
-webkit-backdrop-filter: blur(8px);
border-radius: 50px;
font-size: 0.85rem;
font-weight: 700;
color: #fff;
z-index: 5;
border: 1px solid rgba(255, 255, 255, 0.1);
}
/* 左ラベルの位置と装飾(オリジナル) */
.comparison-label.left {
left: 20px;
border-left: 3px solid #00d2ff;
}
/* 右ラベルの位置と装飾(プレビュー) */
.comparison-label.right {
right: 20px;
border-right: 3px solid #00d2ff;
}
// スライダー要素とコンテナ要素を取得
const container = document.querySelector('.comparison-view');
const slider = document.querySelector('#comparison-slider');
if (container && slider) {
let isDragging = false; // ドラッグ状態管理フラグ
// スライダーの位置を計算し更新する関数
const moveSlider = (e) => {
if (!isDragging) return;
const rect = container.getBoundingClientRect();
// マウス移動またはタッチ移動のX座標からコンテナ内のローカル位置を計算
const x = (e.clientX || (e.touches && e.touches[0].clientX)) - rect.left;
let percent = (x / rect.width) * 100;
// 範囲を0%〜100%に制限
if (percent < 0) percent = 0;
if (percent > 100) percent = 100;
// CSSカスタムプロパティを更新してスライド幅に反映
container.style.setProperty('--split-pos', `${percent}%`);
};
// マウスドラッグ開始
slider.addEventListener('mousedown', (e) => {
isDragging = true;
e.preventDefault(); // テキスト選択や画像の標準ドラッグ等の挙動を防止
});
// タッチドラッグ開始
slider.addEventListener('touchstart', () => {
isDragging = true;
});
// マウス・タッチ移動イベントをコンテナに登録
container.addEventListener('mousemove', moveSlider);
container.addEventListener('touchmove', moveSlider, { passive: false });
// マウス・タッチドラッグ終了
container.addEventListener('mouseup', () => {
isDragging = false;
});
container.addEventListener('touchend', () => {
isDragging = false;
});
}
機能・使い方
- プレビュー上のスライダーを左右にドラッグして、画像の前後比較の挙動を確認します。
- HTML、CSS、JavaScriptコードをそれぞれコピーして自身のサイトに配置することで、画像比較スライダーを実装できます。
画像のドラッグ操作(比較スライダー)の仕組み
画像比較スライダーは、2枚の画像を絶対配置で重ね合わせ、前面の画像にCSSの clip-path: inset() を適用して非表示領域を制御する仕組みになっています。
JavaScriptでマウスやスマートフォンのタッチドラッグ位置を取得し、コンテナに対するパーセンテージ(--split-pos)を割り出してCSS変数(カスタムプロパティ)をリアルタイムに更新することで、非常に軽快で滑らかなスライド効果を実現しています。