main.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Auto Hide Header
  2. //
  3. let lastScrollPosition = window.pageYOffset;
  4. let header = document.getElementById('site-header');
  5. const autoHideHeader = () => {
  6. let currentScrollPosition = window.pageYOffset;
  7. if (currentScrollPosition > lastScrollPosition) {
  8. header.classList.remove('slideInUp');
  9. header.classList.add('slideOutDown');
  10. }
  11. else {
  12. header.classList.remove('slideOutDown');
  13. header.classList.add('slideInUp');
  14. }
  15. lastScrollPosition = currentScrollPosition;
  16. }
  17. // Mobile Menu Toggle
  18. //
  19. let mobileMenu = document.getElementById('mobile-menu');
  20. document.getElementById('menu-btn').addEventListener('click', () => {
  21. if (mobileMenu.style.display == 'none') {
  22. mobileMenu.style.display = 'block';
  23. } else {
  24. mobileMenu.classList.remove('bounceInRight');
  25. mobileMenu.classList.add('bounceOutRight');
  26. setTimeout(() => {
  27. mobileMenu.style.display = 'none';
  28. mobileMenu.classList.remove('bounceOutRight');
  29. mobileMenu.classList.add('bounceInRight');
  30. }, 750);
  31. }
  32. });
  33. //Load Comments
  34. //
  35. let commentsLoaded = false;
  36. let commentsOffsetTop = document.getElementById('comments').offsetTop;
  37. let commentsLoader = document.getElementById('comments-loader');
  38. const avJsUrl = '//cdn1.lncld.net/static/js/3.0.4/av-min.js';
  39. const valineJsUrl = '//unpkg.com/valine/dist/Valine.min.js';
  40. const loadScript = (source, beforeEl, async = true, defer = true) => {
  41. return new Promise((resolve, reject) => {
  42. let script = document.createElement('script');
  43. const prior = beforeEl || document.getElementsByTagName('script')[0];
  44. script.async = async;
  45. script.defer = defer;
  46. function onloadHander(_, isAbort) {
  47. if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
  48. script.onload = null;
  49. script.onreadystatechange = null;
  50. script = undefined;
  51. if (isAbort) { reject(); } else { resolve(); }
  52. }
  53. }
  54. script.onload = onloadHander;
  55. script.onreadystatechange = onloadHander;
  56. script.src = source;
  57. prior.parentNode.insertBefore(script, prior);
  58. });
  59. }
  60. const loadComments = () => {
  61. loadScript(avJsUrl).then(() => {
  62. console.log('av-min.js Loaded');
  63. loadScript(valineJsUrl).then(() => {
  64. console.log('Valine.min.js Loaded');
  65. new Valine({
  66. el: '#comments',
  67. appId: 'QfBLso0johYg7AXtV9ODU6FC-gzGzoHsz',
  68. appKey: 'J1tpEEsENa48aLVsPdvwMP14'
  69. });
  70. console.log('Comments Loaded');
  71. commentsLoader.style.display = 'none';
  72. }, () => {
  73. console.log('Fail to Load Valine.min.js');
  74. });
  75. }, () => {
  76. console.log('Fail to Load av-min.js');
  77. });
  78. }
  79. // Load comments if the window is not scrollable
  80. if (commentsOffsetTop < window.innerHeight) {
  81. console.log('Ready to Load Comments');
  82. commentsLoader.style.display = 'block';
  83. loadComments();
  84. commentsLoaded = true;
  85. }
  86. window.addEventListener('scroll', () => {
  87. autoHideHeader();
  88. mobileMenu.style.display = 'none'; //Hide Mobile Menu When Scroll
  89. if (commentsLoaded == false) {
  90. if (window.pageYOffset + window.innerHeight > commentsOffsetTop) {
  91. console.log('Ready to Load Comments');
  92. commentsLoader.style.display = 'block';
  93. loadComments();
  94. commentsLoaded = true;
  95. }
  96. }
  97. });