first
This commit is contained in:
568
plugins/snap/1.9.3/snap.js
Normal file
568
plugins/snap/1.9.3/snap.js
Normal file
@@ -0,0 +1,568 @@
|
||||
/*
|
||||
|
||||
* Snap.js
|
||||
|
||||
*
|
||||
|
||||
* Copyright 2013, Jacob Kelley - http://jakiestfu.com/
|
||||
|
||||
* Released under the MIT Licence
|
||||
|
||||
* http://opensource.org/licenses/MIT
|
||||
|
||||
*
|
||||
|
||||
* Github: http://github.com/jakiestfu/Snap.js/
|
||||
|
||||
* Version: 1.9.3
|
||||
|
||||
*/
|
||||
|
||||
/*jslint browser: true*/
|
||||
|
||||
/*global define, module, ender*/
|
||||
|
||||
(function(win, doc) {
|
||||
|
||||
'use strict';
|
||||
|
||||
var Snap = Snap || function(userOpts) {
|
||||
|
||||
var settings = {
|
||||
|
||||
element: null,
|
||||
|
||||
dragger: null,
|
||||
|
||||
disable: 'none',
|
||||
|
||||
addBodyClasses: true,
|
||||
|
||||
hyperextensible: true,
|
||||
|
||||
resistance: 0.5,
|
||||
|
||||
flickThreshold: 50,
|
||||
|
||||
transitionSpeed: 0.3,
|
||||
|
||||
easing: 'ease',
|
||||
|
||||
maxPosition: 266,
|
||||
|
||||
minPosition: -266,
|
||||
|
||||
tapToClose: true,
|
||||
|
||||
touchToDrag: true,
|
||||
|
||||
slideIntent: 40, // degrees
|
||||
|
||||
minDragDistance: 5
|
||||
|
||||
},
|
||||
|
||||
cache = {
|
||||
|
||||
simpleStates: {
|
||||
|
||||
opening: null,
|
||||
|
||||
towards: null,
|
||||
|
||||
hyperExtending: null,
|
||||
|
||||
halfway: null,
|
||||
|
||||
flick: null,
|
||||
|
||||
translation: {
|
||||
|
||||
absolute: 0,
|
||||
|
||||
relative: 0,
|
||||
|
||||
sinceDirectionChange: 0,
|
||||
|
||||
percentage: 0
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
eventList = {},
|
||||
|
||||
utils = {
|
||||
|
||||
hasTouch: ('ontouchstart' in doc.documentElement || win.navigator.msPointerEnabled),
|
||||
|
||||
eventType: function(action) {
|
||||
|
||||
var eventTypes = {
|
||||
|
||||
down: (utils.hasTouch ? 'touchstart' : 'mousedown'),
|
||||
|
||||
move: (utils.hasTouch ? 'touchmove' : 'mousemove'),
|
||||
|
||||
up: (utils.hasTouch ? 'touchend' : 'mouseup'),
|
||||
|
||||
out: (utils.hasTouch ? 'touchcancel' : 'mouseout')
|
||||
|
||||
};
|
||||
|
||||
return eventTypes[action];
|
||||
|
||||
},
|
||||
|
||||
page: function(t, e){
|
||||
|
||||
return (utils.hasTouch && e.touches.length && e.touches[0]) ? e.touches[0]['page'+t] : e['page'+t];
|
||||
|
||||
},
|
||||
|
||||
klass: {
|
||||
|
||||
has: function(el, name){
|
||||
|
||||
return (el.className).indexOf(name) !== -1;
|
||||
|
||||
},
|
||||
|
||||
add: function(el, name){
|
||||
|
||||
if(!utils.klass.has(el, name) && settings.addBodyClasses){
|
||||
|
||||
el.className += " "+name;
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
remove: function(el, name){
|
||||
|
||||
if(settings.addBodyClasses){
|
||||
|
||||
el.className = (el.className).replace(name, "").replace(/^\s+|\s+$/g, '');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
dispatchEvent: function(type) {
|
||||
|
||||
if (typeof eventList[type] === 'function') {
|
||||
|
||||
return eventList[type].call();
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
vendor: function(){
|
||||
|
||||
var tmp = doc.createElement("div"),
|
||||
|
||||
prefixes = 'webkit Moz O ms'.split(' '),
|
||||
|
||||
i;
|
||||
|
||||
for (i in prefixes) {
|
||||
|
||||
if (typeof tmp.style[prefixes[i] + 'Transition'] !== 'undefined') {
|
||||
|
||||
return prefixes[i];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
transitionCallback: function(){
|
||||
|
||||
return (cache.vendor==='Moz' || cache.vendor==='ms') ? 'transitionend' : cache.vendor+'TransitionEnd';
|
||||
|
||||
},
|
||||
|
||||
canTransform: function(){
|
||||
|
||||
return typeof settings.element.style[cache.vendor+'Transform'] !== 'undefined';
|
||||
|
||||
},
|
||||
|
||||
deepExtend: function(destination, source) {
|
||||
|
||||
var property;
|
||||
|
||||
for (property in source) {
|
||||
|
||||
if (source[property] && source[property].constructor && source[property].constructor === Object) {
|
||||
|
||||
destination[property] = destination[property] || {};
|
||||
|
||||
utils.deepExtend(destination[property], source[property]);
|
||||
|
||||
} else {
|
||||
|
||||
destination[property] = source[property];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return destination;
|
||||
|
||||
},
|
||||
|
||||
angleOfDrag: function(x, y) {
|
||||
|
||||
var degrees, theta;
|
||||
|
||||
// Calc Theta
|
||||
|
||||
theta = Math.atan2(-(cache.startDragY - y), (cache.startDragX - x));
|
||||
|
||||
if (theta < 0) {
|
||||
|
||||
theta += 2 * Math.PI;
|
||||
|
||||
}
|
||||
|
||||
// Calc Degrees
|
||||
|
||||
degrees = Math.floor(theta * (180 / Math.PI) - 180);
|
||||
|
||||
if (degrees < 0 && degrees > -180) {
|
||||
|
||||
degrees = 360 - Math.abs(degrees);
|
||||
|
||||
}
|
||||
|
||||
return Math.abs(degrees);
|
||||
|
||||
},
|
||||
|
||||
events: {
|
||||
|
||||
addEvent: function addEvent(element, eventName, func) {
|
||||
|
||||
if (element.addEventListener) {
|
||||
|
||||
return element.addEventListener(eventName, func, false);
|
||||
|
||||
} else if (element.attachEvent) {
|
||||
|
||||
return element.attachEvent("on" + eventName, func);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
removeEvent: function addEvent(element, eventName, func) {
|
||||
|
||||
if (element.addEventListener) {
|
||||
|
||||
return element.removeEventListener(eventName, func, false);
|
||||
|
||||
} else if (element.attachEvent) {
|
||||
|
||||
return element.detachEvent("on" + eventName, func);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
prevent: function(e) {
|
||||
|
||||
if (e.preventDefault) {
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
} else {
|
||||
|
||||
e.returnValue = false;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
parentUntil: function(el, attr) {
|
||||
|
||||
var isStr = typeof attr === 'string';
|
||||
|
||||
while (el.parentNode) {
|
||||
|
||||
if (isStr && el.getAttribute && el.getAttribute(attr)){
|
||||
|
||||
return el;
|
||||
|
||||
} else if(!isStr && el === attr){
|
||||
|
||||
return el;
|
||||
|
||||
}
|
||||
|
||||
el = el.parentNode;
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
action = {
|
||||
|
||||
translate: {
|
||||
|
||||
get: {
|
||||
|
||||
matrix: function(index) {
|
||||
|
||||
|
||||
|
||||
if( !utils.canTransform() ){
|
||||
|
||||
return parseInt(settings.element.style.left, 10);
|
||||
|
||||
} else {
|
||||
|
||||
var matrix = win.getComputedStyle(settings.element)[cache.vendor+'Transform'].match(/\((.*)\)/),
|
||||
|
||||
ieOffset = 8;
|
||||
|
||||
if (matrix) {
|
||||
|
||||
matrix = matrix[1].split(',');
|
||||
|
||||
if(matrix.length===16){
|
||||
|
||||
index+=ieOffset;
|
||||
|
||||
}
|
||||
|
||||
return parseInt(matrix[index], 10);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
easeCallback: function(){
|
||||
|
||||
settings.element.style[cache.vendor+'Transition'] = '';
|
||||
|
||||
cache.translation = action.translate.get.matrix(4);
|
||||
|
||||
cache.easing = false;
|
||||
|
||||
clearInterval(cache.animatingInterval);
|
||||
|
||||
|
||||
|
||||
if(cache.easingTo===0){
|
||||
|
||||
utils.klass.remove(doc.body, 'snapjs-right');
|
||||
|
||||
utils.klass.remove(doc.body, 'snapjs-left');
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
utils.dispatchEvent('animated');
|
||||
|
||||
utils.events.removeEvent(settings.element, utils.transitionCallback(), action.translate.easeCallback);
|
||||
|
||||
},
|
||||
|
||||
easeTo: function(n) {
|
||||
|
||||
|
||||
|
||||
if( !utils.canTransform() ){
|
||||
|
||||
cache.translation = n;
|
||||
|
||||
action.translate.x(n);
|
||||
|
||||
} else {
|
||||
|
||||
cache.easing = true;
|
||||
|
||||
cache.easingTo = n;
|
||||
|
||||
|
||||
|
||||
settings.element.style[cache.vendor+'Transition'] = 'all ' + settings.transitionSpeed + 's ' + settings.easing;
|
||||
|
||||
|
||||
|
||||
cache.animatingInterval = setInterval(function() {
|
||||
|
||||
utils.dispatchEvent('animating');
|
||||
|
||||
}, 1);
|
||||
|
||||
|
||||
|
||||
utils.events.addEvent(settings.element, utils.transitionCallback(), action.translate.easeCallback);
|
||||
|
||||
action.translate.x(n);
|
||||
|
||||
}
|
||||
|
||||
if(n===0){
|
||||
|
||||
settings.element.style[cache.vendor+'Transform'] = '';
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
x: function(n) {
|
||||
|
||||
if( (settings.disable==='left' && n>0) ||
|
||||
|
||||
(settings.disable==='right' && n<0)
|
||||
|
||||
){ return; }
|
||||
|
||||
|
||||
|
||||
if( !settings.hyperextensible ){
|
||||
|
||||
if( n===settings.maxPosition || n>settings.maxPosition ){
|
||||
|
||||
n=settings.maxPosition;
|
||||
|
||||
} else if( n===settings.minPosition || n<settings.minPosition ){
|
||||
|
||||
n=settings.minPosition;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
n = parseInt(n, 10);
|
||||
|
||||
if(isNaN(n)){
|
||||
|
||||
n = 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
if( utils.canTransform() ){
|
||||
|
||||
var theTranslate = 'translate3d(' + n + 'px, 0,0)';
|
||||
|
||||
settings.element.style[cache.vendor+'Transform'] = theTranslate;
|
||||
|
||||
} else {
|
||||
|
||||
settings.element.style.width = (win.innerWidth || doc.documentElement.clientWidth)+'px';
|
||||
|
||||
|
||||
|
||||
settings.element.style.left = n+'px';
|
||||
|
||||
settings.element.style.right = '';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
drag: {
|
||||
|
||||
listen: function() {
|
||||
|
||||
cache.translation = 0;
|
||||
|
||||
cache.easing = false;
|
||||
|
||||
utils.events.addEvent(settings.element, utils.eventType('down'), action.drag.startDrag);
|
||||
|
||||
utils.events.addEvent(settings.element, utils.eventType('move'), action.drag.dragging);
|
||||
|
||||
utils.events.addEvent(settings.element, utils.eventType('up'), action.drag.endDrag);
|
||||
|
||||
},
|
||||
|
||||
stopListening: function() {
|
||||
|
||||
utils.events.removeEvent(settings.element, utils.eventType('down'), action.drag.startDrag);
|
||||
|
||||
utils.events.removeEvent(settings.element, utils.eventType('move'), action.drag.dragging);
|
||||
|
||||
utils.events.removeEvent(settings.element, utils.eventType('up'), action.drag.endDrag);
|
||||
|
||||
},
|
||||
|
||||
startDrag: function(e) {
|
||||
|
||||
// No drag on ignored elements
|
||||
|
||||
var target = e.target ? e.target : e.srcElement,
|
||||
|
||||
ignoreParent = utils.parentUntil(target, 'data-snap-ignore');
|
||||
|
||||
|
||||
|
||||
if (ignoreParent) {
|
||||
|
||||
utils.dispatchEvent('ignore');
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(settings.dragger){
|
||||
|
||||
var dragParent = utils.parentUntil(target, settings.dragger);
|
||||
|
||||
|
||||
|
||||
// Only use dragger if we're in a closed state
|
||||
|
||||
if( !dragParent &&
|
||||
|
||||
(cache.translation !== settings.minPosition &&
|
||||
|
||||
cache.translation !== settings.maxPosition
|
||||
|
||||
)){
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
utils.dispatchEvent('start');
|
||||
|
||||
settings.element.style[cache.vendor+'Transition'] = '';
|
||||
|
||||
Reference in New Issue
Block a user