JQuery выпадающий как NBC.com - PullRequest
1 голос
/ 01 октября 2009

Я пытался сделать раскрывающийся список, как NBC.com, безуспешно, потому что я вынужден использовать следующий HTML. Я хотел бы, чтобы это было при наведении курсора мыши - вроде аккордеона UI ... Любая помощь будет принята с благодарностью! :)

<div class="mainMenu" align="center">
    <table cellpadding="0" cellspacing="0" border="0" width="950">
        <tr>
            <td nowrap><div class="mainMenuDiv menuItem"><a href="http://dev.all4jesus.com/new/#new" class="mainMenuLink" id="1">I'm New</a></td>
            <td nowrap><div class="mainMenuDiv menuItem"><a href="http://dev.all4jesus.com/ministries/#ministries" class="mainMenuLink">Ministries</a></div></td>
            <td nowrap><div class="mainMenuDiv menuItem"><a href="http://dev.all4jesus.com/beliefs/#beliefs" class="mainMenuLink">Beliefs+Mission</a></div></td>
            <td nowrap><div class="mainMenuDiv menuItem"><a href="http://dev.all4jesus.com/listen/#listen" class="mainMenuLink">Listen</a></div></td>
            <td nowrap><div class="mainMenuDiv menuItem"><a href="http://dev.all4jesus.com/connect/#contact" class="mainMenuLink">Connect</a></div></td>
            <td width="100%"></td>
        </tr>
    </table>
</div>
    <div class="subMenu">
        <div id="new">
            <h2>I'm New</h2>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
</div>

Ответы [ 3 ]

3 голосов
/ 01 октября 2009

Это не идеально, но должно дать вам представление:

jQuery("div.subMenu div").hide();
jQuery("div.mainMenu div.menuItem").mouseleave(function () {
      jQuery("div.subMenu div").hide();
   }).mouseenter(function () {
      var linkText = jQuery("a", this).text();
      jQuery("div.subMenu div").each(function (n) {
         var hdrText = jQuery("h2", this).text();
         if (linkText == hdrText) {
            jQuery(this).show();
         } else {
            jQuery(this).hide();
         }
      });
   });
// update: keep the submenu open
jQuery("div.subMenu div").mouseleave(function () {
   jQuery(this).hide();
}).mouseenter(function () {
   jQuery(this).show();
});

Я предполагаю, что для каждого пункта меню есть div под subMenu, например.

<div class="subMenu">
    <div id="new">
        <h2>I'm New</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit</p>
    </div>
    <div>
        <h2>Ministries</h2>
        <p>sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
    </div>
    <div>
        <h2>Beleifs+Mission</h2>
        <p>Ut enim ad minim veniam, quis nostrud exercitation ullamco</p>
    </div>
    <div>
        <h2>Listen</h2>
        <p>laboris nisi ut aliquip ex ea commodo consequat.</p>
    </div>
    <div>
        <h2>Connect</h2>
        <p>Duis aute irure dolor in reprehenderit in voluptate velit</p>
    </div>
</div>

Пояснение:

  1. Начните с того, что спрятали все div внутри subMenu.
  2. mouseleave во всех пунктах меню безусловно скрывает все div внутри subMenu, даже если они уже скрыты.
  3. mouseenter во всех пунктах меню скрывает все те же div, за исключением того, что показывает элемент с идентичным текстом внутри ссылки пункта меню и заголовком h2 подменю. (Есть определенно лучших способов сделать это, но вам нужен какой-то способ соотнести пункт меню и подменю. Если вы что-то скажете о id, вы можете использовать соглашение об именах, выражающее соединения.)

Обновление: обратите внимание, что происходит много безусловных hide(). Например, подменю исчезнет, ​​когда мышь покинет пункт меню. Чтобы подменю оставалось видимым, когда на нем находится мышь, добавьте обработчики mouseleave и mouseenter для "div.subMenu div". Чтобы избежать мерцания, вам может потребоваться отслеживать состояние каждого подменю.

Обновление 2: я добавил пару строк, чтобы подменю оставалось открытым, пока в нем находится мышь. YMMV на мерцании. Это работает для меня без каких-либо изменений в таблицах (он просто игнорирует их). Тем не менее, подменю div необходимо расположить прямо напротив пункта меню, чтобы мышь могла перемещаться из пункта меню в подменю без его исчезновения. В своем тестовом коде я установил следующее, чтобы убедиться, что он будет работать:

div.mainMenu div.menuItem,
div.subMenu div,
div.subMenu div h2 {
   margin-top: 0;
   margin-bottom: 0;
}

Если это слишком много сгруппирует текст, вы можете добавить отступ вместо отступа.

0 голосов
/ 01 октября 2009

Я могу только догадываться, что вы говорите о том, чтобы "subMenu" имел аккордеонный стиль?

Если это так, просто убедитесь, что у вас загружен пользовательский интерфейс jQuery, и добавьте следующую строку:

$(document).ready(function(){
 $('.submenu').accordion({ event: 'mouseover', header: 'h2' });
})

Если вы хотите, чтобы основное меню отображалось в аккордеонном стиле, это было бы более сложным, поскольку вам пришлось бы полностью скрыть таблицу и извлечь из нее данные в более подходящую структуру, такую ​​как ваше подменю.

Пожалуйста, уточните, что вы пытаетесь сделать.


Хорошо, я возился с тем, что у вас есть ... Я не касался текущей структуры, но я добавил кое-что к ней. Ниже приведен базовый сценарий, но я разместил полную рабочую версию в этой вставке - я попытался добавить несколько комментариев, чтобы помочь вам перемещаться по путанице: P

$(document).ready(function(){
 /* hide submenu items */
 $('.subMenu').hide();

 /* disable links in menu */
 $('.mainMenuLink').click(function(){return false;})

 /* Top row is the menu row */
 $('.mainMenu table tr:first').addClass('mainMenuRow');

 /* Add display area */
 var numberOfColumns = $('.mainMenuRow td').length; 
 $('.mainMenu table').append('<tr><td class="subMenuDisplay" colspan="' + numberOfColumns + '"></td></tr>') /* */

 /* Add accordian style functioning */
 var slideDelay = 500;
 $('.mainMenu td').hover(
  function(){
   /* only continue if there is a link inside the cell */
   if ($(this).find('.mainMenuLink').length) {
    var subMenuId = $(this).find('.mainMenuLink').attr('hash'); /* hash returns the hash portion of the URL */
   } else {
    return;
   }
   /* hide Content */
   $('.menuContent').remove();

   /* menu is active, display contents of submenu div */
   $(this).addClass('menuActive');
   $('.subMenuDisplay').html('<div class="menuContent" style="display:none"></div>');
   $('.menuContent').html( $(subMenuId).html() ).slideDown(slideDelay);
  },function(){
    /* close display */
   $(this).removeClass('menuActive');
   $('.menuContent').slideUp(slideDelay);
  })
})
0 голосов
/ 01 октября 2009

у вас может быть куча div, которые все начинают скрываться, затем onMouseOver показывает правильный и скрывает остальные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...