Gemini :スライドプログラム

2025/12/27

概要

Google Gemini 3のプログラミングの使い勝手を簡単な課題に対してどれだけ反応するか。

当サイトのトップページに設置しているJavascript製スライドの機能変更をプロンプトしてみた。

html, css , Javascript

仕様 : 表示する画像をフォルダーに格納し別のpythonプログラムで画像名のリストをjsonファイルに作成しておく。これをJavascriptでランダムにスライド表示させる。

html

.............................................. <div id="slideshow_container"> <div id="slideshow"> <img src="" class="active" alt="slideshow image"> </div> <p>Global Winterscapes</p> </div> ......................................

CSS

/* slide */
#slideshow_container {
}
#slideshow_container p {
  text-align:right;
  color:white;
  font-size:1.2rem;
  padding:0px;
  margin:0px 5px 2px 0px;
  font-family: "Monotype Corsiva", "Apple Chancery", "Lucida Calligraphy", "Palatino Linotype", "Dancing Script", cursive;
}
#slideshow {
  margin:2px auto;
  position: relative;
  width: 80%;
  aspect-ratio: 16 / 9;
  overflow: hidden; /* 画像がはみ出さないように */
}
#slideshow img {
  position: absolute;
  top: 0;
  left: 0;  
  width: 100%;       /* 横幅を枠いっぱいにする */
  height: 100%;      /* 高さを枠いっぱいにする */
  object-fit: cover; /* 枠に合わせてトリミング(隙間なく埋める) */
  object-position: center center; /* 画像の中心を基準にする */
  opacity: 0;
  transition: opacity 2s ease-in-out, transform 12s linear;
  will-change: opacity, transform;
}
/* 表示状態(JSでこのクラスをつける) */
#slideshow img.active {
  opacity: 1;
}
/*-------------- mobile responsive -----iphone6s --------------------*/
@media screen and  (max-width: 480px) { 
#slideshow {
  margin:2px auto;
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
}

}

/* === アニメーションのバリエーション === */
/* パターンA: ズームイン */
.effect-zoom-in {
  transform: scale(1.0);
}
.effect-zoom-in.active {
  transform: scale(1.15); /* 1.15倍までゆっくり拡大 */
}

/* パターンB: ズームアウト */
.effect-zoom-out {
  transform: scale(1.15);
}
.effect-zoom-out.active {
  transform: scale(1.0);
}

/* パターンC: 左へ少しスライド */
.effect-slide-left {
  transform: translateX(50px);
}
.effect-slide-left.active {
  transform: translateX(0);
}

/* パターンD: ただのフェード(動きなし) */
.effect-fade {
  transform: scale(1.0);
}

Javascript

// 2025.12.26 fetch('topimages/images.json') .then(response => response.json()) .then(images => { const slideshow = document.getElementById('slideshow'); // 最初にHTMLにあるimg要素(あれば) const initialImg = slideshow.querySelector('img'); // アニメーションのクラス名リスト const effects = ['effect-zoom-in', 'effect-zoom-out', 'effect-slide-left', 'effect-fade']; // 初期画像の処理(あれば) if (initialImg && images.length > 0) { initialImg.src = images[Math.floor(Math.random() * images.length)]; initialImg.classList.add('active', 'effect-zoom-in'); // 最初はズームインなどで } function changeImage() { const randomIndex = Math.floor(Math.random() * images.length); const newImage = images[randomIndex]; const newImg = document.createElement('img'); newImg.src = newImage; newImg.alt = "slideshow image"; // --- 【変更点1】ランダムにエフェクトを選ぶ --- const randomEffect = effects[Math.floor(Math.random() * effects.length)]; newImg.classList.add(randomEffect); // 初期状態はopacity:0 (CSSで定義済みだが念のためクラス追加前に追加) slideshow.appendChild(newImg); // --- 【変更点2】フェードイン開始 --- // ブラウザの描画タイミングを待ってからactiveクラス(opacity:1 + transform)を付与 requestAnimationFrame(() => { requestAnimationFrame(() => { newImg.classList.add('active'); }); }); // --- 【変更点3】古い画像の削除タイミング --- // CSSのtransition: opacity 2s に合わせ、完全に重なり終わってから削除する setTimeout(() => { const oldImgs = slideshow.querySelectorAll('img'); // 新しい画像(最後に追加されたもの)以外を削除 if (oldImgs.length > 1) { // 念のため、現在表示中の画像以外をループで削除 for (let i = 0; i < oldImgs.length - 1; i++) { oldImgs[i].remove(); } } }, 2500); // フェード時間(2000ms)より少し長く待つのがコツ } // 12秒ごとに切り替え setInterval(changeImage, 12000); }) .catch(error => { console.error('画像リスト読み込みエラー:', error); });

コードの詳細説明

JavascriptのコードをJavascript初心者レベルで詳しく説明して。

先ほどのJavaScriptコード(改良版)を、プログラムの流れに沿ってブロックごとに翻訳・解説します。 このプログラムは、「料理(画像)のリストをもらって、新しい皿(imgタグ)を作り、盛り付け(エフェクト)をして、テーブル(画面)に出す。そして古い皿を下げる」という作業を全自動で行うロボットのようなものです。 --- 全体の流れ図 1. データの準備: 画像リスト(メニュー)を読み込む 2. ループ設定: 12秒ごとに「切り替え作業」をする予約を入れる 3. 切り替え作業(関数): * 新しい画像を作る * ランダムな動き(エフェクト)を決める * 画面に追加して、フワッと表示させる * 時間が経ったら古い画像を捨てる --- コードごとの詳しい解説 1. 画像リストの読み込み(fetch) ```javascript fetch('topimages/images.json') .then(response => response.json()) .then(images => { // ...ここにメインの処理... }) ``` * `fetch(...)`: 「`images.json` というファイルを取ってきて!」という命令です。 * `.then(...)`: 「データの読み込みが終わったら、次にこれをしてね」というつなぎ言葉です。 * `response.json()`: 読み込んだテキストデータを、JavaScriptで扱いやすい形式(配列など)に変換します。 2. 下準備(変数の設定) ```javascript const slideshow = document.getElementById('slideshow'); const effects = ['effect-zoom-in', 'effect-zoom-out', 'effect-slide-left', 'effect-fade']; ``` * `document.getElementById`: HTMLの中から `

` という箱を探して、`slideshow` という名前で操作できるようにします。 * `effects`: 前回CSSで作った「動きのパターン」の名前をリストにしています。ここから後でくじ引きをします。 3. 変化をつける関数(changeImage)の中身 ここがプログラムの心臓部です。 A. 新しい画像の作成 ```javascript const randomIndex = Math.floor(Math.random() * images.length); const newImage = images[randomIndex]; const newImg = document.createElement('img'); newImg.src = newImage; ``` * `Math.random()`: サイコロを振って、どの画像を表示するか決めます。 * `document.createElement('img')`: HTMLに直接書くのではなく、プログラムの中で新しい `` タグを作ります(まだ画面には表示されていません)。 B. 動きの抽選(ランダムエフェクト) ```javascript const randomEffect = effects[Math.floor(Math.random() * effects.length)]; newImg.classList.add(randomEffect); ``` * さきほどの `effects` リストからランダムに1つ選びます(例: `effect-zoom-in` が選ばれる)。 * `classList.add`: その画像のクラス名に追加します。これで、CSSに書いた動きの準備が整いました。 C. 画面への追加とフェードイン(重要!) ```javascript slideshow.appendChild(newImg); // ①画面に追加(透明な状態) requestAnimationFrame(() => { requestAnimationFrame(() => { newImg.classList.add('active'); // ②不透明にするクラスを追加 }); }); ``` * ① `appendChild`: ここで初めて画面上の箱の中に画像が入ります。でもCSSで `opacity: 0` になっているので、まだ見えません。 * `requestAnimationFrame`: これが初心者泣かせのポイントです。「ブラウザの描画準備が整うのを待つ」命令です。 * なぜ必要?: 画像を置いてすぐに `active`(不透明にする)をつけると、ブラウザが「最初から不透明だった」と勘違いして、フワッと現れるアニメーションをしてくれないことがあるからです。「画像を置く」→「一呼吸置く」→「表示スイッチON」とするために書いています。 D. 古い画像の削除(お片付け) ```javascript setTimeout(() => { const oldImgs = slideshow.querySelectorAll('img'); if (oldImgs.length > 1) { for (let i = 0; i < oldImgs.length - 1; i++) { oldImgs[i].remove(); } } }, 2500); ``` * `setTimeout(..., 2500)`: 「2.5秒後にこの作業をしてね」というタイマーです。 * なぜ2.5秒?: 画像がフワッと切り替わるのに2秒(CSS設定)かかります。完全に新しい画像が表示され終わってから、下の古い画像を消さないと、途中で背景が見えてしまうからです。 * `remove()`: 古い画像をHTMLから削除します。これをしないと、画像が無限に重なってブラウザが重くなります。 4. ループの実行 ```javascript setInterval(changeImage, 12000); ``` * `setInterval`: 「`changeImage` という作業を、12000ミリ秒(12秒)ごとに永遠に繰り返してね」という命令です。これでスライドショーが自動で進み続けます。 --- 初心者の方へのポイントまとめ 1. CSSとJSの役割分担: * 「どう動くか(ゆっくり拡大など)」は CSS に書いてあります。 * 「いつ動かすか」「どれを選ぶか」を JavaScript が指示しています。 2. DOM操作(ドムそうさ): * `createElement`(作る)、`appendChild`(置く)、`remove`(捨てる)。 * JavaScriptでHTMLを書き換えることを「DOM操作」と言います。これができるとWebサイトに動きが出せます。 3. 非同期(ひどうき)処理: * `fetch`(データ取得待ち)、`setTimeout`(時間待ち)、`setInterval`(定期実行)。 * 「プログラムは上から下へ一瞬で進む」だけでなく、「時間をずらして動く」命令がたくさん使われています。 このコードは、JavaScriptの基本的な重要テクニック(DOM、乱数、タイミング処理)が詰まったとても良い練習台になります!

実行サンプル

実行サンプル

感想

Javascriptコードが非常に簡潔に組まれており特にコメントが適切。第3者が解りやすいコーディングは優れたプログラミングに間違いない。

戻る
.