Javascript「swup」の基本的な使い方!【実装例あり】
- 2024.03.26
- Javascript
swupはウェブサイトでページ遷移時のトランジションをスムーズにするためのライブラリです。以下に、swupの基本的な使い方をご紹介します。
概要
swupの基本の使い方として、ページ内容をswupのラッパーに包む方法があります。
おおまかな概要としては、サイト全体の共有パーツ(ハンバーグメニュー・フッターなど)は「swup」のラッパー外に置き、遷移する内容を「swup」のラッパーの中に置きます。
HTMLファイルとしては、大まかに下記のような流れで構成することができます。
パーツ | 内容 |
共有パーツ1 | メタデータ スタイルシート ハンバーグメニュー 背景・サイトラッパー等 |
swupのラッパー | ページコンテンツ 画像 文字など |
共有パーツ2 | フッター スクリプトなど |
WPにインストールする方法
ワードプレスに「swup」を実装する際は、header.phpとfooter.phpにラッパー要素を設置することで簡単にインストールすることができます。
header.php
<!DOCTYPE html>
<html lang="ja">
<head> ... </head>
<body>
...
<!-- swupのラッパーのスタート -->
<div id="swup" class="transition-fade">
footer.php
...
<!-- swupのラッパーのフィニッシュ -->
</div>
<footer> ... </footer>
<script type="module" src="<?= get_template_directory_uri() ?>/js/common.js"></script>
</body>
</html>
上のfooter.phpのブロックの中で、common.jsのジャバスクリプトファイルをモジュール(”module”)として呼び出しています。理由は次の”common.js”セクションでご説明します。
common.js
import Swup from 'https://unpkg.com/swup@4?module';
JavaScriptファイルの先頭でImport API(importタグ)を使用し、CDNから「swup@4?module」をインポートします。
swupの公式ページではこの形式が標準的に使用されており、そのため、スクリプトタグの中で「type=”module”」を設定する必要があります(footer.php参照)。これはJavaScript(ES6)のモジュールとしてファイルを読み込むためのルールです。
カスタマイズについて
「const swup = new Swup(); 」というコードは、インポートされた”Swup”クラスから新しいオブジェクト(const swup)を定義するコードです。つまり「swup」を初期化するコードで、これを記述するだけでswupを動かすことができます。
common.js
const swup = new Swup({
animateHistoryBrowsing: false,
animationSelector: '[class*="transition-"]',
animationScope: 'html',
...
timeout: 0
});
swupにはいろいろなアニメーションがあり、パラメーター(オプション)の設定によって挙動を調整することができます。記述としては、オブジェクトを定義する際、上記コードのようにパラメーターとして渡します。
パラメーターの詳細は以下の通り。
「animateHistoryBrowsing」・・・・ブラウザの戻る/進むボタンによってトリガーされる訪問に対してアニメーションをスキップするかどうかを設定します。デフォルトはfalseです。trueに設定すると訪問時にアニメーションが実行され、htmlタグにis-popstateクラスが追加されます。
「animationSelector」・・・・アニメーションのタイミングを検出するためのセレクタを設定します。Swupは新しいページのコンテンツを表示する前に、このセレクタで指定された要素上で行われるすべてのCSSトランジションとキーフレームアニメーションが完了するのを待ちます。デフォルトは ‘[class*=”transition-“]’ です。
「animationScope」・・・・入力/出力アニメーションの異なるフェーズをスタイル付けするためにアニメーションクラスを追加する要素を設定します。デフォルトでは、これらのクラスがhtmlタグに追加されますが、’containers’に設定するとコンテンツコンテナ自体にクラスが追加されます。
この他にも多くのパラメーターがありますが、詳細は下記URLをご参考ください。
style.css
/*.is-changingというクラスは、jsにてトランジションの開始から完了までhtml要素に反映されます。*/
html.is-changing .transition-fade {
transition: opacity 250ms;
/*ここに記載されている数字はトランジション全体のスパンです。*/
opacity: 1;
}
/*.is-animatingクラスは、アニメーションスタートから新しいページの読み込みが完了するまでのスパンです。*/
html.is-animating .transition-fade {
opacity: 0;
}
どのトランジションが現れるのか、どのスピードで再生するのかは基本的にCSSで制御するようになっています。上のコードでは、ページ内容が一旦フェードアウトしたあと、新しいページが読み込まれたらフェードインするというアニメーションになっています。
https://swup.js.org/assets/images/swup-lifecycle.svg
どのように、もしくはどのタイミングでトランジションされるのか、上記リンク先のlifecycleグラフ(画像)で説明してあります。
html.is-changing .swup-overlay:before {
transition: transform 250ms linear;
opacity: 1;
}
html.is-animating .swup-overlay:before {
transform: translate3d(0%, 0, 0);
}
html.is-rendering .swup-overlay:before {
transform: translate3d(100%, 0, 0);
}
上のコードは、.is-changing, .is-animating, .is-renderingというフッククラスを利用し、左からのスワイプアニメーションを実現しています。
実装例
→プロジェクトをプレビューする(GitHub Pages)
→ファイルをダウンロードする (GitHubリポジトリ)
トラブルシューティング
swupを使っているサイトではページの切り替え時にトランジションがあるため、他のJavaScriptとの干渉が起こる可能性があります。以前に読み込んだページの動作が無効になるケースもあるので、もしトラブルが起きることがありましたら、下記のJSの書き方に変更してみてください。
import Swup from 'https://unpkg.com/swup@4?module';
const swup = new Swup();
document.addEventListener('DOMContentLoaded', function () {
startPage ();
/*新しいページが読み込み完了になる直前にstartPage()関数を呼び出す*/
swup.hooks.on('content:replace', () => {
startPage();
});
});
function startPage() {
/*ここはJSコードです*/
}
「swup.hooks.on(‘content:replace’ …」はswupのフックの一つです。このフックは、ページとページを切り替える時だけに実行されます。意味としては、{}に入っているコード(ここではstartPage();)は、リンク先のページが読み込み完了となる直前に実行されるようになっています。
上のlifecycleチャートでは他のフックも説明されていますので、ぜひ参考にしてみてください!
お問い合せはBSTへ!
-
前の記事
【CSSプロパティ】:has()疑似クラスを使ってみました! 2023.10.27
-
次の記事
記事がありません