jQuery(document).ready(function ($) {
"use strict";
var dataAttribute = $(".data-bg");
dataAttribute.each(function (indx) {
if ($(this).attr("data-background")) {
$(this).css("background-image", "url(" + $(this).data("background") + ")");
}
});
var swiper = new Swiper('.homepage-carousel-slider', {
autoplay: {
delay: 4000,
disableOnInteraction: false,
},
loop: true,
spaceBetween: 50,
navigation: {
nextEl: '.wedevs-carousel-next',
prevEl: '.wedevs-carousel-prev',
},
breakpoints: {
480: {
slidesPerView: 1,
},
640: {
slidesPerView: 2,
},
768: {
slidesPerView: 2,
},
1024: {
slidesPerView: 3,
},
1200: {
slidesPerView: 'auto',
},
}
});
// Related Posts Slider
var swiper = new Swiper('.wedevs-related-carousel', {
autoplay: {
delay: 4000,
disableOnInteraction: false,
},
loop: true,
pagination: {
el: ".swiper-pagination-carousel",
type: "progressbar",
},
navigation: {
nextEl: '.wedevs-related-next',
prevEl: '.wedevs-related-prev',
},
breakpoints: {
480: {
slidesPerView: 1,
},
768: {
slidesPerView: 2,
},
1024: {
slidesPerView: 3,
},
}
});
// Widget Slider
var swiper = new Swiper('.widget-swiper-slider', {
autoplay: {
delay: 4000,
disableOnInteraction: false,
},
loop: true,
spaceBetween: 50,
navigation: {
nextEl: '.wedevs-sidebar-slide-next',
prevEl: '.wedevs-sidebar-slide-prev',
},
breakpoints: {
1024: {
slidesPerView: 1,
},
}
});
var mainslider = new Swiper('.wedevs-slider-main', {
spaceBetween: 0,
autoplay: {
delay: 9500,
disableOnInteraction: false,
},
loop: true,
direction: 'vertical',
loopedSlides: 1,
thumbs: {
swiper: slidercontent
}
});
var slidercontent = new Swiper('.wedevs-slider-content', {
spaceBetween: 10,
centeredSlides: true,
slidesPerView: 1,
touchRatio: 0.2,
slideToClickedSlide: true,
loop: true,
navigation: {
nextEl: '.button-next',
prevEl: '.button-prev',
},
pagination: {
el: '.wedevs-swiper-pagination',
clickable: true,
renderBullet: function (index, className) {
return '';
},
},
});
if ($(".wedevs-slider-main")[0]) {
mainslider.controller.control = slidercontent;
slidercontent.controller.control = mainslider;
} else {}
$('.widget .gallery, .entry-content .gallery, .wp-block-gallery').each(function () {
$(this).magnificPopup({
delegate: 'a',
type: 'image',
closeOnContentClick: false,
closeBtnInside: false,
mainClass: 'mfp-with-zoom mfp-img-mobile',
image: {
verticalFit: true,
titleSrc: function (item) {
return item.el.attr('title');
}
},
gallery: {
enabled: true
},
zoom: {
enabled: true,
duration: 300,
opener: function (element) {
return element.find('img');
}
}
});
});
$('.widget-area').theiaStickySidebar({
additionalMarginTop: 30
});
$(window).scroll(function () {
if ($(window).scrollTop() > $(window).height() / 2) {
$(".scroll-up").fadeIn(300);
}else{
$(".scroll-up").fadeOut(300);
}
});
// Scroll to Top on Click
$('.scroll-up').click(function () {
$("html, body").animate({
scrollTop: 0
}, 700);
return false;
});
if (document.cookie.indexOf('visited=true') == -1) {
$(window).load(function () {
$('.wedevs-modal.single-load').each(function () {
$(this).addClass('is-visible');
});
});
} else {
$(window).load(function () {
$('.wedevs-modal.always-load').each(function () {
$(this).addClass('is-visible');
});
});
}
$('.wedevs-modal-toggle').on("click", function () {
$('.wedevs-modal').toggleClass('is-visible');
});
$('.single-load .wedevs-modal-toggle').on("click", function () {
$('.wedevs-modal').removeClass('is-visible');
var year = 1000 * 60 * 60 * 24 * 365;
var expires = new Date((new Date()).valueOf() + year);
document.cookie = "visited=true;expires=" + expires.toUTCString();
});
// Woocommerce
$(".minicart-title-handle").on("click", function () {
$(".minicart-content").slideToggle();
$('.header-wedevs-minicart').toggleClass('active-mini-cart');
});
function asterisk_lite_is_on_screen(elem) {
if ($(elem)[0]) {
var tmtwindow = jQuery(window);
var viewport_top = tmtwindow.scrollTop();
var viewport_height = tmtwindow.height();
var viewport_bottom = viewport_top + viewport_height;
var tmtelem = jQuery(elem);
var top = tmtelem.offset().top;
var height = tmtelem.height();
var bottom = top + height;
return (top >= viewport_top && top < viewport_bottom) ||
(bottom > viewport_top && bottom <= viewport_bottom) ||
(height > viewport_height && top <= viewport_top && bottom >= viewport_bottom);
}
}
var n = window.WEDEV_JS || {};
var paged = parseInt(asterisk_lite_frontend.paged) + 1;
var maxpage = asterisk_lite_frontend.maxpage;
var nextLink = asterisk_lite_frontend.nextLink;
var loadmore = asterisk_lite_frontend.loadmore;
var loading = asterisk_lite_frontend.loading;
var nomore = asterisk_lite_frontend.nomore;
var pagination_layout = asterisk_lite_frontend.pagination_layout;
function asterisk_lite_load_content_ajax(){
if ((!$('.theme-no-posts').hasClass('theme-no-posts'))) {
$('.wedevs-loading-btn .loading-text').text(loading);
$('.theme-loading-status').addClass('theme-ajax-loading');
console.log( nextLink );
$('.theme-loaded-content').load(nextLink + ' .wedevs-post-wrapper', function () {
if (paged < 10) {
var newlink = nextLink.substring(0, nextLink.length - 2);
} else {
var newlink = nextLink.substring(0, nextLink.length - 3);
}
paged++;
paged = "=" + paged;
newlink = newlink.replace("paged=", "paged");
nextLink = newlink + paged + "/";
paged = paged.replace("=", "");
if (paged > maxpage) {
$('.wedevs-loading-btn').addClass('theme-no-posts');
$('.wedevs-loading-btn .loading-text').text(nomore);
} else {
$('.wedevs-loading-btn .loading-text').text(loadmore);
}
var lodedContent = $('.theme-loaded-content').html();
// $('.theme-loaded-content').html('');
$('.site-archive-main').append(lodedContent);
$('.theme-loading-status').removeClass('theme-ajax-loading');
$('.theme-article-post').each(function () {
if (!$(this).hasClass('theme-article-loaded')) {
$(this).addClass(paged + '-theme-article-ajax');
$(this).addClass('theme-article-loaded');
}
});
var isMobile = false;
if( /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
$('html').addClass('touch');
isMobile = true;
}
else{
$('html').addClass('no-touch');
isMobile = false;
}
});
}
}
$('.wedevs-loading-btn').click(function () {
asterisk_lite_load_content_ajax();
});
if (pagination_layout == 'auto-load') {
$(window).scroll(function () {
if (!$('.theme-loading-status').hasClass('theme-ajax-loading') && !$('.wedevs-loading-btn').hasClass('theme-no-posts') && maxpage > 1 && asterisk_lite_is_on_screen('.wedevs-loading-btn')) {
asterisk_lite_load_content_ajax();
}
});
}
$('.skip-minicart-start').focus(function(){
$('.woocommerce-mini-cart__buttons .wc-forward').focus();
});
$('.skip-minicart-end').focus(function(){
$('.minicart-toggle').focus();
});
// Close Action on ESC button
$(document).keyup(function (j) {
if (j.key === "Escape") { // escape key maps to keycode `27`
$('.header-wedevs-minicart').removeClass('active-mini-cart');
$(".minicart-content").slideUp();
}
});
});
var wedevsjs = wedevsjs || {};
// event "polyfill"
wedevsjs.createEvent = function( eventName ) {
var event;
if ( typeof window.Event === 'function' ) {
event = new Event( eventName );
} else {
event = document.createEvent( 'Event' );
event.initEvent( eventName, true, false );
}
return event;
};
// Add a class to the body for when touch is enabled for browsers that don't support media queries
// for interaction media features. Adapted from .
wedevsjs.touchEnabled = {
init: function () {
var matchMedia = function () {
// Include the 'heartz' as a way to have a non-matching MQ to help terminate the join. See .
var prefixes = ['-webkit-', '-moz-', '-o-', '-ms-'];
var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
return window.matchMedia && window.matchMedia(query).matches;
};
if (('ontouchstart' in window) || (window.DocumentTouch && document instanceof window.DocumentTouch) || matchMedia()) {
document.body.classList.add('touch-enabled');
}
}
}; // wedevsjs.touchEnabled
wedevsjs.modalMenu = {
init: function () {
// If the current menu item is in a sub level, expand all the levels higher up on load.
this.expandLevel();
this.keepFocusInModal();
},
expandLevel: function () {
var modalMenus = document.querySelectorAll('.modal-menu');
modalMenus.forEach(function (modalMenu) {
var activeMenuItem = modalMenu.querySelector('.current-menu-item');
if (activeMenuItem) {
wedevsjsFindParents(activeMenuItem, 'li').forEach(function (element) {
var subMenuToggle = element.querySelector('.sub-menu-toggle');
if (subMenuToggle) {
wedevsjs.toggles.performToggle(subMenuToggle, true);
}
});
}
});
},
keepFocusInModal: function () {
var _doc = document;
_doc.addEventListener('keydown', function (event) {
var toggleTarget, modal, selectors, elements, menuType, activeEl, lastEl, firstEl, tabKey,
shiftKey,
clickedEl = wedevsjs.toggles.clickedEl;
if (clickedEl && _doc.body.classList.contains('showing-modal')) {
toggleTarget = clickedEl.dataset.toggleTarget;
selectors = 'input, a, button';
modal = _doc.querySelector(toggleTarget);
elements = modal.querySelectorAll(selectors);
elements = Array.prototype.slice.call(elements);
if ('.menu-modal' === toggleTarget) {
menuType = '.menu-skip-link';
elements = elements.filter(function (element) {
return null !== element.closest(menuType) && null !== element.offsetParent;
});
elements.unshift(_doc.querySelector('.close-nav-toggle'));
}
lastEl = elements[elements.length - 1];
firstEl = elements[0];
activeEl = _doc.activeElement;
tabKey = event.keyCode === 9;
shiftKey = event.shiftKey;
if (!shiftKey && tabKey && lastEl === activeEl) {
event.preventDefault();
firstEl.focus();
}
if (shiftKey && tabKey && firstEl === activeEl) {
event.preventDefault();
lastEl.focus();
}
}
});
}
};
/* -----------------------------------------------------------------------------------------------
Primary Menu
--------------------------------------------------------------------------------------------------- */
wedevsjs.primaryMenu = {
init: function () {
this.focusMenuWithChildren();
},
// The focusMenuWithChildren() function implements Keyboard Navigation in the Primary Menu
// by adding the '.focus' class to all 'li.menu-item-has-children' when the focus is on the 'a' element.
focusMenuWithChildren: function () {
// Get all the link elements within the primary menu.
var links, i, len,
menu = document.querySelector('.primary-menu-wrapper');
if (!menu) {
return false;
}
links = menu.getElementsByTagName('a');
// Each time a menu link is focused or blurred, toggle focus.
for (i = 0, len = links.length; i < len; i++) {
links[i].addEventListener('focus', toggleFocus, true);
links[i].addEventListener('blur', toggleFocus, true);
}
//Sets or removes the .focus class on an element.
function toggleFocus() {
var self = this;
// Move up through the ancestors of the current link until we hit .primary-menu.
while (-1 === self.className.indexOf('primary-menu')) {
// On li elements toggle the class .focus.
if ('li' === self.tagName.toLowerCase()) {
if (-1 !== self.className.indexOf('focus')) {
self.className = self.className.replace(' focus', '');
} else {
self.className += ' focus';
}
}
self = self.parentElement;
}
}
}
}; // wedevsjs.primaryMenu
/* -----------------------------------------------------------------------------------------------
Toggles
--------------------------------------------------------------------------------------------------- */
wedevsjs.toggles = {
clickedEl: false,
init: function () {
// Do the toggle.
this.toggle();
// Check for toggle/untoggle on resize.
this.resizeCheck();
// Check for untoggle on escape key press.
this.untoggleOnEscapeKeyPress();
},
performToggle: function (element, instantly) {
var target, timeOutTime, classToToggle,
self = this,
_doc = document,
// Get our targets.
toggle = element,
targetString = toggle.dataset.toggleTarget,
activeClass = 'active';
// Elements to focus after modals are closed.
if (!_doc.querySelectorAll('.show-modal').length) {
self.clickedEl = _doc.activeElement;
}
if (targetString === 'next') {
target = toggle.nextSibling;
} else {
target = _doc.querySelector(targetString);
}
// Trigger events on the toggle targets before they are toggled.
if (target.classList.contains(activeClass)) {
target.dispatchEvent(wedevsjs.createEvent('toggle-target-before-active'));
} else {
target.dispatchEvent(wedevsjs.createEvent('toggle-target-before-inactive'));
}
// Get the class to toggle, if specified.
classToToggle = toggle.dataset.classToToggle ? toggle.dataset.classToToggle : activeClass;
// For cover modals, set a short timeout duration so the class animations have time to play out.
timeOutTime = 0;
if (target.classList.contains('cover-modal')) {
timeOutTime = 10;
}
setTimeout(function () {
var focusElement,
subMenued = target.classList.contains('sub-menu'),
newTarget = subMenued ? toggle.closest('.menu-item').querySelector('.sub-menu') : target,
duration = toggle.dataset.toggleDuration;
// Toggle the target of the clicked toggle.
if (toggle.dataset.toggleType === 'slidetoggle' && !instantly && duration !== '0') {
wedevsjsMenuToggle(newTarget, duration);
} else {
newTarget.classList.toggle(classToToggle);
}
// If the toggle target is 'next', only give the clicked toggle the active class.
if (targetString === 'next') {
toggle.classList.toggle(activeClass);
} else if (target.classList.contains('sub-menu')) {
toggle.classList.toggle(activeClass);
} else {
// If not, toggle all toggles with this toggle target.
_doc.querySelector('*[data-toggle-target="' + targetString + '"]').classList.toggle(activeClass);
}
// Toggle aria-expanded on the toggle.
wedevsjsToggleAttribute(toggle, 'aria-expanded', 'true', 'false');
if (self.clickedEl && -1 !== toggle.getAttribute('class').indexOf('close-')) {
wedevsjsToggleAttribute(self.clickedEl, 'aria-expanded', 'true', 'false');
}
// Toggle body class.
if (toggle.dataset.toggleBodyClass) {
_doc.body.classList.toggle(toggle.dataset.toggleBodyClass);
}
// Check whether to set focus.
if (toggle.dataset.setFocus) {
focusElement = _doc.querySelector(toggle.dataset.setFocus);
if (focusElement) {
if (target.classList.contains(activeClass)) {
focusElement.focus();
} else {
focusElement.blur();
}
}
}
// Trigger the toggled event on the toggle target.
target.dispatchEvent(wedevsjs.createEvent('toggled'));
// Trigger events on the toggle targets after they are toggled.
if (target.classList.contains(activeClass)) {
target.dispatchEvent(wedevsjs.createEvent('toggle-target-after-active'));
} else {
target.dispatchEvent(wedevsjs.createEvent('toggle-target-after-inactive'));
}
}, timeOutTime);
},
// Do the toggle.
toggle: function () {
var self = this;
document.querySelectorAll('*[data-toggle-target]').forEach(function (element) {
element.addEventListener('click', function (event) {
event.preventDefault();
self.performToggle(element);
});
});
},
// Check for toggle/untoggle on screen resize.
resizeCheck: function () {
if (document.querySelectorAll('*[data-untoggle-above], *[data-untoggle-below], *[data-toggle-above], *[data-toggle-below]').length) {
window.addEventListener('resize', function () {
var winWidth = window.innerWidth,
toggles = document.querySelectorAll('.toggle');
toggles.forEach(function (toggle) {
var unToggleAbove = toggle.dataset.untoggleAbove,
unToggleBelow = toggle.dataset.untoggleBelow,
toggleAbove = toggle.dataset.toggleAbove,
toggleBelow = toggle.dataset.toggleBelow;
// If no width comparison is set, continue.
if (!unToggleAbove && !unToggleBelow && !toggleAbove && !toggleBelow) {
return;
}
// If the toggle width comparison is true, toggle the toggle.
if (
(((unToggleAbove && winWidth > unToggleAbove) ||
(unToggleBelow && winWidth < unToggleBelow)) &&
toggle.classList.contains('active')) ||
(((toggleAbove && winWidth > toggleAbove) ||
(toggleBelow && winWidth < toggleBelow)) &&
!toggle.classList.contains('active'))
) {
toggle.click();
}
});
});
}
},
// Close toggle on escape key press.
untoggleOnEscapeKeyPress: function () {
document.addEventListener('keyup', function (event) {
if (event.key === 'Escape') {
document.querySelectorAll('*[data-untoggle-on-escape].active').forEach(function (element) {
if (element.classList.contains('active')) {
element.click();
}
});
}
});
}
}; // wedevsjs.toggles
/* -----------------------------------------------------------------------------------------------
Cover Modals
--------------------------------------------------------------------------------------------------- */
wedevsjs.coverModals = {
init: function () {
if (document.querySelector('.cover-modal')) {
// Handle cover modals when they're toggled.
this.onToggle();
// When toggled, untoggle if visitor clicks on the wrapping element of the modal.
this.outsideUntoggle();
// Close on escape key press.
this.closeOnEscape();
// Hide and show modals before and after their animations have played out.
this.hideAndShowModals();
}
},
// Handle cover modals when they're toggled.
onToggle: function () {
document.querySelectorAll('.cover-modal').forEach(function (element) {
element.addEventListener('toggled', function (event) {
var modal = event.target,
body = document.body;
if (modal.classList.contains('active')) {
body.classList.add('showing-modal');
} else {
body.classList.remove('showing-modal');
body.classList.add('hiding-modal');
// Remove the hiding class after a delay, when animations have been run.
setTimeout(function () {
body.classList.remove('hiding-modal');
}, 500);
}
});
});
},
// Close modal on outside click.
outsideUntoggle: function () {
document.addEventListener('click', function (event) {
var target = event.target;
var modal = document.querySelector('.cover-modal.active');
// if target onclick is with # within the href attribute
if (event.target.tagName.toLowerCase() === 'a' && event.target.hash.includes('#') && modal !== null) {
// untoggle the modal
this.untoggleModal(modal);
// wait 550 and scroll to the anchor
setTimeout(function () {
var anchor = document.getElementById(event.target.hash.slice(1));
anchor.scrollIntoView();
}, 550);
}
if (target === modal) {
this.untoggleModal(target);
}
}.bind(this));
},
// Close modal on escape key press.
closeOnEscape: function () {
document.addEventListener('keydown', function (event) {
if (event.keyCode === 27) {
event.preventDefault();
document.querySelectorAll('.cover-modal.active').forEach(function (element) {
this.untoggleModal(element);
}.bind(this));
}
}.bind(this));
},
// Hide and show modals before and after their animations have played out.
hideAndShowModals: function () {
var _doc = document,
_win = window,
modals = _doc.querySelectorAll('.cover-modal'),
htmlStyle = _doc.documentElement.style,
adminBar = _doc.querySelector('#wpadminbar');
function getAdminBarHeight(negativeValue) {
var height,
currentScroll = _win.pageYOffset;
if (adminBar) {
height = currentScroll + adminBar.getBoundingClientRect().height;
return negativeValue ? -height : height;
}
return currentScroll === 0 ? 0 : -currentScroll;
}
function htmlStyles() {
var overflow = _win.innerHeight > _doc.documentElement.getBoundingClientRect().height;
return {
'overflow-y': overflow ? 'hidden' : 'scroll',
position: 'fixed',
width: '100%',
top: getAdminBarHeight(true) + 'px',
left: 0
};
}
// Show the modal.
modals.forEach(function (modal) {
modal.addEventListener('toggle-target-before-inactive', function (event) {
var styles = htmlStyles(),
offsetY = _win.pageYOffset,
paddingTop = (Math.abs(getAdminBarHeight()) - offsetY) + 'px',
mQuery = _win.matchMedia('(max-width: 600px)');
if (event.target !== modal) {
return;
}
Object.keys(styles).forEach(function (styleKey) {
htmlStyle.setProperty(styleKey, styles[styleKey]);
});
_win.wedevsjs.scrolled = parseInt(styles.top, 10);
if (adminBar) {
_doc.body.style.setProperty('padding-top', paddingTop);
if (mQuery.matches) {
if (offsetY >= getAdminBarHeight()) {
modal.style.setProperty('top', 0);
} else {
modal.style.setProperty('top', (getAdminBarHeight() - offsetY) + 'px');
}
}
}
modal.classList.add('show-modal');
});
// Hide the modal after a delay, so animations have time to play out.
modal.addEventListener('toggle-target-after-inactive', function (event) {
if (event.target !== modal) {
return;
}
setTimeout(function () {
var clickedEl = wedevsjs.toggles.clickedEl;
modal.classList.remove('show-modal');
Object.keys(htmlStyles()).forEach(function (styleKey) {
htmlStyle.removeProperty(styleKey);
});
if (adminBar) {
_doc.body.style.removeProperty('padding-top');
modal.style.removeProperty('top');
}
if (clickedEl !== false) {
clickedEl.focus();
clickedEl = false;
}
_win.scrollTo(0, Math.abs(_win.wedevsjs.scrolled + getAdminBarHeight()));
_win.wedevsjs.scrolled = 0;
}, 500);
});
});
},
// Untoggle a modal.
untoggleModal: function (modal) {
var modalTargetClass,
modalToggle = false;
// If the modal has specified the string (ID or class) used by toggles to target it, untoggle the toggles with that target string.
// The modal-target-string must match the string toggles use to target the modal.
if (modal.dataset.modalTargetString) {
modalTargetClass = modal.dataset.modalTargetString;
modalToggle = document.querySelector('*[data-toggle-target="' + modalTargetClass + '"]');
}
// If a modal toggle exists, trigger it so all of the toggle options are included.
if (modalToggle) {
modalToggle.click();
// If one doesn't exist, just hide the modal.
} else {
modal.classList.remove('active');
}
}
}; // wedevsjs.coverModals
/**
* Is the DOM ready?
*
* This implementation is coming from https://gomakethings.com/a-native-javascript-equivalent-of-jquerys-ready-method/
*
* @param {Function} fn Callback function to run.
*/
function wedevsjsDomReady(fn) {
if (typeof fn !== 'function') {
return;
}
if (document.readyState === 'interactive' || document.readyState === 'complete') {
return fn();
}
document.addEventListener('DOMContentLoaded', fn, false);
}
wedevsjsDomReady(function () {
wedevsjs.toggles.init(); // Handle toggles.
wedevsjs.coverModals.init(); // Handle cover modals.
wedevsjs.modalMenu.init(); // Modal Menu.
wedevsjs.primaryMenu.init(); // Primary Menu.
wedevsjs.touchEnabled.init(); // Add class to body if device is touch-enabled.
});
/* -----------------------------------------------------------------------------------------------
Helper functions
--------------------------------------------------------------------------------------------------- */
/* Toggle an attribute ----------------------- */
function wedevsjsToggleAttribute( element, attribute, trueVal, falseVal ) {
if ( element.classList.contains( 'close-search-toggle' ) ) {
return;
}
if ( trueVal === undefined ) {
trueVal = true;
}
if ( falseVal === undefined ) {
falseVal = false;
}
if ( element.getAttribute( attribute ) !== trueVal ) {
element.setAttribute( attribute, trueVal );
} else {
element.setAttribute( attribute, falseVal );
}
}
/**
* Toggle a menu item on or off.
*
* @param {HTMLElement} target
* @param {number} duration
*/
function wedevsjsMenuToggle( target, duration ) {
var initialParentHeight, finalParentHeight, menu, menuItems, transitionListener,
initialPositions = [],
finalPositions = [];
if ( ! target ) {
return;
}
menu = target.closest( '.menu-wrapper' );
// Step 1: look at the initial positions of every menu item.
menuItems = menu.querySelectorAll( '.menu-item' );
menuItems.forEach( function( menuItem, index ) {
initialPositions[ index ] = { x: menuItem.offsetLeft, y: menuItem.offsetTop };
} );
initialParentHeight = target.parentElement.offsetHeight;
target.classList.add( 'toggling-target' );
// Step 2: toggle target menu item and look at the final positions of every menu item.
target.classList.toggle( 'active' );
menuItems.forEach( function( menuItem, index ) {
finalPositions[ index ] = { x: menuItem.offsetLeft, y: menuItem.offsetTop };
} );
finalParentHeight = target.parentElement.offsetHeight;
// Step 3: close target menu item again.
// The whole process happens without giving the browser a chance to render, so it's invisible.
target.classList.toggle( 'active' );
/*
* Step 4: prepare animation.
* Position all the items with absolute offsets, at the same starting position.
* Shouldn't result in any visual changes if done right.
*/
menu.classList.add( 'is-toggling' );
target.classList.toggle( 'active' );
menuItems.forEach( function( menuItem, index ) {
var initialPosition = initialPositions[ index ];
if ( initialPosition.y === 0 && menuItem.parentElement === target ) {
initialPosition.y = initialParentHeight;
}
menuItem.style.transform = 'translate(' + initialPosition.x + 'px, ' + initialPosition.y + 'px)';
} );
/*
* The double rAF is unfortunately needed, since we're toggling CSS classes, and
* the only way to ensure layout completion here across browsers is to wait twice.
* This just delays the start of the animation by 2 frames and is thus not an issue.
*/
requestAnimationFrame( function() {
requestAnimationFrame( function() {
/*
* Step 5: start animation by moving everything to final position.
* All the layout work has already happened, while we were preparing for the animation.
* The animation now runs entirely in CSS, using cheap CSS properties (opacity and transform)
* that don't trigger the layout or paint stages.
*/
menu.classList.add( 'is-animating' );
menuItems.forEach( function( menuItem, index ) {
var finalPosition = finalPositions[ index ];
if ( finalPosition.y === 0 && menuItem.parentElement === target ) {
finalPosition.y = finalParentHeight;
}
if ( duration !== undefined ) {
menuItem.style.transitionDuration = duration + 'ms';
}
menuItem.style.transform = 'translate(' + finalPosition.x + 'px, ' + finalPosition.y + 'px)';
} );
if ( duration !== undefined ) {
target.style.transitionDuration = duration + 'ms';
}
} );
// Step 6: finish toggling.
// Remove all transient classes when the animation ends.
transitionListener = function() {
menu.classList.remove( 'is-animating' );
menu.classList.remove( 'is-toggling' );
target.classList.remove( 'toggling-target' );
menuItems.forEach( function( menuItem ) {
menuItem.style.transform = '';
menuItem.style.transitionDuration = '';
} );
target.style.transitionDuration = '';
target.removeEventListener( 'transitionend', transitionListener );
};
target.addEventListener( 'transitionend', transitionListener );
} );
}
/**
* Traverses the DOM up to find elements matching the query.
*
* @param {HTMLElement} target
* @param {string} query
* @return {NodeList} parents matching query
*/
function wedevsjsFindParents( target, query ) {
var parents = [];
// Recursively go up the DOM adding matches to the parents array.
function traverse( item ) {
var parent = item.parentNode;
if ( parent instanceof HTMLElement ) {
if ( parent.matches( query ) ) {
parents.push( parent );
}
traverse( parent );
}
}
traverse( target );
return parents;
}
jQuery(document).ready(function ($) {
// Here You can type your custom JavaScript...
var header = document.getElementById("site-header-main");
if (header) {
window.onscroll = function () {
myFunction()
};
var sticky = header.offsetTop;
function myFunction() {
if (window.pageYOffset > sticky) {
header.classList.add("theme-navbar-affix");
} else {
header.classList.remove("theme-navbar-affix");
}
}
}
});
jQuery(document).ready(function ($) {
var didScroll;
var lastScrollTop = 0;
var delta = 5;
var navbarHeight = $('#site-header-main').outerHeight();
$(window).on('scroll', function (event) {
didScroll = true;
});
setInterval(function () {
if (didScroll) {
hasScrolled();
didScroll = false;
}
}, 250);
function hasScrolled() {
var st = $(this).scrollTop();
// Make sure they scroll more than delta
if (Math.abs(lastScrollTop - st) <= delta)
return;
// If they scrolled down and are past the navbar, add class .nav-up.
// This is necessary so you never see what is "behind" the navbar.
if (st > lastScrollTop && st > navbarHeight) {
// Scroll Down
$('#site-header-main').removeClass('navbar-affix-down').addClass('navbar-affix-up');
} else {
// Scroll Up
if (st + $(window).height() < $(document).height()) {
$('#site-header-main').removeClass('navbar-affix-up').addClass('navbar-affix-down');
}
}
lastScrollTop = st;
}
});