【问题标题】:Add class to main-menu ul without using a module in Drupal 7在 Drupal 7 中不使用模块的情况下将类添加到主菜单
【发布时间】:2011-11-17 23:45:55
【问题描述】:

我正在尝试让我的主题将 CSS 类名称添加到 Drupal 7 主菜单中的“ul”元素。

HTML 模型代码:

<ul class="topnav">
    <li><a href="#">Home</a></li>
    <li>
        <a href="#">Tutorials</a>
        <ul class="subnav">
            <li><a href="#">Sub Nav Link</a></li>
            <li><a href="#">Sub Nav Link</a></li>
        </ul>
    </li>
    <li>
        <a href="#">Resources</a>
        <ul class="subnav">
            <li><a href="#">Sub Nav Link</a></li>
            <li><a href="#">Sub Nav Link</a></li>
        </ul>

</ul>

如你所见,“第一层”ul的类名是“topnav”,下面嵌套的ul的类名是“subnav”。我正在连接一个 jQuery 下拉菜单,并希望在不使用模块的情况下应用它。是的,我尝试过“菜单属性”模块,但在这里不起作用。

我整天都在寻找,似乎找不到完整的解决方案。我知道超级鱼/和科幻附带的其他主题,但我想要自己的解决方案。

编辑: 好的,我已经走得更远了。我有一个菜单,其中 jquery 最初隐藏了 subs,但是,我无法让 jquery 在给定事件上显示 subs:将鼠标悬停在“ul.menu li span”上

这是我的 CSS:

ul.menu {
    list-style: none;
    padding: 0 20px;
    margin: 0;
    float: left;
    width: 920px;
    background: #222;
    font-size: 1.2em;
    background: url(topnav_bg.gif) repeat-x;
}


ul.menu li {
    float: left;
    margin: 0;
    padding: 0 15px 0 0;
    position: relative; /*--Declare X and Y axis base for sub navigation--*/
}



ul.menu li a{
    padding: 10px 5px;
    color: #000;
    display: block;
    text-decoration: none;
    float: left;
}



ul.menu li a:hover{
    background: url(topnav_hover.gif) no-repeat center top;
}


ul.menu li span { /*--Drop down trigger styles--*/
    width: 17px;
    height: 35px;
    float: left;
    background: url(../images/bullet.png) no-repeat center top;
}




ul.menu li span{background-position: center bottom; cursor: pointer;} /*--Hover effect for trigger--*/



ul.menu li ul {
    list-style: none;
    position: absolute; /*--Important - Keeps subnav from affecting main navigation flow--*/
    left: 0; top: 35px;
    background: #333;
    margin: 0; padding: 0;

    float: left;
    width: 170px;
    border: 1px solid #111;
}



ul.menu li ul.menu li{
    margin: 0; padding: 0;
    border-top: 1px solid #252525; /*--Create bevel effect--*/
    border-bottom: 1px solid #444; /*--Create bevel effect--*/
    clear: both;
    width: 170px;
}



html ul.menu li ul.menu li a {
    float: left;
    width: 145px;
    background: #333 url(dropdown_linkbg.gif) no-repeat 10px center;
    padding-left: 20px;
}



html ul.menu li ul.menu li a:hover { 
    background: #222 url(dropdown_linkbg.gif) no-repeat 10px center;
}

jQuery:

jQuery(function($) {

$('ul.menu li ul').hide();

    $("ul.menu li ul").parent().append("<span></span>"); //Only shows drop down trigger when js is enabled (Adds empty span tag after ul.subnav*)

    $("ul.menu li span").hover(function() { //When trigger is clicked...

                                        // alert("No error!"); 

        //Following events are applied to the subnav itself (moving subnav up and down)
        $(this).parent().find("ul.menu li ul").slideDown('fast').show(); //Drop down the subnav on click

        $(this).parent().hover(function() {
        }, function(){
            $(this).parent().find("ul.menu li ul").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
        });

        //Following events are applied to the trigger (Hover events for the trigger)
        }).hover(function() {
            $(this).addClass("subhover"); //On hover over, add class "subhover"
        }, function(){  //On Hover Out
            $(this).removeClass("subhover"); //On hover out, remove class "subhover"
    });

});

如果我编辑这一行:$(this).parent().find("ul.menu li ul").slideDown('fast').show(); 到这个:("ul.menu li ul").slideDown('fast').show(); 它将显示所有父项的所有子菜单 - 显然我只想显示我悬停的父菜单的子菜单。当我尝试重新添加 $(this).parent()... 时,它根本不会显示任何潜艇。

谢谢。

【问题讨论】:

  • 您可以使用 CSS 做到这一点:ul#topnav &gt; li &gt; ul 匹配原始 ul 内部的二级 ul
  • 绝对按照 Blender 的建议,使用主题预处理功能改变它通常涉及字符串替换,这从来都不是很好
  • @Blender 不妨将其发布为答案。虽然我认为@Micheal 可能正在寻找$('ul#topnav &gt; li &gt; ul');,所以他可以选择合适的元素。
  • 感谢大家的回复。当我在 Chrome 中使用“检查元素”查看我的主菜单 CSS 时,我看到:&lt;div id="navigation"&gt;&lt;div id="navigation"&gt;&lt;ul class="links"&gt;&lt;li class="menu-227 first active"&gt;&lt;a href.... class = "active"&gt;Home&lt;/a&gt; 现在“主页”下应该是一个子菜单项,该子项的 ul 需要具有“subnav”类.所以使用@Blender 的技术,我基本上可以将“链接”类重命名为“topnav”?
  • 为了进一步澄清,这实际上是我试图用我的 Drupal 菜单完成的:noupe.com/tutorial/drop-down-menu-jquery-css.html

标签: css drupal-theming


【解决方案1】:

感谢大家的帮助。这是使我在原始帖子中提到的教程与 Drupal 7 一起使用的更正后的工作代码:

注意:我在这里使用主菜单作为一个块。

CSS:

ul.menu {
    list-style: none;
    padding: 0 20px;
    margin: 0;
    float: left;
    width: 920px;
    background: #222;
    font-size: 1.2em;
    background: url(topnav_bg.gif) repeat-x;
    z-index:999;
}



ul.menu li {
    float: left;
    margin: 0;
    padding: 0 15px 0 0;
    position: relative; /*--Declare X and Y axis base for sub navigation--*/
}



ul.menu li a{
    padding: 10px 5px;
    color: #000;
    display: block;
    text-decoration: none;
    float: left;
}

ul.menu li a:hover{
    background: url(topnav_hover.gif) no-repeat center top;
}


ul.menu li span { /*--Drop down trigger styles--*/
    width: 17px;
    height: 35px;
    float: left;
    background: url(images/bullet.png) no-repeat center top;
}


ul.menu li span{background-position: center bottom; cursor: pointer;} /*--Hover effect for trigger--*/


ul.menu li ul {
    list-style: none;
    position: absolute; /*--Important - Keeps subnav from affecting main navigation flow--*/
    left: 0; top: 35px;
    background: #333;
    margin: 0; padding: 0;
    display:none;
    float: left;
    width: 170px;
    border: 1px solid #111;
}

ul.menu li ul.menu li{
    margin: 0; padding: 0;
    border-top: 1px solid #252525; /*--Create bevel effect--*/
    border-bottom: 1px solid #444; /*--Create bevel effect--*/
    clear: both;
    width: 170px;
}


html ul.menu li ul.menu li a {
    float: left;
    width: 145px;
    background: #333 url(dropdown_linkbg.gif) no-repeat 10px center;
    padding-left: 20px;
}


html ul.menu li ul.menu li a:hover { 
    background: #222 url(dropdown_linkbg.gif) no-repeat 10px center;
}

jQuery:

jQuery(function($) {


    $("ul.menu li ul").parent().append("<span></span>"); 

    $("ul.menu li span").click(function() { //When trigger is clicked...


        //Following events are applied to the subnav itself (moving subnav up and down)
        $(this).parent().find("ul").slideDown('fast').show(); //Drop down the subnav on click

        $(this).parent().hover(function() {
        }, function(){
            $(this).parent().find("ul").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
        });

        //Following events are applied to the trigger (Hover events for the trigger)
        }).hover(function() {
            $(this).addClass("subhover"); //On hover over, add class "subhover"
        }, function(){  //On Hover Out
            $(this).removeClass("subhover"); //On hover out, remove class "subhover"
    });

});

部分页面.tpl.php:

<?php if ($page['navigation'] || $main_menu): ?>
      <div id="navigation"><div class="section clearfix">

        <?php print theme('links__system_main_menu', array(
          'links' => $main_menu,
          'attributes' => array(
            'id' => 'main-menu',
            'class' => array('links', 'inline', 'clearfix'),
          ),
          'heading' => array(
            'text' => t('Main menu'),
            'level' => 'h2',
            'class' => array('element-invisible'),
          ),
        )); ?>

        <?php print render($page['navigation']); ?>

      </div></div><!-- /.section, /#navigation -->
    <?php endif; ?>

此实现无需在 Drupal 的菜单 HTML 中注入任何额外的类即可工作。

【讨论】:

    【解决方案2】:

    我使用 drupal 菜单块模块,并希望在主菜单项(第一级)中添加一个用于这种响应式 jQuery 导航的 css 类。

    http://jasonweaver.name/lab/flexiblenavigation/

    <nav>
            <ul id="nav" role="navigation">
                <li class="top-level item-with-ul"><a href="" class="link-with-ul">Item #1</a>
                    <ul class="sub-menu">
                        <li><a href="#content">Sub 1 Item #1</a></li>
                        <li><a href="">Sub 1 Item #2</a></li>
                        <li><a href="">Sub 1 Item #3</a></li>
                        <li><a href="">Sub 1 Item #4</a></li>
                    </ul>
                </li>
    
                <li class="top-level item-with-ul"><a href="" class="link-with-ul">Item #2</a>
                    <ul class="sub-menu">
                        <li><a href="">Sub 1 Item #1</a></li>
                        <li><a href="">Sub 1 Item #2</a></li>
                        <li><a href="">Sub 1 Item #3</a></li>
                    </ul>
                </li>
    
                <li class="top-level"><a href="">Item #3</a>
                </li>
                <li class="top-level item-with-ul"><a href="" class="link-with-ul">Item #4</a>
                    <ul class="sub-menu">
                        <li><a href="">Sub 1 Item #1</a></li>
                        <li><a href="">Sub 1 Item #1</a></li>
                        <li><a href="">Sub 1 Item #1</a></li>
                    </ul>
                </li>
    
                <li class="top-level"><a href="">Item #5</a>
                </li>           
            </ul>                                           
        </nav>
    

    我需要 &lt;a href=""&gt;&lt;/a&gt; 链接中的 css 类和第一个 &lt;li&gt;&lt;/li&gt; 类。

    查看 item-with-ul 和 link-with-ul

    在这里你可以看到我启动的 Drupal 7

    【讨论】:

      【解决方案3】:

      有点不清楚你的问题是什么。您似乎也有点不确定 css 定位是如何工作的。 Blender 上面的原始评论是一种定位方式(尽管它需要是一个类而不是 topnav 的 id,因为您的 html 将它作为一个类)。

      ul.topnav > li > ul
      

      正如 Blender 所说,这会将样式应用于任何第二级 ul。此外,由于您的第二级已经有一个类subnav,因此可以通过以下方式实现相同的定位:

      .subnav
      

      假设该类没有出现在其他地方或通过

      .topnav .subnav
      

      如果它在topnav 列表之外的其他地方使用。

      但是,您的问题似乎是如何在导航菜单中定位特定的subnav。一种方法可能是:

      .topnav > li:hover .subnav
      

      这只会激活鼠标悬停在subnav 所在的特定li 上的样式。如果我可以假设您的a 标签最终将具有真正的href,那么您也可以专门针对那些。例如,如果您的主页链接是&lt;a href="/Home.html"&gt;Home&lt;/a&gt;,那么

      a[href^=Home.html] + ul
      

      将匹配紧随该链接的ul(这似乎是您在评论中提到的内容)。

      【讨论】:

      • 谢谢斯科特。至于不清楚我的问题是什么,我正在尝试将找到的 css here 应用到 Drupal 的主菜单中。一旦我这样做了,我就可以得到 jQuery 方面的工作。所以需要发生两件事之一:我要么需要 1) 将该教程中的 css 类添加到 Drupal UL 并在主菜单中嵌套 UL 元素,要么 2) 我需要将该 CSS 中的类重命名为 Drupal在主菜单中使用。与此同时,我会尝试你的实现。
      • 我已经进一步修改了我原来的问题。
      【解决方案4】:

      对于 Drupal 7,尝试在主题的 template.php 文件中放置类似的内容:

      /**
       * Implements template_preprocess_menu_tree().
       */
      function MY_THEME_preprocess_menu_tree(&$variables) {
      
        // Use the devel module to inspect the theme hook suggestions
        // for your menu. For my particular theme and main menu, the
        // suggested theme hook is menu_tree__primary
        //dpm($variables);
      
      }
      
      /**
       * Implements theme_menu_tree__primary().
       */
      function MY_THEME_menu_tree__primary($variables) {
        return '<ul class="foo bar">' . $variables['tree'] . '</ul>';
      }
      

      这种方法需要注意的是,我们对类名进行了硬编码,因此它不允许任何其他模块对此处出现的类名有发言权。我发誓有一种方法可以在渲染数组级别挂钩菜单的构建,我们可以轻松地将类附加/删除到属性类数组,但是对于我的生活,我现在无法追踪这种方法.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-27
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        相关资源
        最近更新 更多