Created
January 19, 2015 18:03
-
-
Save AlexeySachkov/7c526e6729fee936acde to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* =========================================================== | |
* jquery-onepage-scroll.js v1.3.1 | |
* =========================================================== | |
* Copyright 2013 Pete Rojwongsuriya. | |
* http://www.thepetedesign.com | |
* | |
* Create an Apple-like website that let user scroll | |
* one page at a time | |
* | |
* Credit: Eike Send for the awesome swipe event | |
* https://github.com/peachananr/onepage-scroll | |
* | |
* License: GPL v3 | |
* | |
* Updated by Alexey Sachkov, 2015 | |
* Added disable/enable scroll feature | |
* | |
* ========================================================== */ | |
!function($){ | |
var defaults = { | |
sectionContainer: "section", | |
easing: "ease", | |
animationTime: 1000, | |
pagination: true, | |
updateURL: false, | |
keyboard: true, | |
beforeMove: null, | |
afterMove: null, | |
loop: true, | |
responsiveFallback: false, | |
direction : 'vertical' | |
}; | |
/*------------------------------------------------*/ | |
/* Credit: Eike Send for the awesome swipe event */ | |
/*------------------------------------------------*/ | |
$.fn.swipeEvents = function() { | |
return this.each(function() { | |
var startX, | |
startY, | |
$this = $(this); | |
$this.bind('touchstart', touchstart); | |
function touchstart(event) { | |
var touches = event.originalEvent.touches; | |
if (touches && touches.length) { | |
startX = touches[0].pageX; | |
startY = touches[0].pageY; | |
$this.bind('touchmove', touchmove); | |
} | |
} | |
function touchmove(event) { | |
var touches = event.originalEvent.touches; | |
if (touches && touches.length) { | |
var deltaX = startX - touches[0].pageX; | |
var deltaY = startY - touches[0].pageY; | |
if (deltaX >= 50) { | |
$this.trigger("swipeLeft"); | |
} | |
if (deltaX <= -50) { | |
$this.trigger("swipeRight"); | |
} | |
if (deltaY >= 50) { | |
$this.trigger("swipeUp"); | |
} | |
if (deltaY <= -50) { | |
$this.trigger("swipeDown"); | |
} | |
if (Math.abs(deltaX) >= 50 || Math.abs(deltaY) >= 50) { | |
$this.unbind('touchmove', touchmove); | |
} | |
} | |
} | |
}); | |
}; | |
$.fn.onepage_scroll = function(options){ | |
var settings = $.extend({}, defaults, options), | |
el = $(this), | |
sections = $(settings.sectionContainer) | |
total = sections.length, | |
status = "off", | |
topPos = 0, | |
leftPos = 0, | |
lastAnimation = 0, | |
quietPeriod = 500, | |
paginationList = ""; | |
disabled = false; | |
$.fn.transformPage = function(settings, pos, index) { | |
if (typeof settings.beforeMove == 'function') settings.beforeMove(index); | |
// Just a simple edit that makes use of modernizr to detect an IE8 browser and changes the transform method into | |
// an top animate so IE8 users can also use this script. | |
if($('html').hasClass('ie8')){ | |
if (settings.direction == 'horizontal') { | |
var toppos = (el.width()/100)*pos; | |
$(this).animate({left: toppos+'px'},settings.animationTime); | |
} else { | |
var toppos = (el.height()/100)*pos; | |
$(this).animate({top: toppos+'px'},settings.animationTime); | |
} | |
} else{ | |
$(this).css({ | |
"-webkit-transform": ( settings.direction == 'horizontal' ) ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", | |
"-webkit-transition": "all " + settings.animationTime + "ms " + settings.easing, | |
"-moz-transform": ( settings.direction == 'horizontal' ) ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", | |
"-moz-transition": "all " + settings.animationTime + "ms " + settings.easing, | |
"-ms-transform": ( settings.direction == 'horizontal' ) ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", | |
"-ms-transition": "all " + settings.animationTime + "ms " + settings.easing, | |
"transform": ( settings.direction == 'horizontal' ) ? "translate3d(" + pos + "%, 0, 0)" : "translate3d(0, " + pos + "%, 0)", | |
"transition": "all " + settings.animationTime + "ms " + settings.easing | |
}); | |
} | |
$(this).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function(e) { | |
if (typeof settings.afterMove == 'function') settings.afterMove(index); | |
}); | |
} | |
$.fn.moveDown = function() { | |
if (disabled) | |
return; | |
var el = $(this) | |
index = $(settings.sectionContainer +".active").data("index"); | |
current = $(settings.sectionContainer + "[data-index='" + index + "']"); | |
next = $(settings.sectionContainer + "[data-index='" + (index + 1) + "']"); | |
if(next.length < 1) { | |
if (settings.loop == true) { | |
pos = 0; | |
next = $(settings.sectionContainer + "[data-index='1']"); | |
} else { | |
return | |
} | |
}else { | |
pos = (index * 100) * -1; | |
} | |
if (typeof settings.beforeMove == 'function') settings.beforeMove( next.data("index")); | |
current.removeClass("active") | |
next.addClass("active"); | |
if(settings.pagination == true) { | |
$(".onepage-pagination li a" + "[data-index='" + index + "']").removeClass("active"); | |
$(".onepage-pagination li a" + "[data-index='" + next.data("index") + "']").addClass("active"); | |
} | |
$("body")[0].className = $("body")[0].className.replace(/\bviewing-page-\d.*?\b/g, ''); | |
$("body").addClass("viewing-page-"+next.data("index")) | |
if (history.replaceState && settings.updateURL == true) { | |
var href = window.location.href.substr(0,window.location.href.indexOf('#')) + "#" + (index + 1); | |
history.pushState( {}, document.title, href ); | |
} | |
el.transformPage(settings, pos, next.data("index")); | |
} | |
$.fn.moveUp = function() { | |
if (disabled) | |
return; | |
var el = $(this) | |
index = $(settings.sectionContainer +".active").data("index"); | |
current = $(settings.sectionContainer + "[data-index='" + index + "']"); | |
next = $(settings.sectionContainer + "[data-index='" + (index - 1) + "']"); | |
if(next.length < 1) { | |
if (settings.loop == true) { | |
pos = ((total - 1) * 100) * -1; | |
next = $(settings.sectionContainer + "[data-index='"+total+"']"); | |
} | |
else { | |
return | |
} | |
}else { | |
pos = ((next.data("index") - 1) * 100) * -1; | |
} | |
if (typeof settings.beforeMove == 'function') settings.beforeMove(next.data("index")); | |
current.removeClass("active") | |
next.addClass("active") | |
if(settings.pagination == true) { | |
$(".onepage-pagination li a" + "[data-index='" + index + "']").removeClass("active"); | |
$(".onepage-pagination li a" + "[data-index='" + next.data("index") + "']").addClass("active"); | |
} | |
$("body")[0].className = $("body")[0].className.replace(/\bviewing-page-\d.*?\b/g, ''); | |
$("body").addClass("viewing-page-"+next.data("index")) | |
if (history.replaceState && settings.updateURL == true) { | |
var href = window.location.href.substr(0,window.location.href.indexOf('#')) + "#" + (index - 1); | |
history.pushState( {}, document.title, href ); | |
} | |
el.transformPage(settings, pos, next.data("index")); | |
} | |
$.fn.moveTo = function(page_index) { | |
if (disabled) | |
return; | |
current = $(settings.sectionContainer + ".active") | |
next = $(settings.sectionContainer + "[data-index='" + (page_index) + "']"); | |
if(next.length > 0) { | |
if (typeof settings.beforeMove == 'function') settings.beforeMove(next.data("index")); | |
current.removeClass("active") | |
next.addClass("active") | |
$(".onepage-pagination li a" + ".active").removeClass("active"); | |
$(".onepage-pagination li a" + "[data-index='" + (page_index) + "']").addClass("active"); | |
$("body")[0].className = $("body")[0].className.replace(/\bviewing-page-\d.*?\b/g, ''); | |
$("body").addClass("viewing-page-"+next.data("index")) | |
pos = ((page_index - 1) * 100) * -1; | |
if (history.replaceState && settings.updateURL == true) { | |
var href = window.location.href.substr(0,window.location.href.indexOf('#')) + "#" + (page_index - 1); | |
history.pushState( {}, document.title, href ); | |
} | |
el.transformPage(settings, pos, page_index); | |
} | |
} | |
$.fn.disable = function() { | |
disabled = true; | |
} | |
$.fn.enable = function() { | |
disabled = false; | |
} | |
function responsive() { | |
//start modification | |
var valForTest = false; | |
var typeOfRF = typeof settings.responsiveFallback | |
if(typeOfRF == "number"){ | |
valForTest = $(window).width() < settings.responsiveFallback; | |
} | |
if(typeOfRF == "boolean"){ | |
valForTest = settings.responsiveFallback; | |
} | |
if(typeOfRF == "function"){ | |
valFunction = settings.responsiveFallback(); | |
valForTest = valFunction; | |
typeOFv = typeof valForTest; | |
if(typeOFv == "number"){ | |
valForTest = $(window).width() < valFunction; | |
} | |
} | |
//end modification | |
if (valForTest) { | |
$("body").addClass("disabled-onepage-scroll"); | |
$(document).unbind('mousewheel DOMMouseScroll MozMousePixelScroll'); | |
el.swipeEvents().unbind("swipeDown swipeUp"); | |
} else { | |
if($("body").hasClass("disabled-onepage-scroll")) { | |
$("body").removeClass("disabled-onepage-scroll"); | |
$("html, body, .wrapper").animate({ scrollTop: 0 }, "fast"); | |
} | |
el.swipeEvents().bind("swipeDown", function(event){ | |
if (!$("body").hasClass("disabled-onepage-scroll")) event.preventDefault(); | |
el.moveUp(); | |
}).bind("swipeUp", function(event){ | |
if (!$("body").hasClass("disabled-onepage-scroll")) event.preventDefault(); | |
el.moveDown(); | |
}); | |
$(document).bind('mousewheel DOMMouseScroll MozMousePixelScroll', function(event) { | |
if (!disabled) | |
{ | |
event.preventDefault(); | |
var delta = event.originalEvent.wheelDelta || -event.originalEvent.detail; | |
init_scroll(event, delta); | |
} | |
}); | |
} | |
} | |
function init_scroll(event, delta) { | |
deltaOfInterest = delta; | |
var timeNow = new Date().getTime(); | |
// Cancel scroll if currently animating or within quiet period | |
if(timeNow - lastAnimation < quietPeriod + settings.animationTime) { | |
event.preventDefault(); | |
return; | |
} | |
if (deltaOfInterest < 0) { | |
el.moveDown() | |
} else { | |
el.moveUp() | |
} | |
lastAnimation = timeNow; | |
} | |
// Prepare everything before binding wheel scroll | |
el.addClass("onepage-wrapper").css("position","relative"); | |
$.each( sections, function(i) { | |
$(this).css({ | |
position: "absolute", | |
top: topPos + "%" | |
}).addClass("section").attr("data-index", i+1); | |
$(this).css({ | |
position: "absolute", | |
left: ( settings.direction == 'horizontal' ) | |
? leftPos + "%" | |
: 0, | |
top: ( settings.direction == 'vertical' || settings.direction != 'horizontal' ) | |
? topPos + "%" | |
: 0 | |
}); | |
if (settings.direction == 'horizontal') | |
leftPos = leftPos + 100; | |
else | |
topPos = topPos + 100; | |
if(settings.pagination == true) { | |
paginationList += "<li><a data-index='"+(i+1)+"' href='#" + (i+1) + "'></a></li>" | |
} | |
}); | |
el.swipeEvents().bind("swipeDown", function(event){ | |
if (!$("body").hasClass("disabled-onepage-scroll")) event.preventDefault(); | |
el.moveUp(); | |
}).bind("swipeUp", function(event){ | |
if (!$("body").hasClass("disabled-onepage-scroll")) event.preventDefault(); | |
el.moveDown(); | |
}); | |
// Create Pagination and Display Them | |
if (settings.pagination == true) { | |
if ($('ul.onepage-pagination').length < 1) $("<ul class='onepage-pagination'></ul>").prependTo("body"); | |
if( settings.direction == 'horizontal' ) { | |
posLeft = (el.find(".onepage-pagination").width() / 2) * -1; | |
el.find(".onepage-pagination").css("margin-left", posLeft); | |
} else { | |
posTop = (el.find(".onepage-pagination").height() / 2) * -1; | |
el.find(".onepage-pagination").css("margin-top", posTop); | |
} | |
$('ul.onepage-pagination').html(paginationList); | |
} | |
if(window.location.hash != "" && window.location.hash != "#1") { | |
init_index = window.location.hash.replace("#", "") | |
if (parseInt(init_index) <= total && parseInt(init_index) > 0) { | |
$(settings.sectionContainer + "[data-index='" + init_index + "']").addClass("active") | |
$("body").addClass("viewing-page-"+ init_index) | |
if(settings.pagination == true) $(".onepage-pagination li a" + "[data-index='" + init_index + "']").addClass("active"); | |
next = $(settings.sectionContainer + "[data-index='" + (init_index) + "']"); | |
if(next) { | |
next.addClass("active") | |
if(settings.pagination == true) $(".onepage-pagination li a" + "[data-index='" + (init_index) + "']").addClass("active"); | |
$("body")[0].className = $("body")[0].className.replace(/\bviewing-page-\d.*?\b/g, ''); | |
$("body").addClass("viewing-page-"+next.data("index")) | |
if (history.replaceState && settings.updateURL == true) { | |
var href = window.location.href.substr(0,window.location.href.indexOf('#')) + "#" + (init_index); | |
history.pushState( {}, document.title, href ); | |
} | |
} | |
pos = ((init_index - 1) * 100) * -1; | |
el.transformPage(settings, pos, init_index); | |
} else { | |
$(settings.sectionContainer + "[data-index='1']").addClass("active") | |
$("body").addClass("viewing-page-1") | |
if(settings.pagination == true) $(".onepage-pagination li a" + "[data-index='1']").addClass("active"); | |
} | |
}else{ | |
$(settings.sectionContainer + "[data-index='1']").addClass("active") | |
$("body").addClass("viewing-page-1") | |
if(settings.pagination == true) $(".onepage-pagination li a" + "[data-index='1']").addClass("active"); | |
} | |
if(settings.pagination == true) { | |
$(".onepage-pagination li a").click(function (){ | |
var page_index = $(this).data("index"); | |
el.moveTo(page_index); | |
}); | |
} | |
$(document).bind('mousewheel DOMMouseScroll MozMousePixelScroll', function(event) { | |
if (!disabled) | |
{ | |
event.preventDefault(); | |
var delta = event.originalEvent.wheelDelta || -event.originalEvent.detail; | |
if(!$("body").hasClass("disabled-onepage-scroll")) init_scroll(event, delta); | |
} | |
}); | |
if(settings.responsiveFallback != false) { | |
$(window).resize(function() { | |
responsive(); | |
}); | |
responsive(); | |
} | |
if(settings.keyboard == true) { | |
$(document).keydown(function(e) { | |
var tag = e.target.tagName.toLowerCase(); | |
if (!$("body").hasClass("disabled-onepage-scroll")) { | |
switch(e.which) { | |
case 38: | |
if (tag != 'input' && tag != 'textarea') el.moveUp() | |
break; | |
case 40: | |
if (tag != 'input' && tag != 'textarea') el.moveDown() | |
break; | |
case 32: //spacebar | |
if (tag != 'input' && tag != 'textarea') el.moveDown() | |
break; | |
case 33: //pageg up | |
if (tag != 'input' && tag != 'textarea') el.moveUp() | |
break; | |
case 34: //page dwn | |
if (tag != 'input' && tag != 'textarea') el.moveDown() | |
break; | |
case 36: //home | |
el.moveTo(1); | |
break; | |
case 35: //end | |
el.moveTo(total); | |
break; | |
default: return; | |
} | |
} | |
}); | |
} | |
return false; | |
} | |
}(window.jQuery); |
Here is how you can use those 2 functions:
simple function call with your selector like:
$("#mainblock").disable();
Ref:
https://github.com/peachananr/onepage-scroll#fnmoveup
Thanks
Thank you. Worked like charm...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Спасибо бро, ты лучший. Может подскажешь такой момент, как мне остановить функцию перехода на другой слайд по какому-то условию? Например я хочу что бы переходило только после того как выполнится вся анимация ухода со страницы.