/
githubmirror
/
materialize
Обзор
Документация
Войти
/
githubmirror
/
materialize
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v0.95.2
js/dropdown.js
178 строк
5 KB
Alvin Wang
Merge branch 'master' of https://github.com/Olivier-Daire/materialize into Olivier-Daire-master
08 фев 2015, 20:04
08 фев 2015, 20:04
1479d6a
Код
Авторство
О чём код?
(function ($) { // Add posibility to scroll to selected option // usefull for select for example $.fn.scrollTo = function(elem) { $(this).scrollTop($(this).scrollTop() - $(this).offset().top + $(elem).offset().top); return this; }; $.fn.dropdown = function (options) { var defaults = { inDuration: 300, outDuration: 225, constrain_width: true, // Constrains width of dropdown to the activator hover: true, alignment: 'left', gutter: 0, // Spacing from edge belowOrigin: false } options = $.extend(defaults, options); this.each(function(){ var origin = $(this); // Dropdown menu var activates = $("#"+ origin.attr('data-activates')); function updateOptions() { if (origin.data('inDuration') != undefined) options.inDuration = origin.data('inDuration'); if (origin.data('outDuration') != undefined) options.outDuration = origin.data('outDuration'); if (origin.data('constrainwidth') != undefined) options.constrain_width = origin.data('constrainwidth'); if (origin.data('hover') != undefined) options.hover = origin.data('hover'); if (origin.data('alignment') != undefined) options.alignment = origin.data('alignment'); if (origin.data('gutter') != undefined) options.gutter = origin.data('gutter'); if (origin.data('beloworigin') != undefined) options.belowOrigin = origin.data('beloworigin'); } updateOptions(); // Move Dropdown menu to body. This allows for absolute positioning to work if ( !(activates.parent().is($('body'))) ) { activates.detach(); $('body').append(activates); } var dropdownRealHeight = activates.height(); /* Helper function to position and resize dropdown. Used in hover and click handler. */ function placeDropdown() { // Check html data attributes updateOptions(); if (options.constrain_width == true) { activates.css('width', origin.outerWidth()); } var offset = 0; if (options.belowOrigin == true) { offset = origin.height(); } // Handle edge alignment var width_difference = 0; var gutter_spacing = options.gutter; if (options.alignment == 'right') { width_difference = origin.innerWidth() - activates.innerWidth(); gutter_spacing = gutter_spacing * -1; } if (elementOrParentIsFixed(origin[0])) { activates.css({ display: 'block', position: 'fixed', height: 0, top: origin.offset().top - $(window).scrollTop() + offset, left: origin.offset().left + width_difference + gutter_spacing }); } else { activates.css({ display: 'block', top: origin.offset().top + offset, left: origin.offset().left + width_difference + gutter_spacing, height: 0 }); } activates.velocity({opacity: 1}, {duration: options.inDuration, queue: false, easing: 'easeOutQuad'}) .velocity( { height: dropdownRealHeight }, {duration: options.inDuration, queue: false, easing: 'easeOutCubic', complete: function(){ activates.css('overflow-y', 'auto') } }); } function elementOrParentIsFixed(element) { var $element = $(element); var $checkElements = $element.add($element.parents()); var isFixed = false; $checkElements.each(function(){ if ($(this).css("position") === "fixed") { isFixed = true; return false; } }); return isFixed; } function hideDropdown() { activates.velocity( { opacity: 0 }, { duration: options.outDuration, easing: 'easeOutQuad', complete: function(){ activates.css({ display: 'none', 'overflow-y': '' }); } }); } // Hover if (options.hover) { // Hover handler to show dropdown origin.on('mouseover', function(e){ // Mouse over placeDropdown(); }); // Document click handler activates.on('mouseleave', function(e){ // Mouse out hideDropdown(); }); // Click } else { var open = false; // Click handler to show dropdown origin.click( function(e){ // Click e.preventDefault(); // Prevents button click from moving window e.stopPropagation(); // Allows clicking on icon placeDropdown(); $(document).bind('click.'+ activates.attr('id'), function (e) { if (!activates.is(e.target) && (!origin.is(e.target))) { hideDropdown(); $(document).unbind('click.' + activates.attr('id')); } }); }); } // End else // Listen to open and close event - usefull for select component origin.on('open', placeDropdown); origin.on('close', hideDropdown); // Window Resize Reposition $(document).on('resize', function(){ }); }); }; // End dropdown plugin }( jQuery ));