用CSS创建响应式移动菜单,无需JavaScript

1,213 阅读8分钟

一个清晰、简明、易于直观浏览的导航菜单对于优化网站的用户体验至关重要。菜单的响应性也是一个关键因素。截至目前,全世界有超过54%的网络流量是由移动端带来的。通过移动优先的响应式设计,开发人员从最小的屏幕尺寸开始,然后逐渐扩大规模,为更大的屏幕尺寸添加更多的特性和功能。由此产生的网页将自动调整到用户的浏览器窗口的大小。

然而,尽管响应式菜单对网站的用户体验很重要,但没有必要用JavaScript来构建它。本教程将回顾如何只用HTML和CSS来创建一个移动优先的响应式菜单。

只用CSS的响应式移动菜单

有许多技术可用于构建响应式移动菜单。一种常见的做法是使用纯CSS,不使用任何一行JavaScript。这种技术包括采用一个简单的HTML列表结构来开发一个链接菜单,该菜单可以根据设备的屏幕尺寸进行不同的样式和渲染。

在本教程中,我们将使用CSS为手机、平板电脑和桌面建立以下响应式菜单。

CSS Menu Mobile View CSS Menu Tablet View CSS Menu Desktop View

对于较小的屏幕,用户必须点击一个汉堡包图标来显示菜单项目。较大的屏幕将在导航栏中显示菜单项的内线。

在本教程中,我们将建立一个响应式菜单,包括一个汉堡包图标,完全由纯HTML和CSS构成。

CSS Menu Mobile View Hamburger Menu Open

移动视图,打开汉堡包图标以显示菜单项目。

让我们试试吧

开始吧

使用你最喜欢的文本编辑器,如VS Code,在一个共同的文件夹中创建两个文件。

  • index.html 为HTML代码
  • style.css ,用于CSS代码

复制index.html 文件的路径,并将其粘贴到浏览器中,以预览该应用程序。

添加HTML

index.html 文件中添加以下代码。

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- App title -->
    <title>Responsive Pure CSS Menu</title>
    <!-- Link CSS file -->
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <!-- Navigation bar -->
    <header class="header">
        <!-- Logo -->
        <a href="#" class="logo">LR</a>
        <!-- Hamburger icon -->
        <input class="side-menu" type="checkbox" id="side-menu"/>
        <label class="hamb" for="side-menu"><span class="hamb-line"></span></label>
        <!-- Menu -->
        <nav class="nav">
            <ul class="menu">
                <li><a href="#">Gallery</a></li>
                <li><a href="#">Blog</a> </li>
                <li><a href="#">About</a></li>
            </ul>
        </nav>
    </header>
    <!-- Main content -->
    <main>
        <article>
            <h1>
                Some content
            </h1>
            <p>
                More Content
            </p>
        </article>
    </main>
</body>
</html>

这段代码包含网页的结构和内容。它还包括对CSS样式表的引用。

我们使用headermain 语义标签来分隔导航栏和页面的主要内容。

我们使用<a> 锚标签添加一个标识。

最后,我们使用checkbox hack来创建一个汉堡包菜单。通过这个策略,我们可以根据复选框是否被选中来确定菜单的样式。

我们使用一个label 标签来定义汉堡包菜单的图标。input 标签被用来根据复选框的状态有条件地显示菜单(类side-menu )。

然后,我们将菜单项作为链接列表元素,<li> ,添加到一个无序列表中,ulnav 标签作为列表的容器。

下面是仅有HTML的输出。

添加CSS

现在,我们将使用CSS来为不同的UI组件和功能设置样式。

为内容和背景设计样式

我们将在style.css 文件中添加以下代码来调整HTML内容的外观。

/* Theming */
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap"); /* import font */

:root{
    --white: #f9f9f9;
    --black: #36383F;
    --gray: #85888C;
} /* variables*/

/* Reset */
*{
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
body{
    background-color: var(--white);
    font-family: "Poppins", sans-serif;
}
a{
    text-decoration: none;
}
ul{
    list-style: none;
}

这段代码导入了Poppins谷歌字体,以便在应用程序中使用。

我们为应用程序中使用的颜色定义CSS变量。然后,我们使用CSS重置来删除浏览器对marginpaddingbox-sizingtext-decorationlist-style 的默认设置。

我们还为页面内容指定了一个白色的background-color 和Poppinsfont-family

下面是输出结果,显示了样式化的内容和背景。

标题和标识的样式

/* Header */
.header{
    background-color: var(--black);
    box-shadow: 1px 1px 5px 0px var(--gray);
    position: sticky;
    top: 0;
    width: 100%;
}
/* Logo */
.logo{
    display: inline-block;
    color: var(--white);
    font-size: 60px;
    margin-left: 10px;
}

这段代码为页眉添加了一个黑色的background-color 和灰色的box-shadow 。为了在滚动过程中保持标题在屏幕的顶部,我们指定了一个粘性的position 和一个从top 的零偏移。我们还调整了页眉,使其在设备的整个width 上伸展。

我们通过指定colorfont-size 、和left-margin ,来设计标识的样式。不要与padding混淆, [margin] 是标志周围的区域,将其与其他元素分开。

下面是输出结果,显示了样式化的标题和标志。

设计导航菜单的样式

/* Nav menu */
.nav{
    width: 100%;
    height: 100%;
    position: fixed;
    background-color: var(--black);
    overflow: hidden;

}
.menu a{
    display: block;
    padding: 30px;
    color: var(--white);
}
.menu a:hover{
    background-color: var(--gray);
}
.nav{
    max-height: 0;
    transition: max-height .5s ease-out;
}

nav 在这段代码中,我们为widthheight 元素指定了100%的属性,以便使内容符合屏幕。然后,我们指定一个固定的position ,将导航菜单覆盖在主要应用内容的上面。我们还为nav 元素选择了一个黑色的background-color ,并指定任何来自nav 元素的overflow 内容应被隐藏。

对于菜单链接元素,我们指定一个block 格式显示,添加paddingcolor ,并将background-color 从悬停时的白色改为灰色。

最后,我们使用CSS[transition] 属性和一个0的max-height 来默认隐藏nav 元素,但当菜单图标被点击时就会显示。

下面是输出结果,显示了样式化的导航菜单。

汉堡包菜单的样式

/* Menu Icon */
.hamb{
    cursor: pointer;
    float: right;
    padding: 40px 20px;
}/* Style label tag */

.hamb-line {
    background: var(--white);
    display: block;
    height: 2px;
    position: relative;
    width: 24px;

} /* Style span tag */

.hamb-line::before,
.hamb-line::after{
    background: var(--white);
    content: '';
    display: block;
    height: 100%;
    position: absolute;
    transition: all .2s ease-out;
    width: 100%;
}
.hamb-line::before{
    top: 5px;
}
.hamb-line::after{
    top: -5px;
}

.side-menu {
    display: none;
} /* Hide checkbox */

在这段代码中,我们指定当用户与汉堡包菜单交互时,应该显示一个指针cursor 。我们将label 元素定位到右边,并添加一些填充。

接下来,我们对span 元素进行样式化,以创建三个菜单图标线。

我们在span 元素上使用CSS伪元素[::before][::after]来定义三条汉堡包图标线。.hamb-line 选择器定义了中心(或第二)线。.hamb-line::before.hamb-line::after 分别将第一行和第三行5px 定位在中心线的上方和下方。

最后,我们使用display 属性来隐藏复选框(.side-menu)。

下面是输出结果,显示了风格化的汉堡包菜单。

为切换式菜单图标设计样式

/* Toggle menu icon */
.side-menu:checked ~ nav{
    max-height: 100%;
}
.side-menu:checked ~ .hamb .hamb-line {
    background: transparent;
}
.side-menu:checked ~ .hamb .hamb-line::before {
    transform: rotate(-45deg);
    top:0;
}
.side-menu:checked ~ .hamb .hamb-line::after {
    transform: rotate(45deg);
    top:0;
}

我们对汉堡包菜单图标进行造型,以改变其在被选中时的外观。首先,我们指定复选框被选中时nav 元素的max-height (class.side-menu``:checked )。

然后,我们按照两个步骤创建一个 "x "形的关闭图标,以表明复选框被选中。background 首先,我们通过将汉堡包图标的第二行设置为transparent 来隐藏它。然后,我们将第一行和第三行分别旋转-45度和45度,以形成一个 "x "形。

这是输出结果,显示了切换后的菜单。

CSS Hamburger Manu Not Toggled CSS Hamburger Menu Toggled

增加响应性

我们可以通过使用媒体查询来有条件地包含CSS属性,使应用程序具有响应性。换句话说,只有当条件设置有效时,媒体查询内的属性才会应用到网页上。

/* Responsiveness */
@media (min-width: 768px) {
    .nav{
        max-height: none;
        top: 0;
        position: relative;
        float: right;
        width: fit-content;
    }
    .menu li{
        float: left;
    }
    .menu a:hover{
        background-color: transparent;
        color: var(--gray);

    }

    .hamb{
        display: none;
    }
}

在这段代码中,我们添加了一个@media 规则,设备条件设置为768pxmin-width 。我们希望具有这个最小宽度的设备能够看到完整的导航菜单,而不是汉堡包菜单。

我们删除nav 元素的max-height 属性,将其设置为none

我们将nav 元素放置在屏幕的右上方,并指定其宽度为fit-content

我们将float ,将菜单列表项放在nav 的左边。我们指定背景颜色为透明,菜单列表项在悬停时为灰色。

最后,我们使用display 属性来隐藏汉堡包菜单图标。

这就是完全风格化的应用程序。

这个视频演示了该应用程序的响应式用户界面。

总结

在本教程中,我们只用HTML和CSS设计并构建了一个移动优先的响应式菜单,没有使用JavaScript。本文中使用的完整代码可在GitHub上找到。

本文使用的技术只是构建响应式移动菜单的众多方法之一。通过试验不同的方法,你可以决定你喜欢哪种方法。编码愉快!

The postCreating a responsive mobile menu with CSS without JavaScriptappeared first onLogRocket Blog.