90 lines
3.2 KiB
JavaScript
90 lines
3.2 KiB
JavaScript
|
/*
|
||
|
* Supersubs v0.2b - jQuery plugin
|
||
|
* Copyright (c) 2008 Joel Birch
|
||
|
*
|
||
|
* Dual licensed under the MIT and GPL licenses:
|
||
|
* http://www.opensource.org/licenses/mit-license.php
|
||
|
* http://www.gnu.org/licenses/gpl.html
|
||
|
*
|
||
|
*
|
||
|
* This plugin automatically adjusts submenu widths of suckerfish-style menus to that of
|
||
|
* their longest list item children. If you use this, please expect bugs and report them
|
||
|
* to the jQuery Google Group with the word 'Superfish' in the subject line.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
;(function($){ // $ will refer to jQuery within this closure
|
||
|
|
||
|
$.fn.supersubs = function(options){
|
||
|
var opts = $.extend({}, $.fn.supersubs.defaults, options);
|
||
|
// return original object to support chaining
|
||
|
return this.each(function() {
|
||
|
// cache selections
|
||
|
var $$ = $(this);
|
||
|
// support metadata
|
||
|
var o = $.meta ? $.extend({}, opts, $$.data()) : opts;
|
||
|
// get the font size of menu.
|
||
|
// .css('fontSize') returns various results cross-browser, so measure an em dash instead
|
||
|
var fontsize = $('<li id="menu-fontsize">—</li>').css({
|
||
|
'padding' : 0,
|
||
|
'position' : 'absolute',
|
||
|
'top' : '-999em',
|
||
|
'width' : 'auto'
|
||
|
}).appendTo($$).width(); //clientWidth is faster, but was incorrect here
|
||
|
// remove em dash
|
||
|
$('#menu-fontsize').remove();
|
||
|
// cache all ul elements
|
||
|
$ULs = $$.find('ul');
|
||
|
// loop through each ul in menu
|
||
|
$ULs.each(function(i) {
|
||
|
// cache this ul
|
||
|
var $ul = $ULs.eq(i);
|
||
|
// get all (li) children of this ul
|
||
|
var $LIs = $ul.children();
|
||
|
// get all anchor grand-children
|
||
|
var $As = $LIs.children('a');
|
||
|
// force content to one line and save current float property
|
||
|
var liFloat = $LIs.css('white-space','nowrap').css('float');
|
||
|
// remove width restrictions and floats so elements remain vertically stacked
|
||
|
var emWidth = $ul.add($LIs).add($As).css({
|
||
|
'float' : 'none',
|
||
|
'width' : 'auto'
|
||
|
})
|
||
|
// this ul will now be shrink-wrapped to longest li due to position:absolute
|
||
|
// so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer
|
||
|
.end().end()[0].clientWidth / fontsize;
|
||
|
// add more width to ensure lines don't turn over at certain sizes in various browsers
|
||
|
emWidth += o.extraWidth;
|
||
|
// restrict to at least minWidth and at most maxWidth
|
||
|
if (emWidth > o.maxWidth) { emWidth = o.maxWidth; }
|
||
|
else if (emWidth < o.minWidth) { emWidth = o.minWidth; }
|
||
|
emWidth += 'em';
|
||
|
// set ul to width in ems
|
||
|
$ul.css('width',emWidth);
|
||
|
// restore li floats to avoid IE bugs
|
||
|
// set li width to full width of this ul
|
||
|
// revert white-space to normal
|
||
|
$LIs.css({
|
||
|
'float' : liFloat,
|
||
|
'width' : '100%',
|
||
|
'white-space' : 'normal'
|
||
|
})
|
||
|
// update offset position of descendant ul to reflect new width of parent
|
||
|
.each(function(){
|
||
|
var $childUl = $('>ul',this);
|
||
|
var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right';
|
||
|
$childUl.css(offsetDirection,emWidth);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|
||
|
};
|
||
|
// expose defaults
|
||
|
$.fn.supersubs.defaults = {
|
||
|
minWidth : 9, // requires em unit.
|
||
|
maxWidth : 25, // requires em unit.
|
||
|
extraWidth : 0 // extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values
|
||
|
};
|
||
|
|
||
|
})(jQuery); // plugin code ends
|