ご質問・お見積り等お気軽にご相談ください
お問い合わせ

URLと特定のコンテンツだけを切り替えるプラグインを使ってみた

URLと特定のコンテンツだけを切り替えるプラグインを使ってみた

この度は、株式会社ウェブネーションをご訪問頂き、誠にありがとうございます。

今回は、ページの切り替えをせずに、URLとページ内の特定のコンテンツだけを切り替えるプラグインを使ってWebサイトを作ってみましたので、実際に動かした時の動画とそのコードと共に紹介いたします。

最後までお読みいただけますと幸いです。

そんなことできるの?

結論からいえば、できます(できるので作成できたんですけどね…)。

プラグインと少量のコードを用意すれば簡単に出来上がります。

なお、冒頭で記述した、URLとページ内の特定のコンテンツだけを読み込む動作を、「非同期遷移」もしくは「pjax(pushState + ajax)」と言います。

※pushStateとは、ブラウザの履歴を非同期通信で追加する動作のことです。履歴が追加されるため、これでURLとコンテンツの切り替えが動作したことになります。(History: pushState() method:https://developer.mozilla.org/en-US/docs/Web/API/History/pushState、2023年10月10日時点)

「非同期遷移」でできること

「非同期遷移」を行わせることで、ページ全体を読み込む必要がなくなるので、ページ全体の切り替えと比べて、読み込み時間の大幅な削減が期待できます。

実際、YouTubeや旧Twitter/現Xなど昨今のSNSプラットフォームも、PCブラウザ等で触っているとご存じかと思いますが、ページの切り替えが行われずにURLとコンテンツだけが切り替わられていることが、確認できると思われます。

その見極めポイントは、ブラウザ画面上部にある「タブ」に、読み込み中を示すグルグルのアイコンがないかどうかです。

URLやコンテンツが切り替わっている間に、読み込み中を示すアイコンが「タブ」に全く表示されていないのであれば、それは「非同期遷移」が動作されたことを意味し、ページの切り替えが動作しなかったことになります。

今回は、この「非同期遷移」とjqueryのフェードイン/フェードアウト処理を使って、コンテンツが切り替わるWebサイトを、jquery-pjax、Barba.jsの2種のプラグインで、それぞれ使い分けて作ってみましたので、実際に動かした時の動画とそのコードと共に紹介いたします。

jquery-pjax

リンク(GitHub):https://github.com/defunkt/jquery-pjax/

インストール(jsDelivr):https://www.jsdelivr.com/package/npm/jquery-pjax

※2023年10月10日時点

実際に動かした時の動画

jquery-pjax

HTML

<!-- // Page01.html -->
<head>
<title>Page01</title>
</head>
<body>
	<div class="header">
		<h1>Hello World</h1>
	</div>
	<div id="content">
		<div class="link-element">
			<a class="link-text" href="page02.html">Page2</a>
		</div>
		<div class="footer">
			<h1>Hello</h1>
		</div>
	</div>
	<script src="commonPjax.js"></script>
</body>
</html>
<!-- // Page02.html -->
<head>
<title>Page02</title>
</head>
<body>
	<div class="header">
		<h1>Hello World</h1>
	</div>
	<div id="content">
		<div class="link-element">
			<a class="link-text" href="page01.html">Page1</a>
		</div>
		<div class="footer">
			<h1>こんにちは</h1>
		</div>
	</div>
	<script src="commonPjax.js"></script>
</body>
</html>

JavaScript / jQuery

// commonPjax.js
$(document).on('click', '.link-text', function(e){
    e.preventDefault();
    $linkText = $('.link-text');
    $pjaxTargetContent = $('#content');
    $pjaxTargetContent.fadeOut(300, function(){
        $.pjax({
            url: $linkText.attr('href'),
            container: '#content',
            fragment: '#content',
        }).done(function(){
            $pjaxTargetContent.fadeIn(300);
        });
    });
});

Barba.js(v2)

リンク(公式):https://barba.js.org/

インストール:https://barba.js.org/docs/getstarted/install/

※2023年10月10日時点

実際に動かした時の動画

Barba.js(v2)

HTML

<!-- // Page03.html -->
<head>
<title>Page03</title>
</head>
<body data-barba="wrapper">
	<div class="header">
		<h1>Hello World</h1>
	</div>
	<div id="content" data-barba="container">
		<div class="link-element">
			<a class="link-text" href="page04.html">Page4</a>
		</div>
		<div class="footer">
			<h1>Guten Tag</h1>
		</div>
	</div>
	<script src="commonBarba.js"></script>
</body>
<!-- // Page04.html -->
<head>
<title>Page04</title>
</head>
<body data-barba="wrapper">
	<div class="header">
		<h1>Hello World</h1>
	</div>
	<div id="content" data-barba="container">
		<div class="link-element">
			<a class="link-text" href="page03.html">Page3</a>
		</div>
		<div class="footer">
			<h1>Bonjour</h1>
		</div>
	</div>
	<script src="commonBarba.js"></script>
</body>

JavaScript / jQuery

// commonBarba.js
barba.init({
    transitions: [{
        leave(e){
            return new Promise(function(resolve){
                $(e.current.container).fadeOut(300);
                setTimeout(() => resolve(), 300);
            });
        },
        enter(e){
            $(e.next.container).css({'display':'none'}).fadeIn(300);
        },
    }]
});

CSS(参考)

body {
	background-color: #c9c2f4;
	color: #ffffff;
}
h1,
.link-element {
	margin: auto;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	position: absolute;
	text-align: center;
	align-items: center;
}
h1 {
	display: grid;
	height: fit-content;
}
.header > h1 {
	bottom: 100px;
}
.footer > h1 {
	top: 100px;
}
.link-element {
	cursor: pointer;
	background-color: #585091;
	display: flex;
	bottom: 0;
	height: fit-content;
	width: fit-content;
	user-select: none;
	border-radius: 10px;
}
.link-text {
	padding: 10px;
	text-decoration: none;
	color: #ffffff;
}
.link-text:hover {
	color: #ffffff;
	background-color: #948ec6;
	border-radius: 10px;
}

最後に

いかがでしたでしょうか?

URLとページ内の特定のコンテンツだけを切り替える動作「非同期遷移」は、ページ全体を切り替える必要がないので、画面設計上に何らかのコストパフォーマンスが期待できそうですね。

今回はここまでとさせていただきます。

最後までお読みいただき、誠にありがとうございます。

参考サイト

  1. アイキャッチ画像
この記事を書いた人
通りすがりのエンジニアB
通りすがりのエンジニアB(匿名)です。