제작과정을 직접 소개해드리니 마음에 드셨으면 좋겠습니다.
HTML 구조
이 페이지 전환 효과의 HTML 구조는 페이지의 래핑 요소로 div.cd-cover-layer를 사용하여 페이지 전환 시 마스크 레이어를 만듭니다. -bar는 Ajax 로딩 중 로딩 진행률 표시줄입니다.
<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 유사 요소를 사용하여 페이지 전환 프로세스 중에 페이지 콘텐츠를 덮는 두 개의 마스크 레이어를 생성합니다. 위치는 높이가 50vh이고 너비가 100%로 고정되어 있습니다. 기본적으로 CSS 변환 속성(translateY(-100%)/translateY(100%))을 사용하여 숨겨집니다. 사용자가 페이지를 전환하면 이러한 요소는 .page-is-changing 클래스를 6c04bd5ca3fcae76e30b72ad730ca86d 요소에 추가하여 뷰포트로 다시 이동됩니다.
아래 이미지는 이 과정을 보여줍니다.
페이지 전환 효과
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 요소를 동일한 배경색으로 오버레이한 다음 6c04bd5ca3fcae76e30b72ad730ca86d에 .page-is-changing 클래스를 추가하면 투명도가 0에서 1로 변경됩니다.
로딩 진행률 표시줄은 .cd-loading-bar::before 의사 요소를 사용하여 만들어집니다. 기본적으로 크기가 축소되고(scaleX(0)) 변형 원본: 왼쪽 중앙입니다. 페이지 전환이 시작되면 scaleX(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); //... }
새 콘텐츠가 로드되면 원본 61b85035edf2b42260fdb5632dc5728a 요소의 콘텐츠가 대체됩니다. .page-is-changing 클래스가 본문에서 제거되고 새로 로드된 콘텐츠가 window.history에 추가됩니다(pushState() 메서드 사용).
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); });