ライトボックス Lightbox

画像をオーバーレイで拡大表示するコンポーネント。ギャラリーや製品画像の詳細閲覧に最適。

使用場面: ギャラリーページや製品画像の拡大表示、ポートフォリオの写真閲覧 採用例: Unsplash, Flickr

ライブデモ

ソースコード

<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);">&#127748; 風景写真 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);">&#127749; 風景写真 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);">&#128247; ポートレート</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);">&#127958; 建築</div>
  </div>
</div>
<div class="demo-lightbox-overlay" style="display:none;">
  <button class="demo-lightbox-close" aria-label="閉じる">&times;</button>
  <button class="demo-lightbox-prev" aria-label="前へ">&#8249;</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="次へ">&#8250;</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対応