記事公開日

無限ループするフォトギャラリーをスワイプで操作したい

お客さん

ウェブサイトに複数の画像を埋め込んでフォトギャラリーみたいな実装がしたいの。

自動で横スクロールして少しずつ表示させてるんだけど、スマホで見ている人は、スワイプ操作でシュッと一気に見れた方が良い気がして・・・

どうすればいい?

隊員1号

CSSでスクロールバーを消さなければ良いだけの話ですよ!

DEMO

※今回の例はスマホで見たときにスワイプ操作を行う方法です。

パソコンで見たときはスクロールバーは表示されます。

もしパソコンでスクロールバーを消す場合は、メディアクエリで「overflow-x:scroll;」のところを「overflow:hidden」と指定してください。

無限ループするフォトギャラリーをスワイプで操作したい

薄いグレーでスクロールバーが表示されますが、数秒で消えます。

実際に実装してみると、ほとんど目立ちません。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex">
<title>フォトギャラリー</title>
<style>
.slideshow {
    overflow-x:scroll;
    display:flex;
    align-items:center;
}

.slideshow ul {
  display:flex;
  list-style-type:none;
}

/* フォトギャラリー */
.slideshow ul li {
    width:20rem;
    height:auto;
    margin-right:1rem;
}
.slideshow ul li img {
    max-width:100%;
    height:auto;
}
</style>
</head>

<body>

<div id="container">

     <!-- ==========================================
                   スライドショー
    ============================================ -->
    <div class="slideshow" id="gallery">
        <ul>
        <li><img src="img1.jpg"></li>
        <li><img src="img2.jpg"></li>
        <li><img src="img3.jpg"></li>
        <li><img src="img4.jpg"></li>
        <li><img src="img5.jpg"></li>
        <li><img src="img6.jpg"></li>
        <li><img src="img7.jpg"></li>
        </ul>
    </div>    

    <script>
        const gallery = document.getElementById("gallery");
        const scrollAmount = 1; // スクロールする量(ピクセル単位)
        const scrollInterval = 15; // スクロールの間隔(ミリ秒単位)
        let isTouching = false; // スワイプ中かどうかを判定するフラグ
        let scrollDistance = 0; // スクロールした距離

        // ギャラリーを自動でスクロールさせる関数
        function autoScroll() {

            if (!isTouching) { // スワイプ中でない場合にのみ自動スクロールを実行
                gallery.scrollLeft += scrollAmount;
                scrollDistance += scrollAmount;

                // ギャラリーの端に達したらスクロールを最初の位置に戻す
                if (gallery.scrollLeft >= gallery.scrollWidth - gallery.clientWidth) {
                    gallery.scrollLeft = 0;
                    scrollDistance = 0;
                }
            }
        }

        // タッチイベントを検知してフラグを設定
        gallery.addEventListener('touchstart', () => {
            isTouching = true;
        });
        gallery.addEventListener('touchend', () => {
            isTouching = false;
        });

        // 一定の間隔でautoScroll関数を呼び出す
        setInterval(autoScroll, scrollInterval);
    </script>

</div>

</body>
</html>

本当は、最後の画像まで表示されたら切れ目なく無限ループを表現したかったのですが、どうしてもダミー画像を表示する必要があります。

そうなると、見ているユーザーに重複した画像を見せることになってしまうので、今回は最初に画像が戻るときの違和感はあきらめました。

この記事のURLをコピー

メールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

関連情報

運営者プロフィール
運営者のプロフィール画像
隊員1号

IT系フリーランスとして10年の経験を持つレスキュー隊。HTML・CSS・JS・PHPなど幅広いスキルを持つ。

詳しいプロフィール