root / drupal7 / sites / all / libraries / Superfish-for-Drupal-1.x / supersubs.js @ a60304ed
1 |
/*
|
---|---|
2 |
* Supersubs v0.2b - jQuery plugin
|
3 |
* Copyright (c) 2008 Joel Birch
|
4 |
*
|
5 |
* Dual licensed under the MIT and GPL licenses:
|
6 |
* http://www.opensource.org/licenses/mit-license.php
|
7 |
* http://www.gnu.org/licenses/gpl.html
|
8 |
*
|
9 |
* This plugin automatically adjusts submenu widths of suckerfish-style menus to that of
|
10 |
* their longest list item children. If you use this, please expect bugs and report them
|
11 |
* to the jQuery Google Group with the word 'Superfish' in the subject line.
|
12 |
*
|
13 |
*/
|
14 |
/*
|
15 |
* This is not the original jQuery Supersubs plugin.
|
16 |
* Please refer to the README for more information.
|
17 |
*/
|
18 |
|
19 |
(function($){ // $ will refer to jQuery within this closure |
20 |
$.fn.supersubs = function(options){ |
21 |
var opts = $.extend({}, $.fn.supersubs.defaults, options); |
22 |
// return original object to support chaining
|
23 |
return this.each(function() { |
24 |
// cache selections
|
25 |
var $$ = $(this); |
26 |
// support metadata
|
27 |
var o = $.meta ? $.extend({}, opts, $$.data()) : opts; |
28 |
// get the font size of menu.
|
29 |
// .css('fontSize') returns various results cross-browser, so measure an em dash instead
|
30 |
var fontsize = $('<li id="menu-fontsize">—</li>').css({ |
31 |
'padding' : 0, |
32 |
'position' : 'absolute', |
33 |
'top' : '-99999em', |
34 |
'width' : 'auto' |
35 |
}).appendTo($$).width(); //clientWidth is faster, but was incorrect here |
36 |
// remove em dash
|
37 |
$('#menu-fontsize').remove(); |
38 |
|
39 |
// Jump on level if it's a "NavBar"
|
40 |
if ($$.hasClass('sf-navbar')) { |
41 |
$$ = $('li > ul', $$); |
42 |
} |
43 |
// cache all ul elements
|
44 |
$ULs = $$.find('ul:not(.sf-megamenu)'); |
45 |
// loop through each ul in menu
|
46 |
$ULs.each(function(i) { |
47 |
// cache this ul
|
48 |
var $ul = $ULs.eq(i); |
49 |
// get all (li) children of this ul
|
50 |
var $LIs = $ul.children(); |
51 |
// get all anchor grand-children
|
52 |
var $As = $LIs.children('a'); |
53 |
// force content to one line and save current float property
|
54 |
var liFloat = $LIs.css('white-space','nowrap').css('float'); |
55 |
// remove width restrictions and floats so elements remain vertically stacked
|
56 |
var emWidth = $ul.add($LIs).add($As).css({ |
57 |
'float' : 'none', |
58 |
'width' : 'auto' |
59 |
}) |
60 |
// this ul will now be shrink-wrapped to longest li due to position:absolute
|
61 |
// so save its width as ems. Clientwidth is 2 times faster than .width() - thanks Dan Switzer
|
62 |
.end().end()[0].clientWidth / fontsize;
|
63 |
// add more width to ensure lines don't turn over at certain sizes in various browsers
|
64 |
emWidth += o.extraWidth; |
65 |
// restrict to at least minWidth and at most maxWidth
|
66 |
if (emWidth > o.maxWidth) { emWidth = o.maxWidth; }
|
67 |
else if (emWidth < o.minWidth) { emWidth = o.minWidth; } |
68 |
emWidth += 'em';
|
69 |
// set ul to width in ems
|
70 |
$ul.css('width',emWidth); |
71 |
// restore li floats to avoid IE bugs
|
72 |
// set li width to full width of this ul
|
73 |
// revert white-space to normal
|
74 |
$LIs.css({
|
75 |
'float' : liFloat,
|
76 |
'width' : '100%', |
77 |
'white-space' : 'normal' |
78 |
}) |
79 |
// update offset position of descendant ul to reflect new width of parent
|
80 |
.each(function(){
|
81 |
var $childUl = $('>ul',this); |
82 |
var offsetDirection = $childUl.css('left')!==undefined ? 'left' : 'right'; |
83 |
$childUl.css(offsetDirection,emWidth);
|
84 |
}); |
85 |
}); |
86 |
}); |
87 |
}; |
88 |
// expose defaults
|
89 |
$.fn.supersubs.defaults = {
|
90 |
minWidth: 9, // requires em unit. |
91 |
maxWidth: 25, // requires em unit. |
92 |
extraWidth: 0 // extra width can ensure lines don't sometimes turn over due to slight browser differences in how they round-off values |
93 |
}; |
94 |
})(jQuery); // plugin code ends
|