На этот раз в нашем эксперименте реализована идея перехода от элемента портфолио к странице полного описания. Панели движутся по оси 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 | |
