Logo
Overview
AstroでLightboxを使いたい!本文で!:2025年12月25日追記

AstroでLightboxを使いたい!本文で!:2025年12月25日追記

2025/6/25
2 分で読めそう

実験用の画像

漫画のサムネいろんなSNSがあって悩む

追記(2025年12月25日)

AstroのバージョンアップでView Transitionが標準で入ったため、Geminiに助けてもらったコードが不要になりました。 以下のコードをbody閉じ直前に入れるだけでOKです。

とVSCodeがしゃべりだした。Copilotさんいたんか

<script is:inline>
document.addEventListener('astro:after-swap', () => {
if (typeof window === 'undefined' || typeof document === 'undefined') {
return; // サーバーサイドでは実行しない
}
if (typeof window.LuminousGallery === 'undefined') {
return; // LuminousGalleryが利用できない場合は何もしない
}
const triggers = document.querySelectorAll('.luminous-trigger');
if (triggers.length > 0) {
new LuminousGallery(triggers);
}
});
</script>

ほ、本当にこれだけでよくなったらしい…やった~
でもローカルでF5押して更新するととたんに動かなくなるな…

Geminiが以下のように直しました。

<script is:inline>
// まとめて一つの関数にする
function setupLuminous() {
if (typeof LuminousGallery === 'undefined') return;
const triggers = document.querySelectorAll('.luminous-trigger');
if (triggers.length > 0) {
new LuminousGallery(triggers);
}
}
// 「初回」と「遷移後」の両方に対応するイベント
document.addEventListener('astro:page-load', setupLuminous);
</script>

これで快適に!

以下は元記事の内容。

AstroでLightboxしてほしい!

.astroファイルじゃなくて.mdxで!

やった事

photoswipeを使いたかった。
英語情報はいろいろあったがGallery.astroでも作ってそこで使う話でちょっと思ってたんと違うんです…

Geminiに聞いた。

次にLuminousを使ってみた。
またダメか…と思いながら試行錯誤する事数日。

  1. CDN
    CSSはそのまま。jsだけ<script is:inline data-astro-rerun src="https://cdn.jsdelivr.net/npm/luminous-lightbox@2.4.0/dist/luminous.min.js"></script>にした
  2. これ↓をbody閉じ直前に(Gemini回答をコピペ)
<script is:inline data-astro-rerun>
// Luminous本体のJSがロードされたことを確実に確認
function getLuminousGallery() {
if (typeof window.LuminousGallery !== 'undefined') {
return window.LuminousGallery;
}
return undefined;
}
// Luminousが初期化済みかどうかを追跡するフラグ
// このフラグは、data-astro-rerun でスクリプトが再実行されるたびにリセットされる
// (スクリプトスコープなので、再実行ごとに初期状態に戻る)
let luminousInitialized = false;
function initializeLuminous() {
// サーバーサイドでの実行を防ぐガード
if (typeof window === 'undefined' || typeof document === 'undefined') {
return; // サーバーサイドでは実行しない
}
const LuminousGalleryClass = getLuminousGallery();
// LuminousGalleryがまだ利用できない場合、ログを出して処理を中断
if (typeof LuminousGalleryClass === 'undefined') {
// コンソールを埋め尽くさないよう、警告は最初の数回だけにするか、開発モードのみにする
// console.warn('LuminousGallery not yet available. Retrying...');
setTimeout(initializeLuminous, 50); // 短い間隔で再試行し、ロードを待つ
return;
}
// もしこのスクリプトブロックが既にLuminousを初期化済みなら何もしない
// ただし、data-astro-rerun の場合は、ページ遷移ごとにこのスクリプトブロックが
// 再評価されるため、このフラグだけでは不十分な場合がある。
// LuminousGallery自体が重複登録を避けるようになっているか、
// あるいは要素から既存のリスナーを削除する必要がある。
// LuminousGalleryは通常、既に初期化された要素に対しては重複登録しない。
console.log('Attempting to initialize LuminousGallery.');
try {
const triggers = document.querySelectorAll('.luminous-trigger');
if (triggers.length > 0) {
// LuminousGallery のインスタンスを新規作成
// 既存のインスタンスを破棄するロジックがあれば、ここで呼び出す
// LuminousGalleryには直接的な破棄メソッドはないため、新しいインスタンスを作成する形になる
new LuminousGallery(triggers);
console.log('LuminousGallery initialized successfully.');
luminousInitialized = true; // 初期化済みフラグを立てる
} else {
console.log('No elements with .luminous-trigger found to initialize Luminous.');
luminousInitialized = false;
}
} catch (e) {
console.error('Error initializing LuminousGallery:', e);
luminousInitialized = false;
}
}
// 初回ロード時に実行
document.addEventListener('DOMContentLoaded', initializeLuminous);
// View Transition後のページ遷移時に実行
document.addEventListener('astro:after-swap', initializeLuminous);
</script>
  1. tailwindcssと干渉してるっぽいので
    luminous-custom.cssを追加。中身は↓
src/styles/luminous-custom.css
/* 拡大表示された画像自体の中央揃え */
.lum-img {
max-width: 90% !important; /* 画面からはみ出さないように最大幅を設定(例: 90%) */
max-height: 90% !important; /* 画面からはみ出さないように最大高さを設定(例: 90%) */
margin: auto !important; /* 自動マージンで中央揃え(Flexboxと併用するとより確実) */
padding-top: 3.2rem;
display: block !important; /* Flexboxの子要素として適切に振る舞うように */
object-fit: contain !important; /* 画像がコンテナに収まるように調整 */
}

画像を横並びにするのはTailwind CSS 日本語チートシートを参考に見ながら <div class="flex justify-center gap-x-4">略</div> を追加。

参考記事

AstroでClientRouterを使っていると、ページ遷移後scriptが実行されない https://craftgear.github.io/posts/20250413/ これで延々つまってた

AstroでView Transitionsを使った時にJavascriptが動作しない場合 https://tech.kenohki.jp/journal/asto-viewtransitions-problem/ 多分これで再読み込みしないと機能しなくなってる

前提として

  • Astro使用
  • src>content…(略)ブログディレクトリ内にindex.mdxと載せたい画像がある状態

それを

import { Image } from 'astro:assets';
import manga1 from './画像1.jpg';
import manga2 from './画像2.jpg';
...

で読み込んで

<div class="flex justify-center gap-x-4">
<a class="luminous-trigger" href={manga1.src} data-caption="キャプション">
<Image
src={サムネ}
alt="文章"
width={225}
height={400}
/>
</a>
二枚目用<a以下略
</div>

で表示してる。

未解決事項

開いた瞬間は全然動作しない時があるのでまたGeminiに直してもらった。
だがマキビシは解決策無し!リロードしないと見れないまま…いちいちリロードして見る人いるわけないんだよなぁ
というわけでマキビシほぼ無い存在になりました。

マキビシについて:

Nostrを使ってはてなスターみたいなサービスを作った話

ついでの収穫

サムネいちいち作らなくても?w=200&h=200&format=webpとか書けばいいの楽ですね! でも別に小さい画像作ってくれるわけではないのか…


画像の内容について

Lightboxテスト用にざかざか適当に作った

  1. っていう詐欺電話かかってきたので。 普通に無視ガチャ切りした。
    キャラクターはマジックテープ式財布君(バリバリする)擬人化。
    黒電話?現役ですけど????
  2. SNSがたくさんあって悩んでいる画像。
    やっぱり絵文字が使えて日本語な所がいいですね!

ああ~~~これでようやく気軽にひょいっと画像付きの絵日記的なもの投げられる~~~
インポートとか書き込むのめんどいけどそのうちなんかいい感じになってくれるだろう