Background Image

Шаблон слайд панелей

Templates

by — Category Templates on

На этот раз в нашем эксперименте реализована идея перехода от элемента портфолио к странице полного описания. Панели движутся по оси y (на мобильных устройствах по оси x), а переход к полному описанию будет осуществляться при клике.

HTML

Cтруктура состоит из двух ненумерованных списков; в ul.cd-projects-previews будут содержаться миниатюрные изображения, а в ul.cd-projects детальная информация о проектах. В nav.cd-primary-nav поместим основную навигацию.

<div class="cd-projects-container">
 <ul class="cd-projects-previews">
 <li>
 <a href="#0">
 <div class="cd-project-title">
 <h2>Project 1</h2>
 <p>Brief description of the project here</p>
 </div>
 </a>
 </li>

 <li>
 <!-- project preview here -->
 </li>

 <!-- other project previews here -->
 </ul> <!-- .cd-projects-previews -->

 <ul class="cd-projects">
 <li>
 <div class="preview-image">
 <div class="cd-project-title">
 <h2>Project 1</h2>
 <p>Brief description of the project here</p>
 </div>
 </div>

 <div class="cd-project-info">
 <!-- project description here -->
 </div> <!-- .cd-project-info -->
 </li>

 <!-- projects here -->
 </ul> <!-- .cd-projects -->

 <button class="scroll cd-text-replace">Scroll</button>
</div> <!-- .cd-project-container -->

<nav class="cd-primary-nav" id="primary-nav">
 <ul>
 <li class="cd-label">Navigation</li>
 <li><a href="#0">The team</a></li>
 <!-- navigation items here -->
 </ul>
</nav> <!-- .cd-primary-nav -->

CSS

.cd-projects-previews li {
 height: 25%;
 width: 100%;
 overflow: hidden;
 transition: transform 0.5s;
}
.cd-projects-previews a {
 display: block;
 height: 100vh;
 width: 100%;
 opacity: 0;
 transition: opacity 0.5s;
 transform: translateY(0%);
}
.cd-projects-previews li:nth-of-type(2) a {
 transform: translateY(-25%);
}
.cd-projects-previews li:nth-of-type(3) a {
 transform: translateY(-50%);
}
.cd-projects-previews li:nth-of-type(4) a {
 transform: translateY(-75%);
}
.cd-projects > li {
 position: absolute;
 top: 0;
 left: 0;
 height: 100%;
 width: 100%;
 opacity: 0;
 transition: opacity 0.3s;
}
.cd-projects-previews li.slide-out {
 transform: translateX(-100%);
}

.cd-projects > li.selected {
 z-index: 1;
 opacity: 1;
 transition: opacity 0s;
}

 На устройствах с крупными экранам (разрешение более 1024px), высота проекта будет занимать 100% области видимости, а ширина проекта будет составлять ¼ экрана для отображения всех 4 миниатюр проекта.

@media only screen and (min-width: 1024px) {
 .cd-projects-previews li {
 display: inline-block;
 height: 100%;
 width: 25%;
 float: left;
 }
 .cd-projects-previews li.slide-out {
 transform: translateY(-100%);
 }
 .cd-projects-previews a {
 /* width equal to window width */
 width: 400%;
 }
 .cd-projects-previews li:nth-of-type(2) a {
 transform: translateX(-25%);
 }
 .cd-projects-previews li:nth-of-type(3) a {
 transform: translateX(-50%);
 }
 .cd-projects-previews li:nth-of-type(4) a {
 transform: translateX(-75%);
 }
}

Элемент навигации .cd-primary-nav помещаем ниже .cd-projects-container; при клике по .cd-nav-trigger, элементу будет добавлен класс .slide-out

.cd-primary-nav {
 position: absolute;
 z-index: 1;
 top: 0;
 left: 0;
 height: 100%;
 width: 100%;
 overflow: auto;
 text-align: center;
 opacity: 0;
 transition: opacity 0.6s;
}
.cd-primary-nav.nav-visible {
 opacity: 1;
}

Если вам нужно большее количество проектов, нежели 4, то вам следует обновить значения width/height превью изображения (так же изменить значение translate внутренних элементов <a>). Если вы пользуетесь SASS, то достаточно будет обновить значение переменной $items в файле > _variables.scss

jQuery

jQuery(document).ready(function($){
 //cache DOM elements
 var projectsContainer = $('.cd-projects-container'),
 projectsPreviewWrapper = projectsContainer.find('.cd-projects-previews'),
 projectPreviews = projectsPreviewWrapper.children('li'),
 projects = projectsContainer.find('.cd-projects'),
 navigationTrigger = $('.cd-nav-trigger'),
 navigation = $('.cd-primary-nav'),
 //if browser doesn't support CSS transitions...
 transitionsNotSupported = ( $('.no-csstransitions').length > 0);

 var animating = false,
 //will be used to extract random numbers for projects slide up/slide down effect
 numRandoms = projects.find('li').length, 
 uniqueRandoms = [];

 //open project
 projectsPreviewWrapper.on('click', 'a', function(event){
 event.preventDefault();
 if( animating == false ) {
 animating = true;
 navigationTrigger.add(projectsContainer).addClass('project-open');
 openProject($(this).parent('li'));
 }
 });

 navigationTrigger.on('click', function(event){
 event.preventDefault();
 
 if( animating == false ) {
 animating = true;
 if( navigationTrigger.hasClass('project-open') ) {
 //close visible project
 navigationTrigger.add(projectsContainer).removeClass('project-open');
 closeProject();
 } else if( navigationTrigger.hasClass('nav-visible') ) {
 //close main navigation
 navigationTrigger.removeClass('nav-visible');
 navigation.removeClass('nav-clickable nav-visible');
 if(transitionsNotSupported) projectPreviews.removeClass('slide-out');
 else slideToggleProjects(projectsPreviewWrapper.children('li'), -1, 0, false);
 } else {
 //open main navigation
 navigationTrigger.addClass('nav-visible');
 navigation.addClass('nav-visible');
 if(transitionsNotSupported) projectPreviews.addClass('slide-out');
 else slideToggleProjects(projectsPreviewWrapper.children('li'), -1, 0, true);
 }
 } 

 if(transitionsNotSupported) animating = false;
 });

 //scroll down to project info
 projectsContainer.on('click', '.scroll', function(){
 projectsContainer.animate({'scrollTop':$(window).height()}, 500); 
 });

 //check if background-images have been loaded and show project previews
 projectPreviews.children('a').bgLoaded({
 afterLoaded : function(){
 showPreview(projectPreviews.eq(0));
 }
 });

 function showPreview(projectPreview) {
 if(projectPreview.length > 0 ) {
 setTimeout(function(){
 projectPreview.addClass('bg-loaded');
 showPreview(projectPreview.next());
 }, 150);
 }
 }

 function openProject(projectPreview) {
 var projectIndex = projectPreview.index();
 projects.children('li').eq(projectIndex).add(projectPreview).addClass('selected');
 
 if( transitionsNotSupported ) {
 projectPreviews.addClass('slide-out').removeClass('selected');
 projects.children('li').eq(projectIndex).addClass('content-visible');
 animating = false;
 } else { 
 slideToggleProjects(projectPreviews, projectIndex, 0, true);
 }
 }

 function closeProject() {
 projects.find('.selected').removeClass('selected').on('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
 $(this).removeClass('content-visible').off('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend');
 slideToggleProjects(projectsPreviewWrapper.children('li'), -1, 0, false);
 });

 //if browser doesn't support CSS transitions...
 if( transitionsNotSupported ) {
 projectPreviews.removeClass('slide-out');
 projects.find('.content-visible').removeClass('content-visible');
 animating = false;
 }
 }

 function slideToggleProjects(projectsPreviewWrapper, projectIndex, index, bool) {
 if(index == 0 ) createArrayRandom();
 if( projectIndex != -1 && index == 0 ) index = 1;

 var randomProjectIndex = makeUniqueRandom();
 if( randomProjectIndex == projectIndex ) randomProjectIndex = makeUniqueRandom();
 
 if( index < numRandoms - 1 ) {
 projectsPreviewWrapper.eq(randomProjectIndex).toggleClass('slide-out', bool);
 setTimeout( function(){
 //animate next preview project
 slideToggleProjects(projectsPreviewWrapper, projectIndex, index + 1, bool);
 }, 150);
 } else if ( index == numRandoms - 1 ) {
 //this is the last project preview to be animated 
 projectsPreviewWrapper.eq(randomProjectIndex).toggleClass('slide-out', bool).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(){
 if( projectIndex != -1) {
 projects.children('li.selected').addClass('content-visible');
 projectsPreviewWrapper.eq(projectIndex).addClass('slide-out').removeClass('selected');
 } else if( navigation.hasClass('nav-visible') && bool ) {
 navigation.addClass('nav-clickable');
 }
 projectsPreviewWrapper.eq(randomProjectIndex).off('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend');
 animating = false;
 });
 }
 }

 //http://stackoverflow.com/questions/19351759/javascript-random-number-out-of-5-no-repeat-until-all-have-been-used
 function makeUniqueRandom() {
 var index = Math.floor(Math.random() * uniqueRandoms.length);
 var val = uniqueRandoms[index];
 // now remove that value from the array
 uniqueRandoms.splice(index, 1);
 return val;
 }

 function createArrayRandom() {
 //reset array
 uniqueRandoms.length = 0;
 for (var i = 0; i < numRandoms; i++) {
 uniqueRandoms.push(i);
 }
 }
});

 /*
 * BG Loaded
 * Copyright (c) 2014 Jonathan Catmull
 * Licensed under the MIT license.
 */
 (function($){
 $.fn.bgLoaded = function(custom) {
 var self = this;

 // Default plugin settings
 var defaults = {
 afterLoaded : function(){
 this.addClass('bg-loaded');
 }
 };

 // Merge default and user settings
 var settings = $.extend({}, defaults, custom);

 // Loop through element
 self.each(function(){
 var $this = $(this),
 bgImgs = $this.css('background-image').split(', ');
 $this.data('loaded-count',0);
 $.each( bgImgs, function(key, value){
 var img = value.replace(/^url\(["']?/, '').replace(/["']?\)$/, '');
 $('<img/>').attr('src', img).load(function() {
 $(this).remove(); // prevent memory leaks
 $this.data('loaded-count',$this.data('loaded-count')+1);
 if ($this.data('loaded-count') >= bgImgs.length) {
 settings.afterLoaded.call($this);
 }
 });
 });

 });
 };
})(jQuery);

 

 

 ПРОВЕРЕНО! 


View demo
Понравился материал?
Поделитесь с друзьями

С этим материалом смотрят: Похожие материалы не найдены
Feedback: 0

Leave a Comment

Имя *:
Email *:
Код *:
Menu