supersubs.js

來源:互聯網
上載者:User

/*
 * 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">&#8212;</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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.