2010-06-15 2 views
5

Как сделать вложенные li одинаковой шириной?установить все вложенные li для ширины самого широкого li

Когда я использую нижеследующий код, каждая вложенная лития будет только такой же широкой, как и текст + margin.

Я бы хотел, чтобы все лики были такими же широкими, как и самый широкий li под родительским ul.

например:

<ul id="menu"> 
    <li <a href="#" title="Menu a">Menu a</a></li> 
    <li <a href="#" title="Menu b">Menu b</a></li> 
    <li <a href="#" title="Nested Menu">Nested Menu</a> 
     <ul> 
      <li <a href="#" title="Menu Item">Menu Item</li> 
      <li <a href="#" title="Long Menu Item">Long Menu Item</a></li> 
      <li <a href="#" title="Longer Menu Item">Longer Menu Item</a></li> 
     </ul> 
    </li> 
    <li <a href="#" title="Menu z">Menu z</a></li> 
</ul> 

с помощью CSS:

<style type="text/css" media="all"> 
* { 
    padding:0; 
    margin:0; 
} 
body, html { 
    width: 100%; 
    height: 100%; 
} 
#wrapper { 
    width: 800px; 
    height: 100%; 
    margin: auto; 
} 
#menu { 
    margin: 0 0 0 8px; 
    padding: 0; 
    font-size: 14px; 
    font-weight: normal; 
} 

#menu ul { 
    list-style-type:none; 
    list-style-position:outside; 
    position:relative; 
    z-index:300; 
    height: 32px; 
    font-weight:bold; 
    white-space: nowrap; 
    padding:0; 
} 
#menu a {text-decoration:none; 
    line-height: 32px; 
} 
#menu a:hover { 

} 
#menu li { 
    float:left; 
    position:relative; 
    display: inline; 
    height: 100%; 
    list-style-type: none; 
    padding: 0 20px; 
    background: #ccc; 
} 
#menu ul { 
    position:absolute; 
    display:none; 
    left:0px; 
    background: #BDCCD4; 
    width:100%; 
} 
#menu ul a, #menu li a { 
    display: block; 
} 
#menu li ul { 
    background: #BDCCD4; 
    display:block; 
} 
#menu li ul a { 
    font-weight: normal; 
    height:auto; 
    float:left; 
} 
#menu ul ul { 
    padding: 0 9px; 
    display:block; 
} 
#menu li ul li { 
    padding: 0 9px; 
    background: #BDCCD4; 
} 
#menu li:hover { 
    background: #ddd; 
    height: 32px; 
} 
#menu li li:hover, #menu li li li:hover { 
    background: #ddd; 
    height: 32px; 
} 
#menu li a:link, #menu li a:visited { 
    text-decoration: none; 
    color: #003E7E; 
    margin: auto; 
} 

+0

Создано jsFiddle: http://jsfiddle.net/y83zm/ – MvanGeest

ответ

1

Для того, чтобы все элементов списка тех же длины, самый длинный, вам нужно будет вручную установить ширину. Насколько я знаю, нет чистого метода CSS для достижения этого автоматически.

li {ширина: 100%} Будет ли заполнять элементы списка по ширине их контейнера. Если это не задано, то это будет ширина окна браузера пользователя.

+2

Вы проверили мой jsFiddle? Отлично работает в Firefox 3.6 и Internet Explorer 8. Имеет проблемы в IE7, но не зависит от ширины. – MvanGeest

+0

Проклятье - это затрудняет динамический контент! – nugget

+0

Ницца. Я полагаю, что условная таблица стилей может быть добавлена ​​для установки ширины для <= IE 7 – theorise

3

Простое добавление width: 100% для #menu li ul li работы для меня. Чтобы он работал даже на более длинные предметы, используйте width: auto на #menu li ul. EDIT 2: добавлено обходное решение.

Новый CSS:

<style type="text/css" media="all"> 
* { 
    padding:0; 
    margin:0; 
} 
body, html { 
    width: 100%; 
    height: 100%; 
} 
#wrapper { 
    width: 800px; 
    height: 100%; 
    margin: auto; 
} 
#menu { 
    margin: 0 0 0 8px; 
    padding: 0; 
    font-size: 14px; 
    font-weight: normal; 
} 

#menu ul { 
    list-style-type:none; 
    list-style-position:outside; 
    position:relative; 
    z-index:300; 
    height: 32px; 
    font-weight:bold; 
    white-space: nowrap; 
    padding:0; 
} 
#menu a {text-decoration:none; 
    line-height: 32px; 
} 
#menu a:hover { 

} 
#menu li { 
    float:left; 
    position:relative; 
    display: inline; 
    height: 100%; 
    list-style-type: none; 
    padding: 0 20px; 
    background: #ccc; 
} 
#menu ul { 
    position:absolute; 
    display:none; 
    left:0px; 
    background: #BDCCD4; 
    width:100%; 
} 
#menu ul a, #menu li a { 
    display: block; 
} 
#menu li ul { 
    background: #BDCCD4; 
    display:block; 
    width: auto; 
} 
#menu li ul a { 
    font-weight: normal; 
    height:auto; 
    float:left; 
} 
#menu ul ul { 
    padding: 0 0 0 9px; 
    display:block; 
} 
#menu li ul li { 
    padding: 0 9px; 
    background: #BDCCD4; 
    width: 100%; 
} 
#menu li:hover { 
    background: #ddd; 
    height: 32px; 
} 
#menu li li:hover, #menu li li li:hover { 
    background: #ddd; 
    height: 32px; 
} 
#menu li a:link, #menu li a:visited { 
    text-decoration: none; 
    color: #003E7E; 
    margin: auto; 
} 

Результат здесь: http://jsfiddle.net/y83zm/2/ EDIT 2 Добавлено исправление для решения странных проблем обивки см http://jsfiddle.net/y83zm/5/

+0

эй, спасибо MvanGeest - это работает с тестовым кодом, который я поставил, но не с моим реальным кодом. Если вы добавите еще один лий с текстом «Как насчет гораздо более длинного названия», фон обрезается. Есть ли способ избежать этого? cheers – nugget

+0

Не могли бы вы отредактировать jsFiddle, предоставленную мне для того, чтобы все получилось не так, нажмите «Обновить» и опубликуйте новую ссылку? Кроме того, какой браузер (ы) вы нацеливаете? Я не могу дать никаких гарантий для IE6. – MvanGeest

+0

Неважно, сделал это сам и отредактировал решение. Это помогает? Работает для меня в Firefox. (О, и если решение работает, можете ли вы пометить его как таковое?) – MvanGeest

2

Для установки всех LI с такой же шириной, как и в самом широком LI, вам необходимо использовать JavaScript. Вот код, если вы хотите использовать библиотеку JQuery:

$(document).ready(function(){ 
    $("#menu > li > ul").each(function() { // Loop through all the menu items that got submenu items 
    var Widest=0; // We want to find the widest LI... start at zero 
    var ThisWidth=0; // Initiate the temporary width variable (it will hold the width as an integer) 

    $($(this).children()).each(function() { // Loop through all the children LIs in order to find the widest 
     ThisWidth=parseInt($(this).css('width')); // Grab the width of the current LI 

     if (ThisWidth>Widest) { // Is this LI the widest? 
     Widest=ThisWidth; // We got a new widest value 
     } 
    }); 

    Widest+='px'; // Add the unit 

    $(this).parent().css('width',Widest); 
    $(this).children().css('width',Widest); 
    }); 
}); 

изменения CSS:

#menu li ul li { 
    padding: 0 9px; 
    background: #BDCCD4; 
    padding: 0 20px; 
} 

проверить его на JSFiddle.

Редактировать: Исправлено недоразумение. :)

+0

очень круто - хорошо работает с «#menu li», но не с «#menu li ul li», или это только я? – nugget

+0

Вы получите родительский LI такой же ширины, что и в самом широком подменю LI. Если это нежелательно, вы должны пойти с чистым решением CSS. :) –

2

Было бы очень простое динамическое решение. Для того, чтобы ваш CSS, как вы разместили ее в вопросе, просто добавьте

#menu ul { 
    display: inline-block; 
    min-width: 100px; 
} 

#menu ul li, #menu ul li a{ 
    width: 100%; 
    display:block; 
} 

и тогда это будет именно так, как вы хотите быть.

Вы можете увидеть, как она выглядит здесь: http://jsfiddle.net/ramsesoriginal/y83zm/61/

-1

Я использовал следующие CoffeeScript для достижения Описанное поведение:

$ -> 
    menu_toggle = (e, show) -> 
     ul = $(e).find('ul') 
     ul.toggle() 

     computed = ul.hasClass 'computed_width' 
     if show && !computed 
      ul.width 2000 # enormous with to be sure that li’s’ texts are not wrapped 
      max_width = 0 
      ul.find('li').each -> 
       li = $(this) 
       width = li.width() 
       max_width = width if width > max_width 
      ul.width max_width + 30 if max_width # 20 is 2 * padding + some reserve 
      ul.toggleClass 'computed_width' # no need to compute every time 

    $('li').has('ul').hover -> 
     menu_toggle this, true 
    , -> 
     menu_toggle this, false 
0

Простое решение JQuery работал для меня:

$(document).ready(function(){ 
    $('.sub-menu').each(function(){ 
     $(this).width(2000); 
     var width = 0; 
     $(this).children('li').each(function(){ 
      if ($(this).children('a').width() > width) 
       width = $(this).children('a').width(); 
     }); 
     $(this).width(width); 
    }); 
}); 
Смежные вопросы