sso

bootsnav.js 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. // ------------------------------------------------------------------------------ //
  2. //
  3. // Template name : Bootsnav - Multi Purpose Header
  4. // Categorie : Bootstrap Menu in CSS
  5. // Author : adamnurdin01
  6. // Version : v.1.2
  7. // Created : 2016-06-02
  8. // Last update : 2016-10-19
  9. //
  10. // ------------------------------------------------------------------------------ //
  11. (function ($) {
  12. "use strict";
  13. var bootsnav = {
  14. initialize: function() {
  15. this.event();
  16. this.hoverDropdown();
  17. this.navbarSticky();
  18. this.navbarScrollspy();
  19. },
  20. event : function(){
  21. // ------------------------------------------------------------------------------ //
  22. // Variable
  23. // ------------------------------------------------------------------------------ //
  24. var getNav = $("nav.navbar.bootsnav");
  25. // ------------------------------------------------------------------------------ //
  26. // Navbar Sticky
  27. // ------------------------------------------------------------------------------ //
  28. var navSticky = getNav.hasClass("navbar-sticky");
  29. if( navSticky ){
  30. // Wraped navigation
  31. getNav.wrap("<div class='wrap-sticky'></div>");
  32. }
  33. // ------------------------------------------------------------------------------ //
  34. // Navbar Center
  35. // ------------------------------------------------------------------------------ //
  36. if( getNav.hasClass("brand-center")){
  37. var postsArr = new Array(),
  38. index = $("nav.brand-center"),
  39. $postsList = index.find('ul.navbar-nav');
  40. index.prepend("<span class='storage-name' style='display:none;'></span>");
  41. //Create array of all posts in lists
  42. index.find('ul.navbar-nav > li').each(function(){
  43. if( $(this).hasClass("active") ){
  44. var getElement = $("a", this).eq(0).text();
  45. $(".storage-name").html(getElement);
  46. }
  47. postsArr.push($(this).html());
  48. });
  49. //Split the array at this point. The original array is altered.
  50. var firstList = postsArr.splice(0, Math.round(postsArr.length / 2)),
  51. secondList = postsArr,
  52. ListHTML = '';
  53. var createHTML = function(list){
  54. ListHTML = '';
  55. for (var i = 0; i < list.length; i++) {
  56. ListHTML += '<li>' + list[i] + '</li>'
  57. }
  58. }
  59. //Generate HTML for first list
  60. createHTML(firstList);
  61. $postsList.html(ListHTML);
  62. index.find("ul.nav").first().addClass("navbar-left");
  63. //Generate HTML for second list
  64. createHTML(secondList);
  65. //Create new list after original one
  66. $postsList.after('<ul class="nav navbar-nav"></ul>').next().html(ListHTML);
  67. index.find("ul.nav").last().addClass("navbar-right");
  68. //Wrap navigation menu
  69. index.find("ul.nav.navbar-left").wrap("<div class='col-half left'></div>");
  70. index.find("ul.nav.navbar-right").wrap("<div class='col-half right'></div>");
  71. //Selection Class
  72. index.find('ul.navbar-nav > li').each(function(){
  73. var dropDown = $("ul.dropdown-menu", this),
  74. megaMenu = $("ul.megamenu-content", this);
  75. dropDown.closest("li").addClass("dropdown");
  76. megaMenu.closest("li").addClass("megamenu-fw");
  77. });
  78. var getName = $(".storage-name").html();
  79. if( !getName == "" ){
  80. $( "ul.navbar-nav > li:contains('" + getName + "')" ).addClass("active");
  81. }
  82. }
  83. // ------------------------------------------------------------------------------ //
  84. // Navbar Sidebar
  85. // ------------------------------------------------------------------------------ //
  86. if( getNav.hasClass("navbar-sidebar")){
  87. // Add Class to body
  88. $("body").addClass("wrap-nav-sidebar");
  89. getNav.wrapInner("<div class='scroller'></div>");
  90. }else{
  91. $(".bootsnav").addClass("on");
  92. }
  93. // ------------------------------------------------------------------------------ //
  94. // Menu Center
  95. // ------------------------------------------------------------------------------ //
  96. if( getNav.find("ul.nav").hasClass("navbar-center")){
  97. getNav.addClass("menu-center");
  98. }
  99. // ------------------------------------------------------------------------------ //
  100. // Navbar Full
  101. // ------------------------------------------------------------------------------ //
  102. if( getNav.hasClass("navbar-full")){
  103. // Add Class to body
  104. $("nav.navbar.bootsnav").find("ul.nav").wrap("<div class='wrap-full-menu'></div>");
  105. $(".wrap-full-menu").wrap("<div class='nav-full'></div>");
  106. $("ul.nav.navbar-nav").prepend("<li class='close-full-menu'><a href='#'><i class='fa fa-times'></i></a></li>");
  107. }else if( getNav.hasClass("navbar-mobile")){
  108. getNav.removeClass("no-full");
  109. }else{
  110. getNav.addClass("no-full");
  111. }
  112. // ------------------------------------------------------------------------------ //
  113. // Navbar Mobile
  114. // ------------------------------------------------------------------------------ //
  115. if( getNav.hasClass("navbar-mobile")){
  116. // Add Class to body
  117. $('.navbar-collapse').on('shown.bs.collapse', function() {
  118. $("body").addClass("side-right");
  119. });
  120. $('.navbar-collapse').on('hide.bs.collapse', function() {
  121. $("body").removeClass("side-right");
  122. });
  123. $(window).on("resize", function(){
  124. $("body").removeClass("side-right");
  125. });
  126. }
  127. // ------------------------------------------------------------------------------ //
  128. // Navbar Fixed
  129. // ------------------------------------------------------------------------------ //
  130. if( getNav.hasClass("no-background")){
  131. $(window).on("scroll", function(){
  132. var scrollTop = $(window).scrollTop();
  133. if(scrollTop >34){
  134. $(".navbar-fixed").removeClass("no-background");
  135. }else {
  136. $(".navbar-fixed").addClass("no-background");
  137. }
  138. });
  139. }
  140. // ------------------------------------------------------------------------------ //
  141. // Navbar Fixed
  142. // ------------------------------------------------------------------------------ //
  143. if( getNav.hasClass("navbar-transparent")){
  144. $(window).on("scroll", function(){
  145. var scrollTop = $(window).scrollTop();
  146. if(scrollTop >34){
  147. $(".navbar-fixed").removeClass("navbar-transparent");
  148. }else {
  149. $(".navbar-fixed").addClass("navbar-transparent");
  150. }
  151. });
  152. }
  153. // ------------------------------------------------------------------------------ //
  154. // Button Cart
  155. // ------------------------------------------------------------------------------ //
  156. $(".btn-cart").on("click", function(e){
  157. e.stopPropagation();
  158. });
  159. // ------------------------------------------------------------------------------ //
  160. // Toggle Search
  161. // ------------------------------------------------------------------------------ //
  162. $("nav.navbar.bootsnav .attr-nav").each(function(){
  163. $("li.search > a", this).on("click", function(e){
  164. e.preventDefault();
  165. $(".top-search").slideToggle();
  166. });
  167. });
  168. $(".input-group-addon.close-search").on("click", function(){
  169. $(".top-search").slideUp();
  170. });
  171. // ------------------------------------------------------------------------------ //
  172. // Toggle Side Menu
  173. // ------------------------------------------------------------------------------ //
  174. $("nav.navbar.bootsnav .attr-nav").each(function(){
  175. $("li.side-menu > a", this).on("click", function(e){
  176. e.preventDefault();
  177. $("nav.navbar.bootsnav > .side").toggleClass("on");
  178. $("body").toggleClass("on-side");
  179. });
  180. });
  181. $(".side .close-side").on("click", function(e){
  182. e.preventDefault();
  183. $("nav.navbar.bootsnav > .side").removeClass("on");
  184. $("body").removeClass("on-side");
  185. });
  186. // ------------------------------------------------------------------------------ //
  187. // Wrapper
  188. // ------------------------------------------------------------------------------ //
  189. $("body").wrapInner( "<div class='wrapper'></div>");
  190. },
  191. // ------------------------------------------------------------------------------ //
  192. // Change dropdown to hover on dekstop
  193. // ------------------------------------------------------------------------------ //
  194. hoverDropdown : function(){
  195. var getNav = $("nav.navbar.bootsnav"),
  196. getWindow = $(window).width(),
  197. getHeight = $(window).height(),
  198. getIn = getNav.find("ul.nav").data("in"),
  199. getOut = getNav.find("ul.nav").data("out");
  200. if( getWindow < 991 ){
  201. // Height of scroll navigation sidebar
  202. $(".scroller").css("height", "auto");
  203. // Disable mouseenter event
  204. $("nav.navbar.bootsnav ul.nav").find("li.dropdown").off("mouseenter");
  205. $("nav.navbar.bootsnav ul.nav").find("li.dropdown").off("mouseleave");
  206. $("nav.navbar.bootsnav ul.nav").find(".title").off("mouseenter");
  207. $("nav.navbar.bootsnav ul.nav").off("mouseleave");
  208. $(".navbar-collapse").removeClass("animated");
  209. // Enable click event
  210. $("nav.navbar.bootsnav ul.nav").each(function(){
  211. $(".dropdown-menu", this).addClass("animated");
  212. $(".dropdown-menu", this).removeClass(getOut);
  213. // Dropdown Fade Toggle
  214. $("a.dropdown-toggle", this).off('click');
  215. $("a.dropdown-toggle", this).on('click', function (e) {
  216. e.stopPropagation();
  217. $(this).closest("li.dropdown").find(".dropdown-menu").first().stop().fadeToggle().toggleClass(getIn);
  218. $(this).closest("li.dropdown").first().toggleClass("on");
  219. return false;
  220. });
  221. // Hidden dropdown action
  222. $('li.dropdown', this).each(function () {
  223. $(this).find(".dropdown-menu").stop().fadeOut();
  224. $(this).on('hidden.bs.dropdown', function () {
  225. $(this).find(".dropdown-menu").stop().fadeOut();
  226. });
  227. return false;
  228. });
  229. // Megamenu style
  230. $(".megamenu-fw", this).each(function(){
  231. $(".col-menu", this).each(function(){
  232. $(".content", this).addClass("animated");
  233. $(".content", this).stop().fadeOut();
  234. $(".title", this).off("click");
  235. $(".title", this).on("click", function(){
  236. $(this).closest(".col-menu").find(".content").stop().fadeToggle().addClass(getIn);
  237. $(this).closest(".col-menu").toggleClass("on");
  238. return false;
  239. });
  240. $(".content", this).on("click", function(e){
  241. e.stopPropagation();
  242. });
  243. });
  244. });
  245. });
  246. // Hidden dropdown
  247. var cleanOpen = function(){
  248. $('li.dropdown', this).removeClass("on");
  249. $(".dropdown-menu", this).stop().fadeOut();
  250. $(".dropdown-menu", this).removeClass(getIn);
  251. $(".col-menu", this).removeClass("on");
  252. $(".col-menu .content", this).stop().fadeOut();
  253. $(".col-menu .content", this).removeClass(getIn);
  254. }
  255. // Hidden om mouse leave
  256. $("nav.navbar.bootsnav").on("mouseleave", function(){
  257. cleanOpen();
  258. });
  259. // Enable click atribute navigation
  260. $("nav.navbar.bootsnav .attr-nav").each(function(){
  261. $(".dropdown-menu", this).removeClass("animated");
  262. $("li.dropdown", this).off("mouseenter");
  263. $("li.dropdown", this).off("mouseleave");
  264. $("a.dropdown-toggle", this).off('click');
  265. $("a.dropdown-toggle", this).on('click', function (e) {
  266. e.stopPropagation();
  267. $(this).closest("li.dropdown").find(".dropdown-menu").first().stop().fadeToggle();
  268. $(".navbar-toggle").each(function(){
  269. $(".fa", this).removeClass("fa-times");
  270. $(".fa", this).addClass("fa-bars");
  271. $(".navbar-collapse").removeClass("in");
  272. $(".navbar-collapse").removeClass("on");
  273. });
  274. });
  275. $(this).on("mouseleave", function(){
  276. $(".dropdown-menu", this).stop().fadeOut();
  277. $("li.dropdown", this).removeClass("on");
  278. return false;
  279. });
  280. });
  281. // Toggle Bars
  282. $(".navbar-toggle").each(function(){
  283. $(this).off("click");
  284. $(this).on("click", function(){
  285. $(".fa", this).toggleClass("fa-bars");
  286. $(".fa", this).toggleClass("fa-times");
  287. cleanOpen();
  288. });
  289. });
  290. }else if( getWindow > 991 ){
  291. // Height of scroll navigation sidebar
  292. $(".scroller").css("height", getHeight + "px");
  293. // Navbar Sidebar
  294. if( getNav.hasClass("navbar-sidebar")){
  295. // Hover effect Sidebar Menu
  296. $("nav.navbar.bootsnav ul.nav").each(function(){
  297. $("a.dropdown-toggle", this).off('click');
  298. $("a.dropdown-toggle", this).on('click', function (e) {
  299. e.stopPropagation();
  300. });
  301. $(".dropdown-menu", this).addClass("animated");
  302. $("li.dropdown", this).on("mouseenter", function(){
  303. $(".dropdown-menu", this).eq(0).removeClass(getOut);
  304. $(".dropdown-menu", this).eq(0).stop().fadeIn().addClass(getIn);
  305. $(this).addClass("on");
  306. return false;
  307. });
  308. $(".col-menu").each(function(){
  309. $(".content", this).addClass("animated");
  310. $(".title", this).on("mouseenter", function(){
  311. $(this).closest(".col-menu").find(".content").stop().fadeIn().addClass(getIn);
  312. $(this).closest(".col-menu").addClass("on");
  313. return false;
  314. });
  315. });
  316. $(this).on("mouseleave", function(){
  317. $(".dropdown-menu", this).stop().removeClass(getIn);
  318. $(".dropdown-menu", this).stop().addClass(getOut).fadeOut();
  319. $(".col-menu", this).find(".content").stop().fadeOut().removeClass(getIn);
  320. $(".col-menu", this).removeClass("on");
  321. $("li.dropdown", this).removeClass("on");
  322. return false;
  323. });
  324. });
  325. }else{
  326. // Hover effect Default Menu
  327. $("nav.navbar.bootsnav ul.nav").each(function(){
  328. $("a.dropdown-toggle", this).off('click');
  329. $("a.dropdown-toggle", this).on('click', function (e) {
  330. e.stopPropagation();
  331. });
  332. $(".megamenu-fw", this).each(function(){
  333. $(".title", this).off("click");
  334. $("a.dropdown-toggle", this).off("click");
  335. $(".content").removeClass("animated");
  336. });
  337. $(".dropdown-menu", this).addClass("animated");
  338. $("li.dropdown", this).on("mouseenter", function(){
  339. $(".dropdown-menu", this).eq(0).removeClass(getOut);
  340. $(".dropdown-menu", this).eq(0).stop().fadeIn().addClass(getIn);
  341. $(this).addClass("on");
  342. return false;
  343. });
  344. $("li.dropdown", this).on("mouseleave", function(){
  345. $(".dropdown-menu", this).eq(0).removeClass(getIn);
  346. $(".dropdown-menu", this).eq(0).stop().fadeOut().addClass(getOut);
  347. $(this).removeClass("on");
  348. });
  349. $(this).on("mouseleave", function(){
  350. $(".dropdown-menu", this).removeClass(getIn);
  351. $(".dropdown-menu", this).eq(0).stop().fadeOut().addClass(getOut);
  352. $("li.dropdown", this).removeClass("on");
  353. return false;
  354. });
  355. });
  356. }
  357. // ------------------------------------------------------------------------------ //
  358. // Hover effect Atribute Navigation
  359. // ------------------------------------------------------------------------------ //
  360. $("nav.navbar.bootsnav .attr-nav").each(function(){
  361. $("a.dropdown-toggle", this).off('click');
  362. $("a.dropdown-toggle", this).on('click', function (e) {
  363. e.stopPropagation();
  364. });
  365. $(".dropdown-menu", this).addClass("animated");
  366. $("li.dropdown", this).on("mouseenter", function(){
  367. $(".dropdown-menu", this).eq(0).removeClass(getOut);
  368. $(".dropdown-menu", this).eq(0).stop().fadeIn().addClass(getIn);
  369. $(this).addClass("on");
  370. return false;
  371. });
  372. $("li.dropdown", this).on("mouseleave", function(){
  373. $(".dropdown-menu", this).eq(0).removeClass(getIn);
  374. $(".dropdown-menu", this).eq(0).stop().fadeOut().addClass(getOut);
  375. $(this).removeClass("on");
  376. });
  377. $(this).on("mouseleave", function(){
  378. $(".dropdown-menu", this).removeClass(getIn);
  379. $(".dropdown-menu", this).eq(0).stop().fadeOut().addClass(getOut);
  380. $("li.dropdown", this).removeClass("on");
  381. return false;
  382. });
  383. });
  384. }
  385. // ------------------------------------------------------------------------------ //
  386. // Menu Fullscreen
  387. // ------------------------------------------------------------------------------ //
  388. if( getNav.hasClass("navbar-full")){
  389. var windowHeight = $(window).height(),
  390. windowWidth = $(window).width();
  391. $(".nav-full").css("height", windowHeight + "px");
  392. $(".wrap-full-menu").css("height", windowHeight + "px");
  393. $(".wrap-full-menu").css("width", windowWidth + "px");
  394. $(".navbar-collapse").addClass("animated");
  395. $(".navbar-toggle").each(function(){
  396. var getId = $(this).data("target");
  397. $(this).off("click");
  398. $(this).on("click", function(e){
  399. e.preventDefault();
  400. $(getId).removeClass(getOut);
  401. $(getId).addClass("in");
  402. $(getId).addClass(getIn);
  403. return false;
  404. });
  405. $("li.close-full-menu").on("click", function(e){
  406. e.preventDefault();
  407. $(getId).addClass(getOut);
  408. setTimeout(function(){
  409. $(getId).removeClass("in");
  410. $(getId).removeClass(getIn);
  411. }, 500);
  412. return false;
  413. });
  414. });
  415. }
  416. },
  417. // ------------------------------------------------------------------------------ //
  418. // Navbar Sticky
  419. // ------------------------------------------------------------------------------ //
  420. navbarSticky : function(){
  421. var getNav = $("nav.navbar.bootsnav"),
  422. navSticky = getNav.hasClass("navbar-sticky");
  423. if( navSticky ){
  424. // Set Height Navigation
  425. var getHeight = getNav.height();
  426. $(".wrap-sticky").height(getHeight);
  427. // Windown on scroll
  428. var getOffset = $(".wrap-sticky").offset().top;
  429. $(window).on("scroll", function(){
  430. var scrollTop = $(window).scrollTop();
  431. if(scrollTop > getOffset){
  432. getNav.addClass("sticked");
  433. }else {
  434. getNav.removeClass("sticked");
  435. }
  436. });
  437. }
  438. },
  439. // ------------------------------------------------------------------------------ //
  440. // Navbar Scrollspy
  441. // ------------------------------------------------------------------------------ //
  442. navbarScrollspy : function(){
  443. var navScrollSpy = $(".navbar-scrollspy"),
  444. $body = $('body'),
  445. getNav = $('nav.navbar.bootsnav'),
  446. offset = getNav.outerHeight();
  447. if( navScrollSpy.length ){
  448. $body.scrollspy({target: '.navbar', offset: offset });
  449. // Animation Scrollspy
  450. $('.scroll').on('click', function(event) {
  451. event.preventDefault();
  452. // Active link
  453. $('.scroll').removeClass("active");
  454. $(this).addClass("active");
  455. // Remove navbar collapse
  456. $(".navbar-collapse").removeClass("in");
  457. // Toggle Bars
  458. $(".navbar-toggle").each(function(){
  459. $(".fa", this).removeClass("fa-times");
  460. $(".fa", this).addClass("fa-bars");
  461. });
  462. // Scroll
  463. var scrollTop = $(window).scrollTop(),
  464. $anchor = $(this).find('a'),
  465. $section = $($anchor.attr('href')).offset().top,
  466. $window = $(window).width(),
  467. $minusDesktop = getNav.data("minus-value-desktop"),
  468. $minusMobile = getNav.data("minus-value-mobile"),
  469. $speed = getNav.data("speed");
  470. if( $window > 992 ){
  471. var $position = $section - $minusDesktop;
  472. }else{
  473. var $position = $section - $minusMobile;
  474. }
  475. $('html, body').stop().animate({
  476. scrollTop: $position
  477. }, $speed);
  478. });
  479. // Activate Navigation
  480. var fixSpy = function() {
  481. var data = $body.data('bs.scrollspy');
  482. if (data) {
  483. offset = getNav.outerHeight();
  484. data.options.offset = offset;
  485. $body.data('bs.scrollspy', data);
  486. $body.scrollspy('refresh');
  487. }
  488. }
  489. // Activate Navigation on resize
  490. var resizeTimer;
  491. $(window).on('resize', function() {
  492. clearTimeout(resizeTimer);
  493. var resizeTimer = setTimeout(fixSpy, 200);
  494. });
  495. }
  496. }
  497. };
  498. // Initialize
  499. $(document).ready(function(){
  500. bootsnav.initialize();
  501. });
  502. // Reset on resize
  503. $(window).on("resize", function(){
  504. bootsnav.hoverDropdown();
  505. setTimeout(function(){
  506. bootsnav.navbarSticky();
  507. }, 500);
  508. // Toggle Bars
  509. $(".navbar-toggle").each(function(){
  510. $(".fa", this).removeClass("fa-times");
  511. $(".fa", this).addClass("fa-bars");
  512. $(this).removeClass("fixed");
  513. });
  514. $(".navbar-collapse").removeClass("in");
  515. $(".navbar-collapse").removeClass("on");
  516. $(".navbar-collapse").removeClass("bounceIn");
  517. });
  518. }(jQuery));