2013-03-16 3 views
0

Я использую PHP для выпадающего меню. Мое меню выглядит так:Получить ширину предыдущего элемента списка и рассчитать текущее поле

<ul class="dropdown_top"> 
    <li style="width:20px;"> /*main categories, width is an exapmle i don't realy know the exact width */ 
    <ul style="margin-left:-10px> 
     <li></li> //subcategories 
     ... 
    </ul> 
    </li> 

    <li> //main categories 
    /* the code i'm looking for, must do something like this: */ 
    <?php 
     $style = - widthOfThePreviusMainCategoryLi() + marginLeftOfThePrevius_Ul_Li_Ul() = -30px ; 
    ?> 
    <ul style="margin-left:<?=$style?>;"> /* this ul margin-left is the problem */ 
     <li ></li> 
     ... 
    </ul> 
    </li> 
</ul> 

Мне нужно получить ширину предыдущего элемента списка и рассчитать текущее поле.

Я видел пример с функцией jQuery outerWidth(), но я не могу понять, как это использовать в моем случае.

Я пробовал это после публикации меню, но что я делаю неправильно?

<pre><code> 
    <script type=text/javascript> 
     $(document).ready(function(){ 
      var number = $("#topmenu li").size(); 
      var marginSum = -10; //the first 

      for(i=2;i &lt; number; i++) 
      { 
       marginSum = marginSum - $("#topmenu li").slice(0,(i-1)).outerWidth(true); //OR 
       marginSum = marginSum - $("#topmenu li:eq("+(i-1)+")").outerWidth(true); 

       alert("Μargin of "+i+": "+marginSum + " prev width:"+$("#topmenu li:eq("+(i-1)+")").outerWidth(true)+" Margin:"+marginSum); //OR 
       alert("Μargin of "+i+": "+marginSum + " prev width:"+$("#topmenu li").slice(0,(i-1)).outerWidth(true)+" Margin:"+marginSum);  

       // $("#topmenu li").width(width); 
      } 
     }); 
    </script> 
</code></pre> 

Я считаю, что функция outerWidth(true); также вычисляет вложенную ul, но я не знаю, что точно.

ответ

0

Я решил это. Это мой код:

<script> 
    function setMenuInPlace(){ 
     //fix ul category menu 
     $('.dropdown_top .dir').css({'margin-left' : '0'}); 
     var totalLis_w = num =0; 
     var dtopWidth = $('#topmenu .dropdown_top').width(); 

     //set nested ul in place 
     var mLeft = $('.dropdown_top').offset().left; 
     var myLeft = mLeft + 2; //Left per 2 pixels for leaving a small space 
     // alert (mLeft); 
     $('.dropdown_top li ul').offset({left : myLeft}); 

     //calculate free space for lis 
     $('.dropdown_top .dir').each(function(){ 
      num ++; 
      totalLis_w += $(this).outerWidth(true); 
      // alert($(this).outerWidth(true)); 
     }); 
     var dtop_free = dtopWidth - totalLis_w; 
     var mLeft_Li = (dtop_free/ num) -2 ; //leaving a small space 2 pixels. 
     if(mLeft_Li > 0) 
      $('.dropdown_top .dir').css({'margin-left' : mLeft_Li}); 
     // alert(\"lis width\"+totalLis_w+\" free space:\"+dtop_free+\" mLeft\"+mLeft_Li); 
    } 
    (function($) { 
     $(document).ready(function(){ 
      setMenuInPlace(); 
     }); 
     //$(window).load(function(){ 
     // setMenuInPlace(); 
     //}); 
     $(window).resize(function() { 
      setMenuInPlace(); 
     }); 
    }) (jQuery); 
</script> 

Класс «реж» являются основным список категорий предметов: <li class="dir">.

0

Это потребует большой работы на стороне сервера, потому что нет возможности узнать ширину элемента, если вы не сделаете много вычислений, например, вычислите количество символов, размер шрифта и вес, возможно, границы или поля и прокладки , в любом случае лучший способ сделать это на стороне клиента с помощью Javascript или, как вы сказали, с jQuery .
Это лучше сделать это чисто CSS W с, вот некоторые видео уроки о том, как сделать это:

Надеюсь, что эта помощь.

+0

Τemporary, я решил это, используя статический массив $ style (-10, -30, ...) для текущего меню. Но меню изменяется динамически. Как я могу сделать это с помощью jquery? – ioaniatr

+0

Вам не нужно указывать, что вы действительно могли бы использовать [Twitter-bootstrap navbar с Dropdowns] (http://twitter.github.com/bootstrap/javascript.html#dropdowns) или просто заполнить вложенный список PHP без CSS, а затем использовать CSS в стилистике для стилизации ваших элементов, заставив ширину lis фиксированной с известными полями и дополнением, вы можете добавить правый край к вложенной ul. Я знаю, что я сказал, что вы можете это сделать, но вам это тоже не нужно, проще использовать чистый CSS для этого, попробуйте мой обновленный ответ для более подробной информации. –

+0

На самом деле, я хочу, чтобы мое меню выглядело так: http://www.caremarket.gr/DefaultV2.aspx. Но на моем сайте я хочу исправить проблему поля вложенной ul. Также мое меню будет меняться динамически, поэтому устанавливать фиксированные поля - это просто временное решение. – ioaniatr

Смежные вопросы