JavaScript 实现网页菜单延迟加载效果》

2024-09-06 08:12

本文主要是介绍JavaScript 实现网页菜单延迟加载效果》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、整体代码结构

二、代码注解

1. HTML 结构部分

2. CSS 样式部分

3. JavaScript 部分


一、整体代码结构

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!-- defer延迟加载只针对外引 --><script>//JavaScript延迟加载window.onload=function(){var first_li=document.querySelectorAll(".main>li")for(var i = 0; i<first_li.length; i++){first_li[i].onmouseenter =function(){if(this.querySelector("ul")){// this.querySelector("ul").style.display= "block"//获取盒子的高度var second_li=this.querySelectorAll("ul li")var sum_height = 0for(var j = 0;j < second_li.length; j++){sum_height += second_li[j].clientHeight}this.querySelector("ul").style.height = sum_height+ "px"}}first_li[i].onmouseleave =function(){if(this.querySelector("ul")){// this.querySelector("ul").style.display= "none"this.querySelector("ul").style.height = "0px"//延迟定时器//setTimeoutsetTimeout(function(){var second_ul=document.querySelector(".main ul")for(var m=0;j<second_ul.length;m++){second_ul[m].style.display= "none"}},2000)}}}}</script><style>*{padding: 0;margin: 0;transition:  all 1s ease;}a{text-decoration: none;}li{list-style: none;}.content{margin: 80px auto;background: red;}.main{width: 80%;margin: 0px auto;display: flex;justify-content: space-between;}.main>li{position: relative;}.main>li ul{/* display: none; */height: 0px;position: absolute;background: red;}.main>li a{color: aliceblue;padding: 8px;display: block;}.main>li a:hover{color: red;background: floralwhite;}</style>
</head>
<body><div class="content"><ul class="main"><li><a href="#">首页</a></li><li><a href="#">网上报告</a><ul><li><a href="#">入学指南</a></li><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><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><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><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><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><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><li><a href="#">入学指南</a></li></ul></li></ul></div>
</body>
</html>

二、代码注解

1. HTML 结构部分

  • <meta charset="UTF-8">:设置页面的字符编码为 UTF-8,以支持多种语言字符的显示。
  • <meta name="viewport" content="width=device-width, initial-scale=1.0">:用于设置移动端的视口属性,确保页面在不同设备上都能良好显示。
  • <title>Document</title>:设置页面的标题,显示在浏览器标签页上。
  • <div class="content">:一个容器元素,用于包裹菜单列表。
  • <ul class="main">:主菜单列表,包含多个<li>元素,每个<li>元素代表一个菜单项。

2. CSS 样式部分

  • * { padding: 0; margin: 0; transition: all 1s ease; }:重置所有元素的内边距和外边距为 0,并设置了一个通用的过渡效果,使元素的属性变化更加平滑。
  • a { text-decoration: none; }:去除链接的下划线。
  • li { list-style: none; }:去除列表项的默认标记。
  • .content { margin: 80px auto; background: red; }:设置容器的外边距为上下 80 像素,左右自动居中,并设置背景颜色为红色。
  • .main { width: 80%; margin: 0px auto; display: flex; justify-content: space-between; }:设置主菜单列表的宽度为页面宽度的 80%,水平居中显示,并使用 flex 布局使菜单项平均分布。
  • .main>li { position: relative; }:设置主菜单列表项为相对定位,为子菜单的绝对定位提供参考。
  • .main>li ul { display: none; height: 0px; position: absolute; background: red; }:设置子菜单列表初始状态为隐藏,高度为 0,绝对定位,并设置背景颜色为红色。
  • .main>li a { color: aliceblue; padding: 8px; display: block; }:设置主菜单链接的颜色为白色,内边距为 8 像素,以块级元素显示。
  • .main>li a:hover { color: red; background: floralwhite; }:设置主菜单链接在鼠标悬停时的颜色为红色,背景颜色为花白色。

3. JavaScript 部分

  • window.onload = function () {...}:在页面加载完成后执行的函数。确保页面的 DOM 结构完全加载后再执行 JavaScript 代码,避免因 DOM 元素未加载而导致的错误。
  • var first_li = document.querySelectorAll(".main>li");:使用querySelectorAll方法获取所有类名为main的元素下的直接子元素<li>,即主菜单列表项。
  • for (var i = 0; i < first_li.length; i++) {...}:遍历所有主菜单列表项。
  • first_li[i].onmouseenter = function () {...}:为主菜单列表项添加鼠标移入事件监听器。当鼠标移入时,执行以下操作:
    • if (this.querySelector("ul")) {...}:检查当前主菜单列表项是否包含子菜单<ul>
    • this.querySelector("ul").style.display = "block";:如果有子菜单,将子菜单的显示属性设置为block,使其显示出来。
    • var second_li = this.querySelectorAll("ul li");:获取当前主菜单列表项下的子菜单列表项。
    • var sum_height = 0; for (var j = 0; j < second_li.length; j++) { sum_height += second_li[j].clientHeight; }:计算子菜单列表项的总高度。
    • this.querySelector("ul").style.height = sum_height + "px";:将子菜单的高度设置为计算得到的总高度,实现子菜单的平滑展开效果。
  • first_li[i].onmouseleave = function () {...}:为主菜单列表项添加鼠标移出事件监听器。当鼠标移出时,执行以下操作:
    • if (this.querySelector("ul")) {...}:检查当前主菜单列表项是否包含子菜单<ul>
    • this.querySelector("ul").style.height = "0px";:将子菜单的高度设置为 0,使其逐渐隐藏。
    • setTimeout(function () {...}, 1000);:设置一个延迟定时器,在 1 秒后执行回调函数。
    • var second_ul = document.querySelectorAll(".main ul"); for (var j = 0; j < second_ul.length; j++) { second_ul[j].style.display = "none"; }:获取所有主菜单列表项下的子菜单<ul>,并将其显示属性设置为none,确保子菜单完全隐藏。

这篇关于JavaScript 实现网页菜单延迟加载效果》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141475

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows