如何在WordPress中制作一个下拉菜单(附代码)

846 阅读9分钟

Final product imageFinal product imageFinal product image

你要创建的东西

导航菜单在聚光灯下有一个时刻。从用于移动的汉堡菜单到用于商店的巨型菜单,再到用于增强用户体验的粘性菜单,你可以在你的WordPress网站上展示你的导航菜单,有很多选择。

但是,如果你想创建一个简单的菜单,有几个顶级项目,当用户悬停在这些项目上时,还有一些项目从这些项目往下掉呢?

在你开始编码高级菜单(如巨型菜单和汉堡菜单)之前,学习如何创建下拉菜单是一个好主意。这将在更多的网站上派上用场(不是每个网站都需要花哨的菜单),而且它将给你打下基础,让你开始建立更高级的菜单。

在本教程中,我将向你展示如何在你的WordPress主题中创建一个下拉菜单,使用CSS来定位WordPress菜单功能所输出的HTML。这是为你自己编码的主题设计的,而不是为第三方主题设计的,后者已经有了自己的菜单。然而,如果你使用的第三方主题的菜单不是下拉式的,而你想添加这个,那么你就需要创建一个子主题,并将你的菜单代码添加到该主题中。

你将需要什么

要跟上这个教程,你将需要。

  • 一个WordPress的开发安装
  • 一个你自己编码的主题,或者一个第三方主题的子主题,如果你想修改菜单的话
  • 一个代码编辑器

WordPress的内置菜单功能

你需要了解的第一件事是WordPress如何生成菜单。与静态网站不同,菜单不是硬编码到你的网站中。相反,WordPress使用一个PHP函数来查询数据库并获取导航菜单项,然后以正确的结构显示它们。

导航菜单中的每个项目实际上是数据库中wp_posts表中的一个帖子--不是一个普通的帖子,而是一种特殊的帖子,专门用于导航菜单项目,有自己的元数据,包括要显示的文字和链接的目标。

在你的主题中,打开header.php文件。你应该能够找到这一行。

wp_nav_menu( array( 'container_class' => 'main-nav', 'theme_location' => 'primary' ) );

你的函数可能看起来有点不同,这取决于参数,但让我们分解上面的例子,看看每个元素做什么。

  • wp_nav_menu() 是获取导航菜单并输出的函数。
  • 然后参数被包裹在一个数组中。
  • container_class 是CSS类,它将被赋予包装菜单的容器。在这个例子中,它是main-nav。这就是我们稍后要用我们的CSS所针对的东西。
  • theme_location => primary 告诉WordPress,这是主要的导航。如果我在管理界面中创建了一个菜单,并勾选了Primary框,那么这个菜单将被用于代码中的这个位置。

有时你可能想在你的主题的其他地方添加一个导航菜单,例如在页脚,在这种情况下,你不希望使用theme_location => primary 。你只能对一个菜单使用这个。但你可能想使用额外的参数,你可以在WordPress手册的页面上找到这些参数,即 [wp_nav_menu()](https://developer.wordpress.org/reference/functions/wp_nav_menu/).

这里是菜单管理界面中的主导航的复选框。

Primary navigation settingPrimary navigation settingPrimary navigation setting

wp_nav_menu() 函数输出的代码

在我们添加CSS来创建下拉菜单之前,熟悉WordPress为菜单产生的代码是有帮助的。

这里是一个典型的小企业的菜单,在菜单管理界面中显示。

Navigation menu in admin screenNavigation menu in admin screenNavigation menu in admin screen

现在这是该菜单的HTML输出。

<div class="main-nav">
    <ul id="menu-navbar" class="menu">
        <li id="menu-item-610" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home current-menu-item page_item page-item-609 current_page_item menu-item-610"><a href="https://121interviewcoaching.co.uk/">Home</a></li>
        <li id="menu-item-613" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-613"><a href="https://121interviewcoaching.co.uk/about/">About Me</a></li>
        <li id="menu-item-615" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-615"><a href="https://121interviewcoaching.co.uk/services/">Services</a>
            <ul class="sub-menu">
                <li id="menu-item-618" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-618"><a href="https://121interviewcoaching.co.uk/services/services-for-individuals/">Preparing for interviews / individuals</a></li>
                <li id="menu-item-617" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-617"><a href="https://121interviewcoaching.co.uk/services/services-for-groups/">Preparing for interviews / groups</a></li>
                <li id="menu-item-619" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-619"><a href="https://121interviewcoaching.co.uk/services/conducting-interviews/">Conducting interviews</a></li>
            </ul>
        </li>
        <li id="menu-item-30780" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-30780"><a href="https://121interviewcoaching.co.uk/succeed-at-your-next-job-interview/">My Book</a></li>
        <li id="menu-item-614" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-614"><a href="https://121interviewcoaching.co.uk/clients-2/">Clients</a></li>
        <li id="menu-item-616" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-616"><a href="https://121interviewcoaching.co.uk/interview-tips/">Interview Tips</a></li>
        <li id="menu-item-612" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-612"><a href="https://121interviewcoaching.co.uk/where-i-work/">Areas covered</a></li>
        <li id="menu-item-611" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-611"><a href="https://121interviewcoaching.co.uk/contact/">Contact &#038; Links</a></li>
    </ul>
</div><!-- #main-nav -->

如果你检查这段代码,你会看到它由以下部分组成。

  • 一个带有main-nav 类的 div,在wp_nav_menu() 函数中定义。
  • 在这里面,有一个ul ,ID为menu-navbar ,类为menu 。这是由WordPress定义的默认值。
  • 在这里面,有一些li 元素,每一个都有menu-item menu-item-type-post_type 的类,再加上其他一些特定的类,这些类是针对该菜单项所指向的文章类型和该菜单项当时的状态。每个元素都有一个独特的ID,其数字与数据库中导航菜单项的帖子ID相对应。
  • 在其中一个li 元素的内部是另一个ul ,其内部有自己的li 元素,即二级菜单项。当用户将鼠标悬停在顶层菜单项上时,我们希望能将其下拉。

为创建下拉菜单的CSS编码

所以,现在我们知道WordPress正在输出什么,我们可以确定我们要用我们的CSS来针对哪些元素。

我们要实现几件事。

  • 当页面被打开时,二级菜单项目被隐藏。
  • 当用户将鼠标悬停在一个顶级项目上时,它下面的二级项目会出现。

默认隐藏第二级项目

在你的主题的样式表中,首先默认隐藏第二级项目。

添加这个。

main-nav ul ul {
    display: none;
}

这将隐藏ul 元素在另一个ul 元素在main-nav 元素里面。然而,它不会隐藏顶级的ul 元素,因为它要求一个ul 嵌套在菜单内的另一个ul

现在,如果你打开页面并试图查看二级项目,这将是不可能的--它们将被隐藏。让我们来解决这个问题。

使第二层项目在悬停时显示出来

现在我们需要确保嵌套在顶层li 内的ul ,当顶层li 被悬停在上面时,就会显示出来。

把这个添加到你的样式表中。

.main-nav ul li:hover > ul {
    display: block;
}

现在,当你把鼠标悬停在顶层项目上时,它下面的列表会出现。但你会发现,它不会以你想要的方式显示。具体来说,它将把菜单下面的内容压下去。我们希望它看起来就像漂浮在内容之上一样。为了解决这个问题,我们需要给我们的ul ul 元素添加一些布局样式。

为第二层列表添加布局样式

打开你的样式表,找到有display: none 的那一行。编辑该块,添加布局样式。

.main-nav ul ul {
    display: none;
    position: absolute;
    top: 3em;
    left: 0;
    z-index: 99999;
    width: 180px;
    background: #fff;
    box-shadow: 0px 3px 3px rgba(0,0,0,0.2);
}

你还需要给顶级列表项添加相对定位。

.main-nav li {
    position: relative;
}

让我们看一下这段代码的作用。

  • position: absolute 给第二级列表绝对定位,使其脱离页面中的元素流。对于高层项目,position: relative 把顶层列表放在页面的流程中,并允许一个绝对定位的元素放在它里面。
  • top: 3em 将列表的顶部相对于它里面的元素的顶部定位,即顶层列表项。这个3em 值反映了顶层导航栏的高度。如果你的顶层导航有不同的高度,请编辑你的高度。
  • left: 0 将列表放置在左边,相对于它上面的项目。
  • z-index: 99999 定义元素在页面的三维模型中的位置。99999 的高值可以确保它被显示在其他东西的上面。
  • 剩下的代码给了列表的宽度,也给它添加了显示样式,包括一个阴影,使它看起来像是在页面的顶部。

现在让我们看看当我们把鼠标悬停在顶级项目上时,我们会看到什么。

Hovering over menuHovering over menuHovering over menu

它起作用了!当我把鼠标悬停在顶层项目上时,下拉菜单现在就显示出来了。

让你的下拉菜单变得移动友好

上面的代码对于桌面版的网站来说是很好的,但现实是,大多数人都会用手机访问你的网站。

这里的菜单太大,无法适应小屏幕,所以最好的解决办法是在小屏幕上编辑CSS,并使用一些JavaScript来创建一个汉堡菜单。

下面是如何做到这一点。

在横幅上添加一个菜单图标

首先,添加人们需要点击的图标,以便在小屏幕上访问菜单。

把这个添加到header.php文件中,放在你想要菜单图标的地方。

<a class="toggle-nav" href=“#">&#9776;</a>

这将输出汉堡的符号,使用该符号的HTML代码,在一个元素内,我们将使用一个类来隐藏它在大屏幕上。

添加汉堡菜单的CSS

现在你需要将CSS添加到你的样式表中。首先,在大屏幕上隐藏该图标。

.toggle-nav {

    display: none !important;

}

现在在一个媒体查询中,添加菜单的CSS。

@media screen and ( max-width: 550px) {
    
   
	a.toggle-nav {
	    float: right;
	    margin: 0 0 0.5em 0.5em;
	    display: inline-block !important;
	    color: #fff;
	    transition: color linear 0.15s;
	}
	
	a.toggle-nav:hover, a.toggle-nav:active {
	    text-decoration: none;
	    color: #fff;
	} 
   
	.menu-header {
	    display: inline-block;
	    position: relative;
		margin: 0;
		width: 100%;
	}
	
	#access .menu-header ul {
	    display: none;
		position: absolute;
	    top: 80%;
	    right: 0px;
	    min-width: 200px;
	    background-color: #7B3D84;
	    font-size: 1.2em;
	}
	
	#access .menu-header li {
	    display: block;
	    float: none;
	    padding-right: 2%;
	    text-align: right;
	}
	#access ul li:hover > ul {
		display: none;
	}
		 
}

注意,如果你在你的主题中使用不同的类和ID,你将需要编辑这个。

添加JavaScript

最后一步是添加一个脚本,使菜单在用户点击图标的时候出现。在你的主题中创建一个名为 "脚本"的文件夹,并在该文件夹中创建一个名为 "汉堡-菜单"的新文件,然后将这个文件添加到其中。

jQuery(document).ready(function() {
    jQuery('.toggle-nav').click(function(e) {
        jQuery('.menu-header ul.menu').slideToggle(500);
 
        e.preventDefault();
    });
    
});

现在确保该脚本被主题调用。在你的主题的functions.php文件中,添加一个函数来排队等候该脚本。

function tutsplus_burger_menu_scripts() {
    
	wp_enqueue_script( 'burger-menu-script', get_stylesheet_directory_uri() . '/scripts/burger-menu.js', array( 'jquery' ) );
 
}
add_action( 'wp_enqueue_scripts', 'tutsplus_burger_menu_scripts' );

现在保存你的所有文件,你就会有一个小屏幕上的汉堡菜单。

Burger menuBurger menuBurger menu

下拉式菜单对小型、多级菜单很有用

当你的网站需要一个多层次的菜单,但你又不需要在你的顶层菜单之外有很多链接时,下拉菜单是实现这一目的的最简单方法。我用来演示的网站,其菜单中只有一个项目,下面还有其他项目,而且只有三个。使用一个巨型菜单会显得过分,而且单层菜单也不允许我显示我想要的一切。

能够在你的主题中加入这样的菜单,将使你的菜单更加灵活,增强用户体验。而且,你只需用几行CSS就可以做到这一点。