0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

驚くほどスムーズ!View Transitions APIでウェブ体験をアップグレード!

Last updated at Posted at 2024-06-17

挨拶

みなさんこんにちは!今日は、最近注目されているView Transitions APIについてお話ししたいと思います。新しい技術を使って、ユーザーエクスペリエンスを向上させる方法を一緒に学んでいきましょう!

View Transitions APIとはなにか?

View Transitions APIは、ウェブページ間やページ内の異なるビュー間の遷移をスムーズにアニメーション化するための新しいAPIです。特にシングルページアプリケーション(SPA)やインタラクティブなウェブアプリケーションにおいて、ページの切り替えやコンテンツの更新を自然に見せることができます。

View Transitions APIでなにができるのか?

View Transitions APIを使うと、以下のようなことが可能になります:

  1. スムーズなページ遷移:
    ページ間の切り替えをアニメーション化して、ユーザーによりスムーズな体験を提供します。

  2. コンテンツのアニメーション更新:
    リストから詳細ビューへの遷移や、フィルター変更によるコンテンツの更新をアニメーションで演出します。

  3. 複雑なトランジションの簡単な実装:
    JavaScriptとCSSを使って簡単にトランジション効果をカスタマイズできます。

View Transitions APIはなぜすごいのか?

View Transitions APIの魅力は、その簡単な実装と高いパフォーマンスにあります。

  • 簡単な実装: 少ないコードでリッチなアニメーションを実現できるため、開発時間を大幅に短縮できます。

  • 高いパフォーマンス: ブラウザがトランジションの最適化を行うため、リフローやリペイントのコストを抑えたスムーズなアニメーションが実現します。

  • ユーザー体験の向上: ページ遷移がスムーズになることで、ユーザーはより直感的で快適な操作ができるようになります。

対応ブラウザ

2024年6月時点で、View Transitions APIは以下のブラウザでサポートされています:

  • SPAではChrome 111・Edge 111(2023年3月リリース)以上
  • MPAではChrome 126・Edge 126(2024年6月リリース)以上

他のブラウザでも順次対応が進んでいるので、最新情報をチェックしてみてください。

実装例

ここでは、View Transitions APIを使ってギャラリーサイトを作成する例を紹介します。

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gallery with View Transitions API</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
        }

        .gallery {
            display: flex;
            flex-wrap: wrap;
            justify-content: center;
            padding: 20px;
        }

        .image-container {
            margin: 10px;
            cursor: pointer;
        }

        .image-container img {
            width: 200px;
            height: auto;
            border-radius: 8px;
            transition: transform 0.3s;
        }

        .image-container img:hover {
            transform: scale(1.05);
        }

        .detail-view {
            display: none;
            flex-direction: column;
            align-items: center;
            padding: 20px;
        }

        .detail-view img {
            max-width: 80%;
            height: auto;
            margin-top: 20px;
            border-radius: 8px;
        }

        #back-button {
            margin-top: 20px;
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            border: none;
            border-radius: 8px;
            background-color: #007BFF;
            color: white;
            transition: background-color 0.3s;
        }

        #back-button:hover {
            background-color: #0056b3;
        }
    </style>
</head>
<body>
    <div id="gallery" class="gallery">
        <div class="image-container" data-image="1">
            <img src="https://via.placeholder.com/400x300.png?text=Image+1" alt="Image 1">
        </div>
        <div class="image-container" data-image="2">
            <img src="https://via.placeholder.com/400x300.png?text=Image+2" alt="Image 2">
        </div>
        <div class="image-container" data-image="3">
            <img src="https://via.placeholder.com/400x300.png?text=Image+3" alt="Image 3">
        </div>
        <!-- 追加の画像コンテナ -->
    </div>

    <div id="detail-view" class="detail-view">
        <button id="back-button">Back to Gallery</button>
        <img id="detail-image" src="" alt="Detailed View">
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const gallery = document.getElementById('gallery');
            const detailView = document.getElementById('detail-view');
            const detailImage = document.getElementById('detail-image');
            const backButton = document.getElementById('back-button');

            gallery.addEventListener('click', (event) => {
                const container = event.target.closest('.image-container');
                if (container) {
                    const imageSrc = container.querySelector('img').src;
                    document.startViewTransition(() => {
                        detailImage.src = imageSrc;
                        gallery.style.display = 'none';
                        detailView.style.display = 'flex';
                    });
                }
            });

            backButton.addEventListener('click', () => {
                document.startViewTransition(() => {
                    detailView.style.display = 'none';
                    gallery.style.display = 'flex';
                });
            });
        });
    </script>
</body>
</html>

解説

  • HTMLセクション: ギャラリーの画像と詳細ビューの画像を表示するための基本的な構造を提供します。画像をクリックすると、詳細ビューに遷移します。
  • CSSセクション: ギャラリーと詳細ビューのスタイルを設定します。画像にホバー効果やボタンのスタイルを追加します。
  • JavaScriptセクション: DOMContentLoadedイベントリスナーを使用して、DOMが完全に読み込まれた後にスクリプトを実行します。ギャラリーの画像がクリックされたときに詳細ビューに遷移し、戻るボタンがクリックされたときにギャラリーに戻るトランジションを設定します。

このコードをそのままHTMLファイルとして保存し、ブラウザで開くと、View Transitions APIを使用したスムーズなトランジション効果を持つギャラリーサイトが動作します。

注意点

View Transitions APIを使う際には、以下の点に注意しましょう:

  • ブラウザサポート: 一部のブラウザではまだサポートされていないため、フォールバックを用意することをお勧めします。
  • パフォーマンス: 大量のDOM操作や複雑なアニメーションはパフォーマンスに影響を与える可能性があるため、適切に最適化することが重要です。

まとめ

View Transitions APIを使うことで、ウェブアプリケーションのユーザー体験を大幅に向上させることができます。簡単に実装できるのに加え、高いパフォーマンスを提供するこのAPIを活用して、より魅力的なウェブ体験を作りましょう!

新しい技術を試すのは楽しいことですので、ぜひView Transitions APIを使って、プロジェクトに取り入れてみてください!😊

それでは、また次回の記事でお会いしましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?