You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
7.4 KiB
257 lines
7.4 KiB
/* eslint-disable */ |
|
var customSearch; |
|
(function ($) { |
|
|
|
"use strict"; |
|
const scrollCorrection = 70; // (header height = 50px) + (gap = 20px) |
|
function scrolltoElement(elem, correction) { |
|
correction = correction || scrollCorrection; |
|
const $elem = elem.href ? $(elem.getAttribute('href')) : $(elem); |
|
$('html, body').animate({ 'scrollTop': $elem.offset().top - correction }, 400); |
|
}; |
|
|
|
function setHeader() { |
|
if (!window.subData) return; |
|
const $wrapper = $('header .wrapper'); |
|
const $comment = $('.s-comment', $wrapper); |
|
const $toc = $('.s-toc', $wrapper); |
|
const $top = $('.s-top', $wrapper); |
|
|
|
$wrapper.find('.nav-sub .logo').text(window.subData.title); |
|
let pos = document.body.scrollTop; |
|
$(document, window).scroll(() => { |
|
const scrollTop = $(window).scrollTop(); |
|
const del = scrollTop - pos; |
|
if (del >= 20) { |
|
pos = scrollTop; |
|
$wrapper.addClass('sub'); |
|
} else if (del <= -20) { |
|
pos = scrollTop; |
|
$wrapper.removeClass('sub'); |
|
} |
|
}); |
|
// bind events to every btn |
|
const $commentTarget = $('#comments'); |
|
if ($commentTarget.length) { |
|
$comment.click(e => { e.preventDefault(); e.stopPropagation(); scrolltoElement($commentTarget); }); |
|
} else $comment.remove(); |
|
|
|
const $tocTarget = $('.toc-wrapper'); |
|
if ($tocTarget.length && $tocTarget.children().length) { |
|
$toc.click((e) => { e.stopPropagation(); $tocTarget.toggleClass('active'); }); |
|
} else $toc.remove(); |
|
|
|
$top.click(()=>scrolltoElement(document.body)); |
|
|
|
} |
|
function setHeaderMenu() { |
|
var $headerMenu = $('header .menu'); |
|
var $underline = $headerMenu.find('.underline'); |
|
function setUnderline($item, transition) { |
|
$item = $item || $headerMenu.find('li a.active');//get instant |
|
transition = transition === undefined ? true : !!transition; |
|
if (!transition) $underline.addClass('disable-trans'); |
|
if ($item && $item.length) { |
|
$item.addClass('active').siblings().removeClass('active'); |
|
$underline.css({ |
|
left: $item.position().left, |
|
width: $item.innerWidth() |
|
}); |
|
} else { |
|
$underline.css({ |
|
left: 0, |
|
width: 0 |
|
}); |
|
} |
|
if (!transition) { |
|
setTimeout(function () { $underline.removeClass('disable-trans') }, 0);//get into the queue. |
|
} |
|
} |
|
$headerMenu.on('mouseenter', 'li', function (e) { |
|
setUnderline($(e.currentTarget)); |
|
}); |
|
$headerMenu.on('mouseout', function () { |
|
setUnderline(); |
|
}); |
|
//set current active nav |
|
var $active_link = null; |
|
if (location.pathname === '/' || location.pathname.startsWith('/page/')) { |
|
$active_link = $('.nav-home', $headerMenu); |
|
} else { |
|
var name = location.pathname.match(/\/(.*?)\//); |
|
if (name.length > 1) { |
|
$active_link = $('.nav-' + name[1], $headerMenu); |
|
} |
|
} |
|
setUnderline($active_link, false); |
|
} |
|
function setHeaderMenuPhone() { |
|
var $switcher = $('.l_header .switcher .s-menu'); |
|
$switcher.click(function (e) { |
|
e.stopPropagation(); |
|
$('body').toggleClass('z_menu-open'); |
|
$switcher.toggleClass('active'); |
|
}); |
|
$(document).click(function (e) { |
|
$('body').removeClass('z_menu-open'); |
|
$switcher.removeClass('active'); |
|
}); |
|
} |
|
function setHeaderSearch() { |
|
var $switcher = $('.l_header .switcher .s-search'); |
|
var $header = $('.l_header'); |
|
var $search = $('.l_header .m_search'); |
|
if ($switcher.length === 0) return; |
|
$switcher.click(function (e) { |
|
e.stopPropagation(); |
|
$header.toggleClass('z_search-open'); |
|
$search.find('input').focus(); |
|
}); |
|
$(document).click(function (e) { |
|
$header.removeClass('z_search-open'); |
|
}); |
|
$search.click(function (e) { |
|
e.stopPropagation(); |
|
}) |
|
} |
|
function setWaves() { |
|
Waves.attach('.flat-btn', ['waves-button']); |
|
Waves.attach('.float-btn', ['waves-button', 'waves-float']); |
|
Waves.attach('.float-btn-light', ['waves-button', 'waves-float', 'waves-light']); |
|
Waves.attach('.flat-box', ['waves-block']); |
|
Waves.attach('.float-box', ['waves-block', 'waves-float']); |
|
Waves.attach('.waves-image'); |
|
Waves.init(); |
|
} |
|
function setScrollReveal() { |
|
const $reveal = $('.reveal'); |
|
if ($reveal.length === 0) return; |
|
const sr = ScrollReveal({ distance: 0 }); |
|
sr.reveal('.reveal'); |
|
} |
|
function setTocToggle() { |
|
const $toc = $('.toc-wrapper'); |
|
if ($toc.length === 0) return; |
|
$toc.click((e) => { e.stopPropagation(); $toc.addClass('active'); }); |
|
$(document).click(() => $toc.removeClass('active')); |
|
|
|
$toc.on('click', 'a', (e) => { |
|
e.preventDefault(); |
|
e.stopPropagation(); |
|
scrolltoElement(e.target.tagName.toLowerCase === 'a' ? e.target : e.target.parentElement); |
|
}); |
|
|
|
const liElements = Array.from($toc.find('li a')); |
|
//function animate above will convert float to int. |
|
const getAnchor = () => liElements.map(elem => Math.floor($(elem.getAttribute('href')).offset().top - scrollCorrection)); |
|
|
|
let anchor = getAnchor(); |
|
const scrollListener = () => { |
|
const scrollTop = $('html').scrollTop() || $('body').scrollTop(); |
|
if (!anchor) return; |
|
//binary search. |
|
let l = 0, r = anchor.length - 1, mid; |
|
while (l < r) { |
|
mid = (l + r + 1) >> 1; |
|
if (anchor[mid] === scrollTop) l = r = mid; |
|
else if (anchor[mid] < scrollTop) l = mid; |
|
else r = mid - 1; |
|
} |
|
$(liElements).removeClass('active').eq(l).addClass('active'); |
|
} |
|
$(window) |
|
.resize(() => { |
|
anchor = getAnchor(); |
|
scrollListener(); |
|
}) |
|
.scroll(() => { |
|
scrollListener() |
|
}); |
|
scrollListener(); |
|
} |
|
|
|
// function getPicture() { |
|
// const $banner = $('.banner'); |
|
// if ($banner.length === 0) return; |
|
// const url = ROOT + 'js/lovewallpaper.json'; |
|
// $.get(url).done(res => { |
|
// if (res.data.length > 0) { |
|
// const index = Math.floor(Math.random() * res.data.length); |
|
// $banner.css('background-image', 'url(' + res.data[index].big + ')'); |
|
// } |
|
// }) |
|
// } |
|
|
|
// function getHitokoto() { |
|
// const $hitokoto = $('#hitokoto'); |
|
// if($hitokoto.length === 0) return; |
|
// const url = 'http://api.hitokoto.us/rand?length=80&encode=jsc&fun=handlerHitokoto'; |
|
// $('body').append('<script src="%s"></script>'.replace('%s',url)); |
|
// window.handlerHitokoto = (data) => { |
|
// $hitokoto |
|
// .css('color','transparent') |
|
// .text(data.hitokoto) |
|
// if(data.source) $hitokoto.append('<cite> —— %s</cite>'.replace('%s',data.source)); |
|
// else if(data.author) $hitokoto.append('<cite> —— %s</cite>'.replace('%s',data.author)); |
|
// $hitokoto.css('color','white'); |
|
// } |
|
// } |
|
|
|
|
|
$(function () { |
|
//set header |
|
setHeader(); |
|
setHeaderMenu(); |
|
setHeaderMenuPhone(); |
|
setHeaderSearch(); |
|
setWaves(); |
|
setScrollReveal(); |
|
setTocToggle(); |
|
// getHitokoto(); |
|
// getPicture(); |
|
|
|
|
|
$(".article .video-container").fitVids(); |
|
|
|
setTimeout(function () { |
|
$('#loading-bar-wrapper').fadeOut(500); |
|
}, 300); |
|
|
|
if (SEARCH_SERVICE === 'google') { |
|
customSearch = new GoogleCustomSearch({ |
|
apiKey: GOOGLE_CUSTOM_SEARCH_API_KEY, |
|
engineId: GOOGLE_CUSTOM_SEARCH_ENGINE_ID, |
|
imagePath: "/images/" |
|
}); |
|
} |
|
else if (SEARCH_SERVICE === 'algolia') { |
|
customSearch = new AlgoliaSearch({ |
|
apiKey: ALGOLIA_API_KEY, |
|
appId: ALGOLIA_APP_ID, |
|
indexName: ALGOLIA_INDEX_NAME, |
|
imagePath: "/images/" |
|
}); |
|
} |
|
else if (SEARCH_SERVICE === 'hexo') { |
|
customSearch = new HexoSearch({ |
|
imagePath: "/images/" |
|
}); |
|
} |
|
else if (SEARCH_SERVICE === 'azure') { |
|
customSearch = new AzureSearch({ |
|
serviceName: AZURE_SERVICE_NAME, |
|
indexName: AZURE_INDEX_NAME, |
|
queryKey: AZURE_QUERY_KEY, |
|
imagePath: "/images/" |
|
}); |
|
} |
|
else if (SEARCH_SERVICE === 'baidu') { |
|
customSearch = new BaiduSearch({ |
|
apiId: BAIDU_API_ID, |
|
imagePath: "/images/" |
|
}); |
|
} |
|
|
|
}); |
|
|
|
})(jQuery);
|
|
|