I've just launched my first project on GitHub. It's a jQuery plugin that helps create a responsive menu. It deals with interactivity (essentially using toggle and some classes), and leaves all the presentation stuff for CSS.
Here is the basics for using the plugin:
First, create the structure with HTML:
<div id="content" class="canvas">
<!-- (...)Here goes the content (...) -->
</div>
<!-- A button to toggle our menu -->
<a href="#" id="menu-toggle">Menu</a>
<!-- The menu wrapper -->
<div id="menu">
<ul>
<li><a href="#">sample link</a></li>
<li><a href="#">sample link</a></li>
<li><a href="#">sample link</a>
<!-- The submenu toggle button -->
<a href="#" class="submenu-toggle">Open Submenu</a>
<!-- The submenu wrapper -->
<ul class="submenu">
<li><a href="#">sample link</a></li>
<li><a href="#">sample link</a></li>
<li><a href="#">sample link</a></li>
</ul>
</li>
</ul>
</div>
Then, call it using jQuery:
$('#menu').responsiveMenu($('#menu-toggle'));
There are some others options to customize the plugin:
$('#menu').responsiveMenu({
trigger: $('#menu-toggle'),
activeClass: 'active',
submenuTrigger: $('.submenu-toggle'),
submenu: $('.submenu'),
submenuActiveClass: 'open',
breakpoint: 720
moveCanvas: true,
canvas: $('.canvas'),
});
Where $('#menu')
is the main wrapper of the menu, and $('#menu-toggle')
is the button to activate the behavior of the plugin.
And, finally, the plugin code:
;(function ( $, window, document, undefined ) {
$.fn.responsiveMenu = function(settings){
var config = {
'trigger': null,
'activeClass': 'active',
'submenuTrigger': $('.sub-toggle'),
'submenu': false,
'submenuActiveClass': 'open',
'breakpoint': 720,
'timeOut': 100,
'moveCanvas': false,
'canvas': null,
};
if (settings){$.extend(config, settings);}
// declaring plugin variables
var mTrigger;
var menu = $(this);
var active = config.activeClass;
var button = config.trigger;
var bpoint = config.breakpoint;
var submTrigger = config.submenuTrigger;
var submenu = config.submenu;
var submenuClass = '.' + submenu.prop('class');
var submenuActive = config.submenuActiveClass;
var canvasOn = config.moveCanvas;
var canvas = config.canvas;
var time = config.timeOut;
return this.each(function () {
if($(window).width() > bpoint){
mTrigger = false;
} else {
mTrigger = true;
}
onChange = function(){
clearTimeout(resizeTimer);
var resizeTimer = setTimeout(function(){
if($(window).width() > bpoint){
mTrigger = false;
menu.removeClass(active);
button.removeClass(active);
if(canvasOn){
canvas.removeClass(active);
}
} else {
mTrigger = true;
}
}, time);
}
$(window).bind('resize',onChange);
$(document).ready(onChange);
button.click(function(e){
e.preventDefault();
if(mTrigger) {
menu.toggleClass(active);
button.toggleClass(active);
if(canvasOn){
canvas.toggleClass(active);
}
}
});
if(submenu){
// toggle for the submenus
submTrigger.click(function(e){
e.preventDefault();
if(mTrigger) {
if($(this).hasClass(active)){
submTrigger.removeClass(active);
submenu.removeClass(submenuActive);
} else {
submTrigger.removeClass(active);
$(this).addClass(active);
submenu.removeClass(submenuActive);
$(this).next(submenuClass).addClass(submenuActive);
}
}
});
}
});
}
})( jQuery, window, document );
If you want to check the repository of the plugin, here's the link.
In the repository, there is more information about it, such as which option does what in the plugin, etc. There is a simple demo as well.
The plugin is in development, so I'm searching for feedback on it. I'm okay with best practices, performance, and possibly any suggestions and contributions as well.
<ul> <li> <ul> <li> <ul> <li></li> </ul> </li> </ul> </li> </ul>
\$\endgroup\$responsiveMenu.init()
orresponsiveMenu.reset()
) and improve the instantiation (likevar menu = new responsiveMenu({options});
. Keep your eyes on it! \$\endgroup\$