mirror of
https://github.com/jcreek/phldnhack.git
synced 2026-07-13 02:53:44 +00:00
Added the SCSS Materialize files
This commit is contained in:
+200
@@ -0,0 +1,200 @@
|
||||
(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 (option) {
|
||||
var defaults = {
|
||||
inDuration: 300,
|
||||
outDuration: 225,
|
||||
constrain_width: true, // Constrains width of dropdown to the activator
|
||||
hover: false,
|
||||
gutter: 0, // Spacing from edge
|
||||
belowOrigin: false,
|
||||
alignment: 'left'
|
||||
};
|
||||
|
||||
this.each(function(){
|
||||
var origin = $(this);
|
||||
var options = $.extend({}, defaults, option);
|
||||
|
||||
// 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('gutter') !== undefined)
|
||||
options.gutter = origin.data('gutter');
|
||||
if (origin.data('beloworigin') !== undefined)
|
||||
options.belowOrigin = origin.data('beloworigin');
|
||||
if (origin.data('alignment') !== undefined)
|
||||
options.alignment = origin.data('alignment');
|
||||
}
|
||||
|
||||
updateOptions();
|
||||
|
||||
// Attach dropdown to its activator
|
||||
origin.after(activates);
|
||||
|
||||
/*
|
||||
Helper function to position and resize dropdown.
|
||||
Used in hover and click handler.
|
||||
*/
|
||||
function placeDropdown() {
|
||||
// Check html data attributes
|
||||
updateOptions();
|
||||
|
||||
// Set Dropdown state
|
||||
activates.addClass('active');
|
||||
|
||||
// Constrain width
|
||||
if (options.constrain_width === true) {
|
||||
activates.css('width', origin.outerWidth());
|
||||
}
|
||||
else {
|
||||
activates.css('white-space', 'nowrap');
|
||||
}
|
||||
var offset = 0;
|
||||
if (options.belowOrigin === true) {
|
||||
offset = origin.height();
|
||||
}
|
||||
|
||||
// Offscreen detection
|
||||
var offsetLeft = origin.offset().left;
|
||||
var activatesLeft, width_difference, gutter_spacing;
|
||||
if (offsetLeft + activates.innerWidth() > $(window).width()) {
|
||||
options.alignment = 'right';
|
||||
}
|
||||
else if (offsetLeft - activates.innerWidth() + origin.innerWidth() < 0) {
|
||||
options.alignment = 'left';
|
||||
}
|
||||
|
||||
// Handle edge alignment
|
||||
if (options.alignment === 'left') {
|
||||
width_difference = 0;
|
||||
gutter_spacing = options.gutter;
|
||||
activatesLeft = origin.position().left + width_difference + gutter_spacing;
|
||||
|
||||
// Position dropdown
|
||||
activates.css({ left: activatesLeft });
|
||||
}
|
||||
else if (options.alignment === 'right') {
|
||||
var offsetRight = $(window).width() - offsetLeft - origin.innerWidth();
|
||||
width_difference = 0;
|
||||
gutter_spacing = options.gutter;
|
||||
activatesLeft = ( $(window).width() - origin.position().left - origin.innerWidth() ) + gutter_spacing;
|
||||
|
||||
// Position dropdown
|
||||
activates.css({ right: activatesLeft });
|
||||
}
|
||||
// Position dropdown
|
||||
activates.css({
|
||||
position: 'absolute',
|
||||
top: origin.position().top + offset,
|
||||
});
|
||||
|
||||
|
||||
|
||||
// Show dropdown
|
||||
activates.stop(true, true).css('opacity', 0)
|
||||
.slideDown({
|
||||
queue: false,
|
||||
duration: options.inDuration,
|
||||
easing: 'easeOutCubic',
|
||||
complete: function() {
|
||||
$(this).css('height', '');
|
||||
}
|
||||
})
|
||||
.animate( {opacity: 1}, {queue: false, duration: options.inDuration, easing: 'easeOutSine'});
|
||||
}
|
||||
|
||||
function hideDropdown() {
|
||||
activates.fadeOut(options.outDuration);
|
||||
activates.removeClass('active');
|
||||
}
|
||||
|
||||
// Hover
|
||||
if (options.hover) {
|
||||
var open = false;
|
||||
origin.unbind('click.' + origin.attr('id'));
|
||||
// Hover handler to show dropdown
|
||||
origin.on('mouseenter', function(e){ // Mouse over
|
||||
if (open === false) {
|
||||
placeDropdown();
|
||||
open = true;
|
||||
}
|
||||
});
|
||||
origin.on('mouseleave', function(e){
|
||||
// If hover on origin then to something other than dropdown content, then close
|
||||
var toEl = e.toElement || e.relatedTarget; // added browser compatibility for target element
|
||||
if(!$(toEl).closest('.dropdown-content').is(activates)) {
|
||||
activates.stop(true, true);
|
||||
hideDropdown();
|
||||
open = false;
|
||||
}
|
||||
});
|
||||
|
||||
activates.on('mouseleave', function(e){ // Mouse out
|
||||
var toEl = e.toElement || e.relatedTarget;
|
||||
if(!$(toEl).closest('.dropdown-button').is(origin)) {
|
||||
activates.stop(true, true);
|
||||
hideDropdown();
|
||||
open = false;
|
||||
}
|
||||
});
|
||||
|
||||
// Click
|
||||
} else {
|
||||
|
||||
// Click handler to show dropdown
|
||||
origin.unbind('click.' + origin.attr('id'));
|
||||
origin.bind('click.'+origin.attr('id'), function(e){
|
||||
|
||||
if ( origin[0] == e.currentTarget && ($(e.target).closest('.dropdown-content').length === 0) ) {
|
||||
e.preventDefault(); // Prevents button click from moving window
|
||||
placeDropdown();
|
||||
|
||||
}
|
||||
// If origin is clicked and menu is open, close menu
|
||||
else {
|
||||
if (origin.hasClass('active')) {
|
||||
hideDropdown();
|
||||
$(document).unbind('click.' + activates.attr('id'));
|
||||
}
|
||||
}
|
||||
// If menu open, add click close handler to document
|
||||
if (activates.hasClass('active')) {
|
||||
$(document).bind('click.'+ activates.attr('id'), function (e) {
|
||||
if (!activates.is(e.target) && !origin.is(e.target) && (!origin.find(e.target).length > 0) ) {
|
||||
hideDropdown();
|
||||
$(document).unbind('click.' + activates.attr('id'));
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
} // End else
|
||||
|
||||
// Listen to open and close event - useful for select component
|
||||
origin.on('open', placeDropdown);
|
||||
origin.on('close', hideDropdown);
|
||||
|
||||
|
||||
});
|
||||
}; // End dropdown plugin
|
||||
|
||||
$(document).ready(function(){
|
||||
$('.dropdown-button').dropdown();
|
||||
});
|
||||
}( jQuery ));
|
||||
Reference in New Issue
Block a user