main.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. if (haveHeader == true) {
  21. document.getElementById('menu-btn').addEventListener('click', () => {
  22. if (mobileMenu.style.display == 'none') {
  23. mobileMenu.style.display = 'block';
  24. } else {
  25. mobileMenu.classList.remove('bounceInRight');
  26. mobileMenu.classList.add('bounceOutRight');
  27. setTimeout(() => {
  28. mobileMenu.style.display = 'none';
  29. mobileMenu.classList.remove('bounceOutRight');
  30. mobileMenu.classList.add('bounceInRight');
  31. }, 750);
  32. }
  33. });
  34. }
  35. // Show Featured Image
  36. //
  37. const showFeaturedImg = () => {
  38. document.getElementById('bg-img').classList.add('show-bg-img');
  39. }
  40. const showContent = () => {
  41. document.getElementById('bg-img').classList.remove('show-bg-img');
  42. }
  43. //Load Comments
  44. //
  45. let commentsLoaded = false;
  46. let comments = document.getElementById('comments');
  47. let commentsLoader = document.getElementById('comments-loader');
  48. const avJsUrl = '//cdn1.lncld.net/static/js/3.0.4/av-min.js';
  49. const valineJsUrl = '//unpkg.com/valine@1.2.6/dist/Valine.min.js';
  50. const loadScript = (source, beforeEl, async = true, defer = true) => {
  51. return new Promise((resolve, reject) => {
  52. let script = document.createElement('script');
  53. const prior = beforeEl || document.getElementsByTagName('script')[0];
  54. script.async = async;
  55. script.defer = defer;
  56. function onloadHander(_, isAbort) {
  57. if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
  58. script.onload = null;
  59. script.onreadystatechange = null;
  60. script = undefined;
  61. if (isAbort) { reject(); } else { resolve(); }
  62. }
  63. }
  64. script.onload = onloadHander;
  65. script.onreadystatechange = onloadHander;
  66. script.src = source;
  67. prior.parentNode.insertBefore(script, prior);
  68. });
  69. }
  70. const loadComments = () => {
  71. loadScript(avJsUrl).then(() => {
  72. loadScript(valineJsUrl).then(() => {
  73. new Valine({
  74. el: '#comments',
  75. appId: 'QfBLso0johYg7AXtV9ODU6FC-gzGzoHsz',
  76. appKey: 'J1tpEEsENa48aLVsPdvwMP14',
  77. placeholder: '说点什么吧',
  78. verify: true
  79. });
  80. commentsLoader.style.display = 'none';
  81. }, () => {
  82. console.log('Failed to Load Valine.min.js');
  83. });
  84. }, () => {
  85. console.log('Failed to Load av-min.js');
  86. });
  87. }
  88. // Load comments if the window is not scrollable
  89. if ((haveComments == true) && (comments.offsetTop < window.innerHeight)) {
  90. commentsLoader.style.display = 'block';
  91. loadComments();
  92. commentsLoaded = true;
  93. }
  94. window.addEventListener('scroll', () => {
  95. if (haveHeader == true) {
  96. autoHideHeader();
  97. mobileMenu.style.display = 'none'; //Hide Mobile Menu When Scroll
  98. }
  99. if ((haveComments == true) && (commentsLoaded == false)) {
  100. if (window.pageYOffset + window.innerHeight > comments.offsetTop) {
  101. commentsLoader.style.display = 'block';
  102. loadComments();
  103. commentsLoaded = true;
  104. }
  105. }
  106. });