CSS
 Computer >> コンピューター >  >> プログラミング >> CSS

CSSとJavaScriptを使ってレスポンシブ対応のスライドショーギャラリーを作成する方法

Webサイトに画像を魅力的に表示したいとき、レスポンシブ対応のスライドショーギャラリーは非常に効果的です。本記事では、CSSとJavaScriptだけを使って、前後移動ボタン・キャプション表示・サムネイルナビゲーションを備えたスライドショーギャラリーを作成する方法を詳しく解説します。外部ライブラリ不要なので、軽量かつ自由にカスタマイズできるのが大きな魅力です。

実装例:完全なコード

以下が、CSSとJavaScriptで作成するスライドショーギャラリーの完全なサンプルコードです。

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
* {
    box-sizing: border-box;
}
.Slide {
    display: none;
}
img {
    vertical-align: middle;
    width: 100%;
    height: 400px;
}
.slideContainer {
    max-width: 600px;
    position: relative;
    margin: auto;
}
.prevBtn,
.nextBtn {
    cursor: pointer;
    position: absolute;
    top: 50%;
    width: auto;
    padding: 10px;
    background-color: rgb(255, 255, 75);
    color: rgb(50, 0, 116);
    font-weight: bolder;
    font-size: 18px;
}
.nextBtn {
    right: 0;
}
.Caption {
    color: #fbff09;
    font-weight: bold;
    font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    font-size: 25px;
    padding: 8px 12px;
    position: absolute;
    bottom: 8px;
    width: 100%;
    text-align: center;
}
.thumbnail:after {
    content: "";
    display: table;
    clear: both;
}
.thumbnail{
    margin-left: 32%;
}
.imageCol {
    float: left;
    width: 16.66%;
}
.thumbImage{
    height: 150px;
    width: 150px;
}
@media only screen and (max-width: 450px) {
    .prevBtn,
    .nextBtn,
    .Caption {
        font-size: 16px;
    }
}
</style>
</head>
<body>
<div class="slideContainer">
<div class="Slide">
<img src="https://images.pexels.com/photos/3540375/pexels-photo-3540375.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" />
<div class="Caption">Photo 1</div>
</div>
<div class="Slide">
<img src="https://images.unsplash.com/photo-1558981001-5864b3250a69?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=750&q=80" />
<div class="Caption">Photo 2</div>
</div>
<div class="Slide">
<img src="https://images.unsplash.com/photo-1584910758141-f7993f9e203d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=667&q=80" />
<div class="Caption">Photo 3</div>
</div>
<a class="prevBtn"></a>
<a class="nextBtn"></a>
</div>
<br />
<div class="thumbnail">
<div class="imageCol">
<img class="thumbImage" src="https://images.pexels.com/photos/3540375/pexels-photo-3540375.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" style="width:100%" onclick="setSlide(1)" alt="The Woods">
</div>
<div class="imageCol">
<img class="thumbImage" src="https://images.unsplash.com/photo-1558981001-5864b3250a69?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=750&q=80" style="width:100%" onclick="setSlide(2)" alt="Cinque Terre">
</div>
<div class="imageCol">
<img class="thumbImage" src="https://images.unsplash.com/photo-1584910758141-f7993f9e203d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=667&q=80" style="width:100%" onclick="setSlide(3)" alt="Mountains and fjords">
</div>
</div>
</div>
<script>
function setSlide(number){
    clearSelected();
    currentSlide(number);
    document.querySelectorAll('.thumbImage')[number-1].style.borderBottom = "6px solid purple";
}
function clearSelected(){
    Array.from(document.querySelectorAll('.thumbImage')).forEach(item=>item.style.borderBottom="");
}
document.querySelector(".prevBtn").addEventListener("click", () => {
    changeSlides(-1);
});
document.querySelector(".nextBtn").addEventListener("click", () => {
    changeSlides(1);
});
var slideIndex = 1;
showSlides(slideIndex);
function changeSlides(n) {
    showSlides((slideIndex += n));
}
function currentSlide(n) {
    showSlides((slideIndex = n));
}
function showSlides(n) {
    var i;
    var slides = document.getElementsByClassName("Slide");
    if (n > slides.length) {
        slideIndex = 1;
    }
    if (n < 1) {
        slideIndex = slides.length;
    }
    Array.from(slides).forEach(item => (item.style.display = "none"));
    slides[slideIndex - 1].style.display = "block";
}
</script>
</body>
</html>

コードのポイント解説

1. スライドの基本構造

.Slideクラスには初期状態でdisplay: noneを指定し、JavaScriptで表示・非表示を切り替えます。画像にはwidth: 100%を設定しているため、コンテナの幅に合わせて自動的に伸縮し、レスポンシブ対応が実現されています。

2. 前後ナビゲーションボタン

.prevBtn.nextBtnは、position: absolutetop: 50%を組み合わせてスライドの中央に配置します。.nextBtnにはright: 0を指定して右端に固定しています。

3. キャプションのオーバーレイ表示

.Captionクラスはposition: absolutebottom: 8pxにより、画像の下部に重ねて表示されます。背景に半透明色を加えると、さらに視認性が向上します。

4. サムネイルによる直接切り替え

下部のサムネイル画像をクリックするとsetSlide()関数が呼び出され、該当するスライドへ直接ジャンプできます。選択中のサムネイルには紫色の下線(border-bottom)が付与され、現在表示中のスライドがひと目でわかるようになっています。

5. モバイル対応(メディアクエリ)

@mediaクエリを使用し、画面幅が450px以下の場合にボタンとキャプションのフォントサイズを16pxに縮小。スマートフォンなど小さい画面でも快適に操作できるよう配慮しています。

出力結果

上記のコードを実行すると、以下のようなスライドショーギャラリーが表示されます。

CSSとJavaScriptを使ってレスポンシブ対応のスライドショーギャラリーを作成する方法


  1. CSSとJavaScriptでリスト表示とグリッド表示を切り替える方法【サンプルコード付き】

    Webアプリケーションや管理画面などでは、コンテンツの表示形式を「リスト表示」と「グリッド表示」で切り替えられるUIがよく使われています。本記事では、CSSとJavaScript(バニラJS)だけを使って、ボタンクリックでリスト表示とグリッド表示を切り替える機能を実装する方法を解説します。実装のポイントこの機能は、以下の3つの要素で構成されています。カラムレイアウト:float を使って各カラムを横並びに配置します切り替えボタン:アクティブ状態のスタイルを持つボタンを配置しますJavaScript関数:カラムの幅(width)を変更し、ボタンの active クラスを付け替えますサンプルコード

  2. CSSとJavaScriptで拡張グリッド(クリックで展開するグリッド)を作成する方法

    CSSとJavaScriptを組み合わせることで、カードをクリックすると詳細パネルが展開される「拡張グリッド(Expanding Grid)」を簡単に実装できます。本記事では、3カラム構成のグリッドを例に、具体的な実装手順をわかりやすく解説します。 実装のポイント クリックイベント:各カラムにonclick属性を設定し、クリックされたカラムに対応するタブを開きます。 表示の切り替え:新しいタブを開く前に既存のタブをすべて非表示にすることで、常に1つのタブだけが展開された状態を保ちます。 閉じるボタン:タブ右上の「×」ボタンをクリックするとパネルが閉じ、元のグリッド表示に戻ります。 サンプル