Forked from AlexeySachkov/jquery.onepage-scroll.js
Created
February 24, 2020 12:42
-
-
Save ravirajthangaraj/e868056fae0e8381acc9c3efa91bba1e 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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment