ライトボックス Lightbox
画像をオーバーレイで拡大表示するコンポーネント。ギャラリーや製品画像の詳細閲覧に最適。
ライブデモ
🌄 風景写真 1
🌅 風景写真 2
📷 ポートレート
🏖 建築
ソースコード
<div class="demo-lightbox-gallery">
<div class="demo-lightbox-thumb" data-index="0">
<div class="demo-lightbox-placeholder" style="background:color-mix(in srgb,var(--ui-primary) 15%,#f3f4f6);">🌄 風景写真 1</div>
</div>
<div class="demo-lightbox-thumb" data-index="1">
<div class="demo-lightbox-placeholder" style="background:color-mix(in srgb,var(--ui-primary) 10%,#f3f4f6);">🌅 風景写真 2</div>
</div>
<div class="demo-lightbox-thumb" data-index="2">
<div class="demo-lightbox-placeholder" style="background:color-mix(in srgb,var(--ui-primary) 20%,#f3f4f6);">📷 ポートレート</div>
</div>
<div class="demo-lightbox-thumb" data-index="3">
<div class="demo-lightbox-placeholder" style="background:color-mix(in srgb,var(--ui-primary) 12%,#f3f4f6);">🏖 建築</div>
</div>
</div>
<div class="demo-lightbox-overlay" style="display:none;">
<button class="demo-lightbox-close" aria-label="閉じる">×</button>
<button class="demo-lightbox-prev" aria-label="前へ">‹</button>
<div class="demo-lightbox-content">
<div class="demo-lightbox-display">拡大表示エリア</div>
<div class="demo-lightbox-caption">キャプション</div>
<div class="demo-lightbox-counter">1 / 4</div>
</div>
<button class="demo-lightbox-next" aria-label="次へ">›</button>
</div>.demo-lightbox-gallery { position: relative;
display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px;
}
.demo-lightbox-thumb {
cursor: pointer; border-radius: 8px; overflow: hidden;
transition: transform 0.2s, box-shadow 0.2s;
}
.demo-lightbox-thumb:hover {
transform: scale(1.03);
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.demo-lightbox-placeholder {
aspect-ratio: 4/3; display: flex; align-items: center;
justify-content: center; font-size: 14px; color: #666;
border-radius: 8px;
}
.demo-lightbox-overlay {
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.9); z-index: 1000;
display: flex; align-items: center; justify-content: center;
}
.demo-lightbox-close {
position: absolute; top: 16px; right: 16px;
background: none; border: none; color: #fff;
font-size: 32px; cursor: pointer; z-index: 1001;
width: 44px; height: 44px; display: flex;
align-items: center; justify-content: center;
border-radius: 50%; transition: background 0.2s;
}
.demo-lightbox-close:hover { background: rgba(255,255,255,0.1); }
.demo-lightbox-prev,
.demo-lightbox-next {
position: absolute; top: 50%; transform: translateY(-50%);
background: none; border: none; color: #fff;
font-size: 48px; cursor: pointer; padding: 16px;
transition: color 0.2s;
}
.demo-lightbox-prev { left: 8px; }
.demo-lightbox-next { right: 8px; }
.demo-lightbox-prev:hover,
.demo-lightbox-next:hover { color: var(--ui-primary); }
.demo-lightbox-content {
text-align: center; max-width: 80%; max-height: 80vh;
}
.demo-lightbox-display {
width: 400px; max-width: 100%; aspect-ratio: 4/3;
background: color-mix(in srgb, var(--ui-primary) 15%, #222);
border-radius: 8px; display: flex; align-items: center;
justify-content: center; color: #aaa; font-size: 18px;
}
.demo-lightbox-caption {
color: #ccc; font-size: 14px; margin-top: 12px;
}
.demo-lightbox-counter {
color: #888; font-size: 12px; margin-top: 4px;
}
@media (max-width: 767px) { .demo-lightbox-overlay { position: fixed !important; inset: 0 !important; z-index: 9999 !important; } }(function(){
const items = [
{ text: '\u{1F304} 風景写真 1', caption: '朝日が差し込む渓谷' },
{ text: '\u{1F305} 風景写真 2', caption: '夕焼けのビーチ' },
{ text: '\u{1F4F7} ポートレート', caption: 'スタジオ撮影' },
{ text: '\u{1F3C6} 建築', caption: 'モダン建築' }
];
let current = 0;
const overlay = document.querySelector('.demo-lightbox-overlay');
const display = overlay.querySelector('.demo-lightbox-display');
const caption = overlay.querySelector('.demo-lightbox-caption');
const counter = overlay.querySelector('.demo-lightbox-counter');
function show(i){
current = i;
display.textContent = items[i].text;
caption.textContent = items[i].caption;
counter.textContent = (i+1)+' / '+items.length;
overlay.style.display = 'flex';
}
document.querySelectorAll('.demo-lightbox-thumb').forEach(t => {
t.addEventListener('click', function(){ show(parseInt(this.dataset.index)); });
});
overlay.querySelector('.demo-lightbox-close').addEventListener('click', function(){ overlay.style.display='none'; });
overlay.querySelector('.demo-lightbox-prev').addEventListener('click', function(){ show((current-1+items.length)%items.length); });
overlay.querySelector('.demo-lightbox-next').addEventListener('click', function(){ show((current+1)%items.length); });
overlay.addEventListener('click', function(e){ if(e.target===overlay) overlay.style.display='none'; });
})();AIプロンプト
Basic
ライトボックスをHTML/CSS/JSで作ってください。サムネイルをクリックすると画像をオーバーレイで拡大表示します。
Custom
以下の仕様でライトボックスを実装してください。 - サムネイルグリッド(2x2レイアウト) - クリックでオーバーレイ拡大表示 - 前後ナビゲーション(矢印ボタン) - キャプションと画像番号表示 - プライマリカラー: #2563eb - フェードインアニメーション - 背景クリックで閉じる
Advanced
高機能なライトボックスを実装してください。 - ピンチズーム・パン操作(モバイル対応) - スワイプで前後切替 - キーボード操作(矢印キー、ESCで閉じる) - プリロード(前後の画像を先読み) - サムネイルストリップ表示 - EXIF情報表示 - aria属性とフォーカストラップ - prefers-reduced-motion対応