Cool-Y.github.io/js/src/motion.js

353 lines
10 KiB
JavaScript
Raw Normal View History

2019-03-16 07:24:51 +00:00
/* global NexT: true */
$(document).ready(function () {
NexT.motion = {};
var sidebarToggleLines = {
lines: [],
push: function (line) {
this.lines.push(line);
},
init: function () {
this.lines.forEach(function (line) {
line.init();
});
},
arrow: function () {
this.lines.forEach(function (line) {
line.arrow();
});
},
close: function () {
this.lines.forEach(function (line) {
line.close();
});
}
};
function SidebarToggleLine(settings) {
this.el = $(settings.el);
this.status = $.extend({}, {
init: {
width: '100%',
opacity: 1,
left: 0,
rotateZ: 0,
top: 0
}
}, settings.status);
}
SidebarToggleLine.prototype.init = function () {
this.transform('init');
};
SidebarToggleLine.prototype.arrow = function () {
this.transform('arrow');
};
SidebarToggleLine.prototype.close = function () {
this.transform('close');
};
SidebarToggleLine.prototype.transform = function (status) {
this.el.velocity('stop').velocity(this.status[status]);
};
var sidebarToggleLine1st = new SidebarToggleLine({
el: '.sidebar-toggle-line-first',
status: {
arrow: {width: '50%', rotateZ: '-45deg', top: '2px'},
close: {width: '100%', rotateZ: '-45deg', top: '5px'}
}
});
var sidebarToggleLine2nd = new SidebarToggleLine({
el: '.sidebar-toggle-line-middle',
status: {
arrow: {width: '90%'},
close: {opacity: 0}
}
});
var sidebarToggleLine3rd = new SidebarToggleLine({
el: '.sidebar-toggle-line-last',
status: {
arrow: {width: '50%', rotateZ: '45deg', top: '-2px'},
close: {width: '100%', rotateZ: '45deg', top: '-5px'}
}
});
sidebarToggleLines.push(sidebarToggleLine1st);
sidebarToggleLines.push(sidebarToggleLine2nd);
sidebarToggleLines.push(sidebarToggleLine3rd);
var SIDEBAR_WIDTH = '320px';
var SIDEBAR_DISPLAY_DURATION = 200;
var xPos, yPos;
var sidebarToggleMotion = {
toggleEl: $('.sidebar-toggle'),
dimmerEl: $('#sidebar-dimmer'),
sidebarEl: $('.sidebar'),
isSidebarVisible: false,
init: function () {
this.toggleEl.on('click', this.clickHandler.bind(this));
this.dimmerEl.on('click', this.clickHandler.bind(this));
this.toggleEl.on('mouseenter', this.mouseEnterHandler.bind(this));
this.toggleEl.on('mouseleave', this.mouseLeaveHandler.bind(this));
this.sidebarEl.on('touchstart', this.touchstartHandler.bind(this));
this.sidebarEl.on('touchend', this.touchendHandler.bind(this));
this.sidebarEl.on('touchmove', function(e){e.preventDefault();});
$(document)
.on('sidebar.isShowing', function () {
NexT.utils.isDesktop() && $('body').velocity('stop').velocity(
{paddingRight: SIDEBAR_WIDTH},
SIDEBAR_DISPLAY_DURATION
);
})
.on('sidebar.isHiding', function () {
});
},
clickHandler: function () {
this.isSidebarVisible ? this.hideSidebar() : this.showSidebar();
this.isSidebarVisible = !this.isSidebarVisible;
},
mouseEnterHandler: function () {
if (this.isSidebarVisible) {
return;
}
sidebarToggleLines.arrow();
},
mouseLeaveHandler: function () {
if (this.isSidebarVisible) {
return;
}
sidebarToggleLines.init();
},
touchstartHandler: function(e) {
xPos = e.originalEvent.touches[0].clientX;
yPos = e.originalEvent.touches[0].clientY;
},
touchendHandler: function(e) {
var _xPos = e.originalEvent.changedTouches[0].clientX;
var _yPos = e.originalEvent.changedTouches[0].clientY;
if (_xPos-xPos > 30 && Math.abs(_yPos-yPos) < 20) {
this.clickHandler();
}
},
showSidebar: function () {
var self = this;
sidebarToggleLines.close();
this.sidebarEl.velocity('stop').velocity({
width: SIDEBAR_WIDTH
}, {
display: 'block',
duration: SIDEBAR_DISPLAY_DURATION,
begin: function () {
$('.sidebar .motion-element').velocity(
'transition.slideRightIn',
{
stagger: 50,
drag: true,
complete: function () {
self.sidebarEl.trigger('sidebar.motion.complete');
}
}
);
},
complete: function () {
self.sidebarEl.addClass('sidebar-active');
self.sidebarEl.trigger('sidebar.didShow');
}
}
);
this.sidebarEl.trigger('sidebar.isShowing');
},
hideSidebar: function () {
NexT.utils.isDesktop() && $('body').velocity('stop').velocity({paddingRight: 0});
this.sidebarEl.find('.motion-element').velocity('stop').css('display', 'none');
this.sidebarEl.velocity('stop').velocity({width: 0}, {display: 'none'});
sidebarToggleLines.init();
this.sidebarEl.removeClass('sidebar-active');
this.sidebarEl.trigger('sidebar.isHiding');
// Prevent adding TOC to Overview if Overview was selected when close & open sidebar.
if (!!$('.post-toc-wrap')) {
if ($('.site-overview-wrap').css('display') === 'block') {
$('.post-toc-wrap').removeClass('motion-element');
} else {
$('.post-toc-wrap').addClass('motion-element');
}
}
}
};
sidebarToggleMotion.init();
NexT.motion.integrator = {
queue: [],
cursor: -1,
add: function (fn) {
this.queue.push(fn);
return this;
},
next: function () {
this.cursor++;
var fn = this.queue[this.cursor];
$.isFunction(fn) && fn(NexT.motion.integrator);
},
bootstrap: function () {
this.next();
}
};
NexT.motion.middleWares = {
logo: function (integrator) {
var sequence = [];
var $brand = $('.brand');
var $title = $('.site-title');
var $subtitle = $('.site-subtitle');
var $logoLineTop = $('.logo-line-before i');
var $logoLineBottom = $('.logo-line-after i');
$brand.size() > 0 && sequence.push({
e: $brand,
p: {opacity: 1},
o: {duration: 200}
});
NexT.utils.isMist() && hasElement([$logoLineTop, $logoLineBottom]) &&
sequence.push(
getMistLineSettings($logoLineTop, '100%'),
getMistLineSettings($logoLineBottom, '-100%')
);
hasElement($title) && sequence.push({
e: $title,
p: {opacity: 1, top: 0},
o: { duration: 200 }
});
hasElement($subtitle) && sequence.push({
e: $subtitle,
p: {opacity: 1, top: 0},
o: {duration: 200}
});
if (CONFIG.motion.async) {
integrator.next();
}
if (sequence.length > 0) {
sequence[sequence.length - 1].o.complete = function () {
integrator.next();
};
$.Velocity.RunSequence(sequence);
} else {
integrator.next();
}
function getMistLineSettings (element, translateX) {
return {
e: $(element),
p: {translateX: translateX},
o: {
duration: 500,
sequenceQueue: false
}
};
}
/**
* Check if $elements exist.
* @param {jQuery|Array} $elements
* @returns {boolean}
*/
function hasElement ($elements) {
$elements = Array.isArray($elements) ? $elements : [$elements];
return $elements.every(function ($element) {
return $.isFunction($element.size) && $element.size() > 0;
});
}
},
menu: function (integrator) {
if (CONFIG.motion.async) {
integrator.next();
}
$('.menu-item').velocity('transition.slideDownIn', {
display: null,
duration: 200,
complete: function () {
integrator.next();
}
});
},
postList: function (integrator) {
//var $post = $('.post');
var $postBlock = $('.post-block, .pagination, .comments');
var $postBlockTransition = CONFIG.motion.transition.post_block;
var $postHeader = $('.post-header');
var $postHeaderTransition = CONFIG.motion.transition.post_header;
var $postBody = $('.post-body');
var $postBodyTransition = CONFIG.motion.transition.post_body;
var $collHeader = $('.collection-title, .archive-year');
var $collHeaderTransition = CONFIG.motion.transition.coll_header;
var $sidebarAffix = $('.sidebar-inner');
var $sidebarAffixTransition = CONFIG.motion.transition.sidebar;
var hasPost = $postBlock.size() > 0;
hasPost ? postMotion() : integrator.next();
if (CONFIG.motion.async) {
integrator.next();
}
function postMotion () {
var postMotionOptions = window.postMotionOptions || {
stagger: 100,
drag: true
};
postMotionOptions.complete = function () {
// After motion complete need to remove transform from sidebar to let affix work on Pisces | Gemini.
if (CONFIG.motion.transition.sidebar && (NexT.utils.isPisces() || NexT.utils.isGemini())) {
$sidebarAffix.css({ 'transform': 'initial' });
}
integrator.next();
};
//$post.velocity('transition.slideDownIn', postMotionOptions);
if (CONFIG.motion.transition.post_block) {
$postBlock.velocity('transition.' + $postBlockTransition, postMotionOptions);
}
if (CONFIG.motion.transition.post_header) {
$postHeader.velocity('transition.' + $postHeaderTransition, postMotionOptions);
}
if (CONFIG.motion.transition.post_body) {
$postBody.velocity('transition.' + $postBodyTransition, postMotionOptions);
}
if (CONFIG.motion.transition.coll_header) {
$collHeader.velocity('transition.' + $collHeaderTransition, postMotionOptions);
}
// Only for Pisces | Gemini.
if (CONFIG.motion.transition.sidebar && (NexT.utils.isPisces() || NexT.utils.isGemini())) {
$sidebarAffix.velocity('transition.' + $sidebarAffixTransition, postMotionOptions);
}
}
},
sidebar: function (integrator) {
if (CONFIG.sidebar.display === 'always') {
NexT.utils.displaySidebar();
}
integrator.next();
}
};
});