云致官网

main.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. (function() {
  2. "use strict";
  3. /**
  4. * Easy selector helper function
  5. */
  6. const select = (el, all = false) => {
  7. el = el.trim()
  8. if (all) {
  9. return [...document.querySelectorAll(el)]
  10. } else {
  11. return document.querySelector(el)
  12. }
  13. }
  14. /**
  15. * Easy event listener function
  16. */
  17. const on = (type, el, listener, all = false) => {
  18. let selectEl = select(el, all)
  19. if (selectEl) {
  20. if (all) {
  21. selectEl.forEach(e => e.addEventListener(type, listener))
  22. } else {
  23. selectEl.addEventListener(type, listener)
  24. }
  25. }
  26. }
  27. /**
  28. * Easy on scroll event listener
  29. */
  30. const onscroll = (el, listener) => {
  31. el.addEventListener('scroll', listener)
  32. }
  33. /**
  34. * Navbar links active state on scroll
  35. */
  36. let navbarlinks = select('#navbar .scrollto', true)
  37. const navbarlinksActive = () => {
  38. let position = window.scrollY + 200
  39. navbarlinks.forEach(navbarlink => {
  40. if (!navbarlink.hash) return
  41. let section = select(navbarlink.hash)
  42. if (!section) return
  43. if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) {
  44. navbarlink.classList.add('active')
  45. } else {
  46. navbarlink.classList.remove('active')
  47. }
  48. })
  49. }
  50. window.addEventListener('load', navbarlinksActive)
  51. onscroll(document, navbarlinksActive)
  52. /**
  53. * Scrolls to an element with header offset
  54. */
  55. const scrollto = (el) => {
  56. let header = select('#header')
  57. let offset = header.offsetHeight
  58. if (!header.classList.contains('header-scrolled')) {
  59. offset -= 20
  60. }
  61. let elementPos = select(el).offsetTop
  62. window.scrollTo({
  63. top: elementPos - offset,
  64. behavior: 'smooth'
  65. })
  66. }
  67. /**
  68. * Toggle .header-scrolled class to #header when page is scrolled
  69. */
  70. let selectHeader = select('#header')
  71. if (selectHeader) {
  72. const headerScrolled = () => {
  73. if (window.scrollY > 100) {
  74. selectHeader.classList.add('header-scrolled')
  75. } else {
  76. selectHeader.classList.remove('header-scrolled')
  77. }
  78. }
  79. window.addEventListener('load', headerScrolled)
  80. onscroll(document, headerScrolled)
  81. }
  82. /**
  83. * Back to top button
  84. */
  85. let backtotop = select('.back-to-top')
  86. if (backtotop) {
  87. const toggleBacktotop = () => {
  88. if (window.scrollY > 100) {
  89. backtotop.classList.add('active')
  90. } else {
  91. backtotop.classList.remove('active')
  92. }
  93. }
  94. window.addEventListener('load', toggleBacktotop)
  95. onscroll(document, toggleBacktotop)
  96. }
  97. /**
  98. * Mobile nav toggle
  99. */
  100. on('click', '.mobile-nav-toggle', function(e) {
  101. select('#navbar').classList.toggle('navbar-mobile')
  102. this.classList.toggle('bi-list')
  103. this.classList.toggle('bi-x')
  104. })
  105. /**
  106. * Mobile nav dropdowns activate
  107. */
  108. on('click', '.navbar .dropdown > a', function(e) {
  109. if (select('#navbar').classList.contains('navbar-mobile')) {
  110. e.preventDefault()
  111. this.nextElementSibling.classList.toggle('dropdown-active')
  112. }
  113. }, true)
  114. /**
  115. * Scrool with ofset on links with a class name .scrollto
  116. */
  117. on('click', '.scrollto', function(e) {
  118. if (select(this.hash)) {
  119. e.preventDefault()
  120. let navbar = select('#navbar')
  121. if (navbar.classList.contains('navbar-mobile')) {
  122. navbar.classList.remove('navbar-mobile')
  123. let navbarToggle = select('.mobile-nav-toggle')
  124. navbarToggle.classList.toggle('bi-list')
  125. navbarToggle.classList.toggle('bi-x')
  126. }
  127. scrollto(this.hash)
  128. }
  129. }, true)
  130. /**
  131. * Scroll with ofset on page load with hash links in the url
  132. */
  133. window.addEventListener('load', () => {
  134. if (window.location.hash) {
  135. if (select(window.location.hash)) {
  136. scrollto(window.location.hash)
  137. }
  138. }
  139. });
  140. /**
  141. * Testimonials slider
  142. */
  143. new Swiper('.testimonials-slider', {
  144. speed: 600,
  145. loop: true,
  146. autoplay: {
  147. delay: 5000,
  148. disableOnInteraction: false
  149. },
  150. slidesPerView: 'auto',
  151. pagination: {
  152. el: '.swiper-pagination',
  153. type: 'bullets',
  154. clickable: true
  155. },
  156. breakpoints: {
  157. 320: {
  158. slidesPerView: 1,
  159. spaceBetween: 20
  160. },
  161. 1200: {
  162. slidesPerView: 2,
  163. spaceBetween: 20
  164. }
  165. }
  166. });
  167. /**
  168. * Porfolio isotope and filter
  169. */
  170. window.addEventListener('load', () => {
  171. let portfolioContainer = select('.portfolio-container');
  172. if (portfolioContainer) {
  173. let portfolioIsotope = new Isotope(portfolioContainer, {
  174. itemSelector: '.portfolio-item',
  175. layoutMode: 'fitRows'
  176. });
  177. let portfolioFilters = select('#portfolio-flters li', true);
  178. on('click', '#portfolio-flters li', function(e) {
  179. e.preventDefault();
  180. portfolioFilters.forEach(function(el) {
  181. el.classList.remove('filter-active');
  182. });
  183. this.classList.add('filter-active');
  184. portfolioIsotope.arrange({
  185. filter: this.getAttribute('data-filter')
  186. });
  187. portfolioIsotope.on('arrangeComplete', function() {
  188. AOS.refresh()
  189. });
  190. }, true);
  191. }
  192. });
  193. /**
  194. * Initiate portfolio lightbox
  195. */
  196. const portfolioLightbox = GLightbox({
  197. selector: '.portfolio-lightbox'
  198. });
  199. /**
  200. * Portfolio details slider
  201. */
  202. new Swiper('.portfolio-details-slider', {
  203. speed: 400,
  204. loop: true,
  205. autoplay: {
  206. delay: 5000,
  207. disableOnInteraction: false
  208. },
  209. pagination: {
  210. el: '.swiper-pagination',
  211. type: 'bullets',
  212. clickable: true
  213. }
  214. });
  215. /**
  216. * Animation on scroll
  217. */
  218. window.addEventListener('load', () => {
  219. AOS.init({
  220. duration: 1000,
  221. easing: 'ease-in-out',
  222. once: true,
  223. mirror: false
  224. })
  225. });
  226. })()