Создаем эффект перелистывания страниц на сайте при помощи jquery!
Здравствуйте, уважаемые друзья и гости блога! Сегодня я вам расскажу и покажу, как сделать эффект перелистывания страниц на сайте с помощью jquery. Это совсем не сложно, даже для новичка. Все исходные файлы для создания эффекта перелистывания страниц Вы сможете скачать у меня на блоге в данной статье, а также я вам предоставлю подробное описание, чтобы Вы не запутались.
Ну, что давайте начнем …
Эффект перелистывания страниц на сайте
Вот так это выглядит:
А здесь Вы можете скачать исходники:
Ну, что? Вам нравится эффект перелистывания страниц?! Если да, тогда давайте узнаем, как он делается!
Во-первых нужно создать разметку страницы. Делается это примерно вот так:
Но Вы можете изменить все заголовки на свои.
<div id="container" class="container"> <div class="menu-panel"> <h3>Table of Contents</h3> <ul id="menu-toc" class="menu-toc"> <li class="menu-toc-current"><a href="#item1">Self-destruction</a></li> <li><a href="#item2">Why we die</a></li> <li><a href="#item3">The honeymoon</a></li> <li><a href="#item4">A drawing joke</a></li> <li><a href="#item5">Commencing practice</a></li> </ul> </div> <div class="bb-custom-wrapper"> <div id="bb-bookblock" class="bb-bookblock"> <div class="bb-item" id="item1"> <div class="content"> <div class="scroller"> <h2>Self-destruction</h2> <p>...</p> </div> </div><!-- /content --> </div><!-- /bb-item --> <div class="bb-item" id="item2"><!-- ... --></div> <div class="bb-item" id="item3"><!-- ... --></div> <div class="bb-item" id="item4"><!-- ... --></div> <div class="bb-item" id="item5"><!-- ... --></div> </div><!-- /bb-bookblock --> <nav> <a id="bb-nav-prev" href="#">←</a> <a id="bb-nav-next" href="#">→</a> </nav> <span id="tblcontents" class="menu-button">Table of Contents</span> </div><!-- /bb-custom-wrapper --> </div><!-- /container -->
Во-вторых надо добавить стили, чтобы эффект перелистывания выглядел красиво:
@import url(https://fonts.googleapis.com/css?family=Lato:300,400,700); html { height: 100%; } *, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 0; margin: 0; } body { font-family: 'Lato', Calibri, Arial, sans-serif; background: #fff; font-weight: 400; font-size: 100%; color: #333; height: 100%; } .js body { overflow: hidden; } a { color: #555; text-decoration: none; outline: none; } a:hover { color: #000; } .container, .bb-custom-wrapper, .bb-bookblock { width: 100%; height: 100%; } .container { position: relative; left: 0px; -webkit-transition: left 0.3s ease-in-out; -o-transition: left 0.3s ease-in-out; transition: left 0.3s ease-in-out; } .slideRight { left: 240px; } .no-js .container { padding-left: 240px; } .menu-panel { background: #f1103a; width: 240px; height: 100%; position: fixed; z-index: 1000; top: 0; left: 0; text-shadow: 0 1px 1px rgba(0,0,0,0.1); } .js .menu-panel { position: absolute; left: -240px; } .menu-panel h3 { font-size: 1.8em; padding: 20px; font-weight: 300; color: #fff; box-shadow: inset 0 -1px 0 rgba(0,0,0,0.05); } .menu-toc { list-style: none; } .menu-toc li a { display: block; color: #fff; font-size: 1.1em; line-height: 3.5; padding: 0 20px; cursor: pointer; background: #f1103a; border-bottom: 1px solid #dd1338; } .menu-toc li a:hover, .menu-toc li.menu-toc-current a{ background: #dd1338; } .menu-panel div { margin-top: 20px; } .menu-panel div a { text-transform: uppercase; font-size: 0.7em; line-height: 1; padding: 5px 20px; display: block; border: none; color: #bc0b0b; letter-spacing: 1px; font-weight: 800; text-shadow: 0 1px rgba(255,255,255,0.2); } .menu-panel div a:hover { background: inherit; color: #fff; text-shadow: none; } .bb-custom-wrapper nav { top: 20px; left: 60px; position: absolute; z-index: 1000; } .bb-custom-wrapper nav span, .menu-button { position: absolute; width: 32px; height: 32px; top: 0; left: 0; background: #f1103a; border-radius: 50%; color: #fff; line-height: 30px; text-align: center; speak: none; font-weight: bold; cursor: pointer; } .bb-custom-wrapper nav span:hover, .menu-button:hover { background: #000; } .bb-custom-wrapper nav span:last-child { left: 40px; } .menu-button { z-index: 1000; left: 20px; top: 20px; text-indent: -9000px; } .menu-button:after { position: absolute; content: ''; width: 50%; height: 2px; background: #fff; top: 50%; margin-top: -1px; left: 25%; box-shadow: 0 -4px #fff, 0 4px #fff; } .no-js .bb-custom-wrapper nav span, .no-js .menu-button { display: none; } .js .content { position: absolute; top: 60px; left: 0; width: 100%; bottom: 50px; overflow: hidden; -webkit-font-smoothing: subpixel-antialiased; } .scroller { padding: 10px 5% 10px 5%; } .js .content:before, .js .content:after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 20px; z-index: 100; pointer-events: none; background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); background: -o-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); background: linear-gradient(to bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); } .js .content:after { top: auto; bottom: 0; background: -webkit-linear-gradient(bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); background: -moz-linear-gradient(bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); background: -o-linear-gradient(bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); background: linear-gradient(to top, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%); } .content h2 { font-weight: 300; font-size: 4em; padding: 0 0 10px; color: #333; margin: 0 1% 40px; text-align: left; box-shadow: 0 10px 0 rgba(0,0,0,0.02); text-shadow: 0 0 2px #fff; } .no-js .content h2 { padding: 40px 1% 20px; } .content p { font-size: 1.2em; line-height: 1.6; font-weight: 300; padding: 5px 8%; text-align: justify; } @media screen and (max-width: 800px){ .no-js .menu-panel { display: none; } .no-js .container { padding: 0; } } @media screen and (max-width: 400px){ .menu-panel, .content { font-size: 75%; } }
Теперь нам просто необходимы JavaScript, которые и сделают эффект перелистывания страниц на сайте осуществимым.
Делайте все поочередно, как в представленных блоках:
Первый блок JavaScript:
var $container = $( '#container' ), // элемент, к которому мы применим плагин BookBlock $bookBlock = $( '#bb-bookblock' ), // элементы BookBlock (bb-item) $items = $bookBlock.children(), // указатель текущего элемента current = 0, // инициализируйте BookBlock bb = $( '#bb-bookblock' ).bookblock( { speed : 800, perspective : 2000, shadowSides : 0.8, shadowFlip : 0.4, // после каждого перелистывания... onEndFlip : function(old, page, isLimit) { // обновите текущее значение current = page; // обновите выбранный элемент оглавления (TOC) updateTOC(); // покажите и/или скройте стрелки-указатели навигации updateNavigation( isLimit ); // инициализируйте jScrollPane на div контента для нового элемента setJSP( 'init' ); // ликвидируйте jScrollPane на div контента для старого элемента setJSP( 'destroy', old ); } } ), // стрелки-указатели навигации $navNext = $( '#bb-nav-next' ), $navPrev = $( '#bb-nav-prev' ).hide(), // оглавление элементов $menuItems = $container.find( 'ul.menu-toc > li' ), // кнопка для открывания TOC $tblcontents = $( '#tblcontents' ), transEndEventNames = { 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'oTransitionEnd', 'msTransition': 'MSTransitionEnd', 'transition': 'transitionend' }, // названия события перехода transEndEventName = transEndEventNames[Modernizr.prefixed('transition')], // проверьте, поддерживаются ли переходы supportTransitions = Modernizr.csstransitions;
Второй блок JavaScript:
function init() { // инициализируйте jScrollPane на div контента первого элемента setJSP( 'init' ); initEvents(); }
Третий блок JavaScript:
function setJSP( action, idx ) { var idx = idx === undefined ? current : idx, $content = $items.eq( idx ).children( 'div.content' ), apiJSP = $content.data( 'jsp' ); if( action === 'init' &amp;&amp; apiJSP === undefined ) { $content.jScrollPane({verticalGutter : 0, hideFocus : true }); } else if( action === 'reinit' &amp;&amp; apiJSP !== undefined ) { apiJSP.reinitialise(); } else if( action === 'destroy' &amp;&amp; apiJSP !== undefined ) { apiJSP.destroy(); } }
Четвертый блок JavaScript:
function initEvents() { // добавьте события навигации $navNext.on( 'click', function() { bb.next(); return false; } ); $navPrev.on( 'click', function() { bb.prev(); return false; } ); // добавьте события перелистывания $items.on( { 'swipeleft' : function( event ) { if( $container.data( 'opened' ) ) { return false; } bb.next(); return false; }, 'swiperight' : function( event ) { if( $container.data( 'opened' ) ) { return false; } bb.prev(); return false; } } ); // покажите TOC $tblcontents.on( 'click', toggleTOC ); // щелкните элемент меню $menuItems.on( 'click', function() { var $el = $( this ), idx = $el.index(), jump = function() { bb.jump( idx + 1 ); }; current !== idx ? closeTOC( jump ) : closeTOC(); return false; } ); // реинициализируйте jScrollPane при изменении размера окна $( window ).on( 'debouncedresize', function() { // реинициализируйте jScrollPane на div контента setJSP( 'reinit' ); } ); }
Пятый блок JavaScript:
function updateNavigation( isLastPage ) { if( current === 0 ) { $navNext.show(); $navPrev.hide(); } else if( isLastPage ) { $navNext.hide(); $navPrev.show(); } else { $navNext.show(); $navPrev.show(); } }
Шестой блок JavaScript:
function toggleTOC() { var opened = $container.data( 'opened' ); opened ? closeTOC() : openTOC(); } function openTOC() { $navNext.hide(); $navPrev.hide(); $container.addClass( 'slideRight' ).data( 'opened', true ); } function closeTOC( callback ) { $navNext.show(); $navPrev.show(); $container.removeClass( 'slideRight' ).data( 'opened', false ); if( callback ) { if( supportTransitions ) { $container.on( transEndEventName, function() { $( this ).off( transEndEventName ); callback.call(); } ); } else { callback.call(); } }
Вот и все, что я хотел вам сегодня рассказать и показать!
Если вам понравился материал пожалуйста сделайте следующее…
- Поставьте «лайк».
- Сделайте ретвит.
- Поделитесь этим постом с друзьями в социальных сетях.
- И конечно же, оставьте свой комментарий ниже
Спасибо за внимание!
Всегда ваш Валерий Бородин