CSS ul与li实现菜单

ul与li标签具有并列项的逻辑含义。

页面开发很多地方具有并列项的逻辑意义,可以使用ul与li实现。

等价于两层div,ul对应外层div,li对应里层div,逻辑更加清晰。

常用场景:菜单列表、图片列表。


适用范围

用于局部的并列项内容的布局,不用来做页面整体布局。


1 纵向菜单

img

html代码

<body>
<h1>导航菜单</h1>
<ul class="nav">
    <li><a href="#">菜单1</a></li>
    <li><a href="#">菜单2</a></li>
    <li><a href="#">菜单3</a></li>
    <li><a href="#">菜单4</a></li>
    <li><a href="#">菜单5</a></li>
</ul>
</body>

ul-li表示多个并列项的父层-子层 标签,逻辑更加清晰。


css代码

<head>
    <meta charset="UTF-8" >
    <title>css ul与li布局 菜单 | 关关教程</title>

    <style>
        *{
            margin:0;
            padding: 0;
        }

        ul.nav{
            list-style: none;
            margin:5px;
            width: 200px;
            border-left: 1px solid #a4a0a0;
            border-right: 1px solid #a4a0a0;
        }

        ul.nav>li{
            display: block;
            height: 30px;
            /*line-height与height设为相同值,实现单行内容的垂直居中*/
            line-height: 30px;
            border-bottom: 1px solid #a4a0a0;
            background-color: #f1efef;
            padding-left: 20px;
        }

        ul.nav>li>a{
            /* a的display默认为inline,无法撑开 */
            display: block;
        }

        ul.nav>li:first-child{
            border-top: 1px solid #a4a0a0;
        }

    </style>
</head>

2 横向菜单

多菜单项横向排列

img

html代码上述代码相同,纵向关键CSS代码如下,即:ul加清除浮动样式,li加浮动样式,然后去除多余的边框。

        ul.nav:after{
            content: '';
            display: block;
            clear: both;
        }
        
        ul.nav>li{
            float:left;
        }

常用场景

各网站头部的导航都是类似结构,可采用类似实现。

京东头部。

img

淘宝头部。

img

百度头部。

img


当然,ul-li不是必须的,一定要用div来实现也是完全可以的。


3 二级菜单

项目的菜单如果很多,会划分多个菜单组,每个菜单组再包含多个菜单,即二级菜单。

img

HTML代码

外层ul里包含3个 li,对应3个菜单组;

第1级li又包含h2与子ul-li,h2对应菜单组名称,ul-li对应具体菜单。

整个ul-li的两层嵌套。

<body>
<h1>导航菜单</h1>
<ul class="nav">
    <li>
        <h2>菜单组1</h2>
        <ul class="menu">
            <li><a href="#">菜单1-1</a></li>
            <li><a href="#">菜单1-2</a></li>
            <li><a href="#">菜单1-3</a></li>
            <li><a href="#">菜单1-4</a></li>
            <li><a href="#">菜单5</a></li>
        </ul>
    </li>

    <li>
        <h2>菜单组2</h2>
        <ul class="menu">
            <li><a href="#">菜单2-1</a></li>
            <li><a href="#">菜单2-2</a></li>
            <li><a href="#">菜单2-3</a></li>
        </ul>
    </li>


    <li>
        <h2>菜单组3</h2>
        <ul class="menu">
            <li><a href="#">菜单3-1</a></li>
            <li><a href="#">菜单3-2</a></li>
            <li><a href="#">菜单3-3</a></li>
        </ul>
    </li>
    
</ul>
</body>

CSS代码与一级菜单类似

<head>
    <meta charset="UTF-8" >
    <title>css ul与li布局 二级菜单 | 关关教程</title>

    <style>
        *{
            margin:0;
            padding: 0;
        }

        ul.nav{
            list-style: none;
            margin:5px;
            width: 200px;
            border-left: 1px solid #a4a0a0;
            border-right: 1px solid #a4a0a0;
        }

        ul.nav>li{
            display: block;
            
            border-bottom: 1px solid #a4a0a0;
            background-color: #f1efef;
            padding-left: 20px;
        }

        ul.nav>li>a{
            /* a的display默认为inline,无法撑开 */
            display: block;
        }

        ul.nav>li:first-child{
            border-top: 1px solid #a4a0a0;
        }

        ul.nav ul.menu>li{
            list-style: none;
        }

    </style>
</head>

4 折叠二级菜单

实际项目,二级菜单会有点菜折叠效果,需要结合javascript实现。

点击标题时,切换相式,隐藏相应的第二级ul-li即可。

这里我们不加javascript,直接加样式实现折叠(隐藏)。

img

html代码

相应第1级的li上添加class:fold。(比设在第2级的ul的逻辑更强,当然也可以)

<ul class="nav">
    <li class="fold">
        <h2>菜单组1</h2>
        <ul class="menu">
            <li><a href="#">菜单1-1</a></li>
            <li><a href="#">菜单1-2</a></li>
            <li><a href="#">菜单1-3</a></li>
            <li><a href="#">菜单1-4</a></li>
            <li><a href="#">菜单5</a></li>
        </ul>
    </li>
//省略

CSS代码

设置li.fold里的ul.menu为隐藏状态。

        /* 折叠 */
        ul.nav li.fold ul.menu{
            display: none;
        }

注意事项

以后我们加入JavaScript,里面的逻辑很简单,点击标题时,添加或删除类fold即可。

所以这种动态交互,我们需要在CSS里尽量通一个class的切换来实现功能,JavaScript代码就非常简单。