123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- jQuery(document).ready(function($){
- function morphDropdown( element ) {
- this.element = element;
- this.mainNavigation = this.element.find('.main-nav');
- this.mainNavigationItems = this.mainNavigation.find('.has-dropdown');
- this.dropdownList = this.element.find('.dropdown-list');
- this.dropdownWrappers = this.dropdownList.find('.dropdown');
- this.dropdownItems = this.dropdownList.find('.content');
- this.dropdownBg = this.dropdownList.find('.bg-layer');
- this.mq = this.checkMq();
- this.bindEvents();
- }
- morphDropdown.prototype.checkMq = function() {
- //check screen size
- var self = this;
- return window.getComputedStyle(self.element.get(0), '::before').getPropertyValue('content').replace(/'/g, "").replace(/"/g, "").split(', ');
- };
- morphDropdown.prototype.bindEvents = function() {
- var self = this;
- //hover over an item in the main navigation
- this.mainNavigationItems.mouseenter(function(event){
- //hover over one of the nav items -> show dropdown
- self.showDropdown($(this));
- }).mouseleave(function(){
- setTimeout(function(){
- //if not hovering over a nav item or a dropdown -> hide dropdown
- if( self.mainNavigation.find('.has-dropdown:hover').length == 0 && self.element.find('.dropdown-list:hover').length == 0 ) self.hideDropdown();
- }, 50);
- });
-
- //hover over the dropdown
- this.dropdownList.mouseleave(function(){
- setTimeout(function(){
- //if not hovering over a dropdown or a nav item -> hide dropdown
- (self.mainNavigation.find('.has-dropdown:hover').length == 0 && self.element.find('.dropdown-list:hover').length == 0 ) && self.hideDropdown();
- }, 50);
- });
- //click on an item in the main navigation -> open a dropdown on a touch device
- this.mainNavigationItems.on('touchstart', function(event){
- var selectedDropdown = self.dropdownList.find('#'+$(this).data('content'));
- if( !self.element.hasClass('is-dropdown-visible') || !selectedDropdown.hasClass('active') ) {
- event.preventDefault();
- self.showDropdown($(this));
- }
- });
- //on small screens, open navigation clicking on the menu icon
- this.element.on('click', '.nav-trigger', function(event){
- event.preventDefault();
- self.element.toggleClass('nav-open');
- });
- };
- morphDropdown.prototype.showDropdown = function(item) {
- this.mq = this.checkMq();
- if( this.mq == 'desktop') {
- var self = this;
- var selectedDropdown = this.dropdownList.find('#'+item.data('content')),
- selectedDropdownHeight = selectedDropdown.innerHeight(),
- selectedDropdownWidth = selectedDropdown.children('.content').innerWidth(),
- selectedDropdownLeft = item.offset().left + item.innerWidth()/2 - selectedDropdownWidth/2;
- //update dropdown position and size
- this.updateDropdown(selectedDropdown, parseInt(selectedDropdownHeight), selectedDropdownWidth, parseInt(selectedDropdownLeft));
- //add active class to the proper dropdown item
- this.element.find('.active').removeClass('active');
- selectedDropdown.addClass('active').removeClass('move-left move-right').prevAll().addClass('move-left').end().nextAll().addClass('move-right');
- item.addClass('active');
- //show the dropdown wrapper if not visible yet
- if( !this.element.hasClass('is-dropdown-visible') ) {
- setTimeout(function(){
- self.element.addClass('is-dropdown-visible');
- }, 10);
- }
- }
- };
- morphDropdown.prototype.updateDropdown = function(dropdownItem, height, width, left) {
- this.dropdownList.css({
- '-moz-transform': 'translateX(' + left + 'px)',
- '-webkit-transform': 'translateX(' + left + 'px)',
- '-ms-transform': 'translateX(' + left + 'px)',
- '-o-transform': 'translateX(' + left + 'px)',
- 'transform': 'translateX(' + left + 'px)',
- 'width': width+'px',
- 'height': height+'px'
- });
- this.dropdownBg.css({
- '-moz-transform': 'scaleX(' + width + ') scaleY(' + height + ')',
- '-webkit-transform': 'scaleX(' + width + ') scaleY(' + height + ')',
- '-ms-transform': 'scaleX(' + width + ') scaleY(' + height + ')',
- '-o-transform': 'scaleX(' + width + ') scaleY(' + height + ')',
- 'transform': 'scaleX(' + width + ') scaleY(' + height + ')'
- });
- };
- morphDropdown.prototype.hideDropdown = function() {
- this.mq = this.checkMq();
- if( this.mq == 'desktop') {
- this.element.removeClass('is-dropdown-visible').find('.active').removeClass('active').end().find('.move-left').removeClass('move-left').end().find('.move-right').removeClass('move-right');
- }
- };
- morphDropdown.prototype.resetDropdown = function() {
- this.mq = this.checkMq();
- if( this.mq == 'mobile') {
- this.dropdownList.removeAttr('style');
- }
- };
- var morphDropdowns = [];
- if( $('.cd-morph-dropdown').length > 0 ) {
- $('.cd-morph-dropdown').each(function(){
- //create a morphDropdown object for each .cd-morph-dropdown
- morphDropdowns.push(new morphDropdown($(this)));
- });
- var resizing = false;
- //on resize, reset dropdown style property
- updateDropdownPosition();
- $(window).on('resize', function(){
- if( !resizing ) {
- resizing = true;
- (!window.requestAnimationFrame) ? setTimeout(updateDropdownPosition, 300) : window.requestAnimationFrame(updateDropdownPosition);
- }
- });
- function updateDropdownPosition() {
- morphDropdowns.forEach(function(element){
- element.resetDropdown();
- });
- resizing = false;
- };
- }
- });
|