IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js+css+html制作下拉菜单 -> 正文阅读

[JavaScript知识库]js+css+html制作下拉菜单

1 案例需求

使用JavaScript+css+html制作下拉菜单,当鼠标放在菜单项时,菜单项的背景色会改变,而且会出现二级菜单,当鼠标放在二级菜单上时,二级菜单会变色,当鼠标离开菜单项后,二级菜单隐藏。

效果图:
在这里插入图片描述
在这里插入图片描述

2 编写HTML结构代码

在HTML页面代码中,先用列表把菜单的内容做出来,代码如下:

    <ul class="nav">
        <li>
            <a href="#">文件</a>
            <ul>
                <li>
                    <a href="#">新建文件</a>
                </li>
                <li>
                    <a href="#">新建窗口</a>
                </li>
                <li>
                    <a href="#">新建文件夹</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">编辑</a>
            <ul>
                <li>
                    <a href="#">撤销</a>
                </li>
                <li>
                    <a href="#">重做</a>
                </li>
                <li>
                    <a href="#">剪切</a>
                </li>
            </ul>
        </li>
    </ul>

在这里插入图片描述

3 编写css样式

首先将所有的外边距和内边距都去掉,防止影响页面效果,使用通配符选择器实现该效果。然后将<a>标签的下划线去掉,并且修改字体的大小。最后将列表之前的圆点样式去掉,设置菜单的外边距。代码如下:

    * {
        margin: 0;
        padding: 0;
    }
    li {
        /* 去掉圆点 */
        list-style-type: none;
    }
    a {
        /* 去掉下划线 */
        text-decoration: none;
        /* 修改字体大小 */
        font-size: 14px;
    }
    /* 设置最外层ul的样式 */
    .nav {
        /* 让这个列表显示往屏幕中间一点 */
        margin: 100px;
    }

在这里插入图片描述
上面这一步对样式进行了初步的设置,根据自己的需求设计即可。接下来设计第一层li的样式。给它设定一个宽高,并且让该块级元素向左浮动,使第一层li排列在一行,紧接着让里面的文字居中。

    /* 子元素选择器“>”,选择第一层ul下的li */
    .nav>li {
        width: 100px;
        height: 41px;
        float: left;
        text-align: center;
        /* 让下拉菜单紧跟在li下面 */
        position: relative;
    }

在这里插入图片描述
接下来为所有的a标签设置样式。将所有的a标签设置为块级元素,让它们的长宽等于外面块级元素li的长和宽,设置行高,使a标签元素内的文字在垂直方向上居中,最后让其字体颜色变成黑色,并且为其添加边框属性。

    /* 后代选择器选择子孙后代,在这里选择所有的a标签 */
    .nav li a {
        display: block;
        width: 100%;
        height: 100%;
        line-height: 41px;
        color: black;
        border: solid 1px #FECC5B;
    }

在这里插入图片描述
接着为一级菜单设置伪类。当鼠标悬停在“文件”和“编辑”上时,让这两个a标签的背景色变成灰色,鼠标移开,恢复正常。

    .nav>li>a:hover {
        background-color: #eee;
    }

在这里插入图片描述
接下来设置二级菜单的伪类。当鼠标移动到“新建文件”、“撤销”及其下面的列表项时,其背景变色,鼠标移开,恢复正常。可以使用 后代选择器,也可以使用子元素选择器,代码只展示后代选择器,子元素选择器为注释部分。

    .nav li ul li a:hover {
        background-color: #FFF5DA;
    }
    /* .nav>li>ul>li>a:hover {
        background-color: #FFF5DA;
    } */

在这里插入图片描述
最后让二级菜单的ul隐藏起来,达到只显示一级菜单的效果。

    .nav ul {
        display: none;
        /* 让下拉列表定位在当前li下方 */
        position: absolute;
    }

在这里插入图片描述

4 编写JavaScript部分

在之前的css样式中,对该菜单的样子做了基本的设置,接下来需要使用JavaScript代码做互动,就是当鼠标移动到两个一级菜单上时,下面的二级菜单会显示出来。

        //1、获取两个一级菜单元素,即两个li:先获取第一层ul,然后获取ul下的子元素li
        var lis = document.querySelector(".nav").children;
        //2、循环给两个li绑定鼠标移进去和移出去的事件
        for (var i = 0; i < lis.length; i++) {
            lis[i].onmouseover = function () {
                //当鼠标移进去时,选择将第一层li(“文件”、“编辑”)下面的第二个子元素li(第一个是a标签)显示出来
                this.children[1].style.display = "block";
            }
            lis[i].onmouseout = function () {
                //当鼠标移出来时,选择将第一层li(“文件”、“编辑”)下面的第二个子元素li(第一个是a标签)隐藏
                this.children[1].style.display = "none";
            }
        }

5 全部代码

<!DOCTYPE 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">
    <title>Document</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }

    li {
        /* 去掉圆点 */
        list-style-type: none;
    }

    a {
        /* 去掉下划线 */
        text-decoration: none;
        /* 修改字体大小 */
        font-size: 14px;
    }

    /* 设置最外层ul的样式 */
    .nav {
        /* 让这个列表显示往屏幕中间一点 */
        margin: 100px;
    }

    /* 子元素选择器选择第一层ul下的li */
    .nav>li {
        width: 100px;
        height: 41px;
        float: left;
        text-align: center;
        /* 让下拉菜单紧跟在li下面 */
        position: relative;
    }

    /* 后代选择器选择子孙后代,在这里选择所有的a标签 */
    .nav li a {
        display: block;
        width: 100%;
        height: 100%;
        line-height: 41px;
        color: black;
        border: solid 1px #FECC5B;
    }

    .nav>li>a:hover {
        background-color: #eee;
    }

    .nav li ul li a:hover {
        background-color: #FFF5DA;
    }

    /* .nav>li>ul>li>a:hover {
        background-color: #FFF5DA;
    } */

    .nav ul {
        display: none;
        /* 让下拉列表定位在当前li下方 */
        position: absolute;
    }
</style>

<body>
    <ul class="nav">
        <li>
            <a href="#">文件</a>
            <ul>
                <li>
                    <a href="#">新建文件</a>
                </li>
                <li>
                    <a href="#">新建窗口</a>
                </li>
                <li>
                    <a href="#">新建文件夹</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">编辑</a>
            <ul>
                <li>
                    <a href="#">撤销</a>
                </li>
                <li>
                    <a href="#">重做</a>
                </li>
                <li>
                    <a href="#">剪切</a>
                </li>
            </ul>
        </li>
    </ul>
    <script>
        //1、获取两个一级菜单元素,即两个li:先获取第一层ul,然后获取ul下的子元素li
        var lis = document.querySelector(".nav").children;
        //2、循环给两个li绑定鼠标移进去和移出去的事件
        for (var i = 0; i < lis.length; i++) {
            lis[i].onmouseover = function () {
                //当鼠标移进去时,选择将第一层li(“文件”、“编辑”)下面的第二个子元素li(第一个是a标签)显示出来
                this.children[1].style.display = "block";
            }
            lis[i].onmouseout = function () {
                //当鼠标移出来时,选择将第一层li(“文件”、“编辑”)下面的第二个子元素li(第一个是a标签)隐藏
                this.children[1].style.display = "none";
            }
        }
    </script>
</body>

</html>
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:39:54  更:2021-12-02 16:40:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:49:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码