制作過程を直接ご紹介しますので、気に入っていただければ幸いです。
HTML 構造
このページ切り替えエフェクトの HTML 構造は、ページのラッピング要素として
<main> <div class="cd-index cd-main-content"> <div> <h1>Page Transition</h1> <!-- your content here --> </div> </div> </main> <div class="cd-cover-layer"></div> <!-- this is the cover layer --> <div class="cd-loading-bar"></div> <!-- this is the loading bar -->
CSS スタイル
このページ切り替えエフェクトは、body::before および body::after 擬似要素を使用して、ページ切り替えプロセス中にページ コンテンツを覆う 2 つのマスク レイヤーを作成します。それらの位置は固定されており、高さは 50vh に等しく、幅は 100% です。デフォルトでは、CSS 変換プロパティ (translateY(-100%)/translateY(100%)) を使用して非表示になります。ユーザーがページを切り替えると、これらの要素は (.page-is-changing クラスを
要素に追加することによって) ビューポートに戻されます。ページ切り替え効果
body::after, body::before { /* these are the 2 half blocks which cover the content once the animation is triggered */ height: 50vh; width: 100%; position: fixed; left: 0; } body::before { top: 0; transform: translateY(-100%); } body::after { bottom: 0; transform: translateY(100%); } body.page-is-changing::after, body.page-is-changing::before { transform: translateY(0); }
ページが切り替わるとき、ページ コンテンツのフェードインおよびフェードアウト効果は、div.cd-cover-layer の透明度を変更することによって実現されます。 .cd-main-content 要素を同じ背景色でオーバーレイし、
が .page-is-changing クラスで追加されるときに透明度を 0 から 1 に変更します。.cd-loading-bar { /* this is the loading bar - visible while switching from one page to the following one */ position: fixed; height: 2px; width: 90%; } .cd-loading-bar::before { /* this is the progress bar inside the loading bar */ position: absolute; left: 0; top: 0; height: 100%; width: 100%; transform: scaleX(0); transform-origin: left center; } .page-is-changing .cd-loading-bar::before { transform: scaleX(1); }
特殊効果におけるスムーズなトランジション効果は、CSS トランジションを使用して実現されます。異なる要素のアニメーション シーケンスを実現するために、アニメーション化された各要素に異なる遷移遅延が追加されます。
ジャバスクリプト
data-type="page-transition" 属性は、このページ切り替えエフェクトのリンクで使用され、ページ切り替えイベントをトリガーします。プラグインがユーザーのクリック イベントを検出すると、changePage() メソッドが実行されます。
$('main').on('click', '[data-type="page-transition"]', function(event){ event.preventDefault(); //detect which page has been selected var newPage = $(this).attr('href'); //if the page is not animating - trigger animation if( !isAnimating ) changePage(newPage, true); });
このメソッドは、ページ切り替えアニメーションをトリガーし、loadNewContent() メソッドを通じて新しいコンテンツを読み込みます。
function changePage(url, bool) { isAnimating = true; // trigger page animation $('body').addClass('page-is-changing'); //... loadNewContent(url, bool); //... }
新しいコンテンツが読み込まれると、元の
function loadNewContent(url, bool) { var newSectionName = 'cd-'+url.replace('.html', ''), section = $('<div class="cd-main-content '+newSectionName+'"></div>'); section.load(url+' .cd-main-content > *', function(event){ // load new content and replace <main> content with the new one $('main').html(section); //... $('body').removeClass('page-is-changing'); //... if(url != window.location){ //add the new page to the window.history window.history.pushState({path: url},'',url); } }); }
ユーザーがブラウザの「戻る」ボタンをクリックしたときに同じページ切り替えアニメーション効果をトリガーするために、プラグインは Popstate イベントをリッスンし、トリガーされたときに changePage() 関数を実行します。
$(window).on('popstate', function() { var newPageArray = location.pathname.split('/'), //this is the url of the page to be loaded newPage = newPageArray[newPageArray.length - 1]; if( !isAnimating ) changePage(newPage); });