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