JavaScript使用类-模态窗口

**上节课我们为这个项目获取了一些DOM元素,现在我们可以继续;**

在这里插入图片描述

这个模态窗口有一个hidden类,这个类上文我们讲了,他的display为none;如果我们去除这个hidden的话,就可以让这个模态窗口展现出来。如下

const modal = document.querySelector('.modal');
const overlay = document.querySelector('overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnsOpenModal = document.querySelectorAll('.show-modal');for (let i = 0; i < btnsOpenModal.length; i++)btnsOpenModal[i].addEventListener('click', function () {modal.classList.remove('hidden');});

JavaScript 中的 classList 是 DOM 元素对象的属性之一,它提供了操作元素类的方法和属性。
classList 属性是一个 DOMTokenList 对象,它包含了元素的类列表,可以进行以下操作:

  1. classList.add(className1, className2, …):
    ○ 将指定的类名添加到元素的类列表中。可以同时添加多个类名。
    ○ 示例:element.classList.add(‘class1’, ‘class2’)
  2. classList.remove(className1, className2, …):
    ○ 从元素的类列表中移除指定的类名。可以同时移除多个类名。
    ○ 示例:element.classList.remove(‘class1’, ‘class2’)
  3. classList.toggle(className, force):
    ○ 如果元素的类列表中存在指定的类名,则移除该类名;如果不存在,则添加该类名。
    ○ 可以通过第二个可选参数 force 控制是否强制添加或移除类名。
    ○ 示例:element.classList.toggle(‘class’, true) 或 element.classList.toggle(‘class’, false)
  4. classList.contains(className):
    ○ 检查元素的类列表中是否包含指定的类名,并返回一个布尔值。
    ○ 示例:element.classList.contains(‘class’)
  5. classList.replace(oldClass, newClass):
    ○ 将元素的类列表中的旧类名替换为新类名。
    ○ 示例:element.classList.replace(‘old-class’, ‘new-class’)
  6. classList.item(index):
    ○ 返回类列表中指定索引位置上的类名。索引从 0 开始。
    ○ 示例:element.classList.item(0)
  7. classList.length:
    ○ 返回元素类列表中的类名数量。
    ○ 示例:element.classList.length
    通过使用 classList,可以方便地操作和修改元素的类,实现各种交互效果和样式更改。请注意,classList 属性在较老的浏览器中可能不被支持,建议在使用时进行兼容性检查或使用 polyfill 来提供支持。
    在这里插入图片描述

现在我们点击这些按钮,就可以去除hidden,让窗口展现出来

这里提一个问题,我们为什么要使用for循环去给btnopen按钮去添加点击事件,为什么不能直接使用这个变量?
回答:这里使用循环是为了将事件监听器绑定到每个 btnsOpenModal 元素上。
在上面的代码中,首先通过 document.querySelectorAll(‘.show-modal’) 选择器获取了带有 .show-modal 类的所有元素,并将它们存储在 btnsOpenModal 变量中。这将返回一个 NodeList 对象,其中包含了匹配选择器的所有元素。
由于 NodeList 并不是一个数组,它是一个类数组对象,没有内置的 addEventListener 方法,因此无法直接将事件监听器绑定到整个 NodeList 上。相反,我们需要逐个迭代 NodeList 中的每个元素,并为每个元素添加事件监听器。
因此,我们使用 for 循环来遍历 btnsOpenModal 数组(或 NodeList)中的每个元素。在每次循环迭代中,我们为当前元素添加 ‘click’ 事件监听器,并在点击事件触发时执行给定的函数。
在这个特定的代码片段中,当点击 btnsOpenModal 中的任何一个元素时,会触发一个函数,该函数会移除 modal 元素和 overlay 元素的 ‘hidden’ 类,以显示它们。由于我们想要将这个行为应用到每个按钮上,因此需要使用循环为每个按钮添加事件监听器。
总结起来,这段代码使用循环是为了遍历 btnsOpenModal 元素列表,并为每个元素添加一个 ‘click’ 事件监听器,以在点击时显示 modal 元素和 overlay 元素。

● 还有一个overlay的类,在窗口下层,用于添加一层模糊
在这里插入图片描述

for (let i = 0; i < btnsOpenModal.length; i++)btnsOpenModal[i].addEventListener('click', function () {modal.classList.remove('hidden');overlay.classList.remove('hidden');});

在这里插入图片描述

● 现在使用同样的原理,当我们点击这个x时,关闭模态窗口

btnCloseModal.addEventListener('click', function () {modal.classList.add('hidden');overlay.classList.add('hidden');
});

在这里插入图片描述
在这里插入图片描述

现在我们点击叉得到时候就恢复到关闭模态窗口

● 现在我们将实现不用点击叉,点击其他外部区域也可以关闭模态窗口,很简单,我们把点击事件做到overlay这个类上面去就行了,因为overlay在按钮上层,窗口下层

const modal = document.querySelector('.modal');
const overlay = document.querySelector('.overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnsOpenModal = document.querySelectorAll('.show-modal');for (let i = 0; i < btnsOpenModal.length; i++)btnsOpenModal[i].addEventListener('click', function () {modal.classList.remove('hidden');overlay.classList.remove('hidden');});btnCloseModal.addEventListener('click', function () {modal.classList.add('hidden');overlay.classList.add('hidden');
});overlay.addEventListener('click', function () {modal.classList.add('hidden');overlay.classList.add('hidden');
});
const modal = document.querySelector('.modal');
const overlay = document.querySelector('.overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnsOpenModal = document.querySelectorAll('.show-modal');for (let i = 0; i < btnsOpenModal.length; i++)btnsOpenModal[i].addEventListener('click', function () {modal.classList.remove('hidden');overlay.classList.remove('hidden');});btnCloseModal.addEventListener('click', function () {modal.classList.add('hidden');overlay.classList.add('hidden');
});overlay.addEventListener('click', function () {modal.classList.add('hidden');overlay.classList.add('hidden');
});

这样确实有效,但是会和上面有重复的代码,我们可以把这个函数提取出来,给他们公用

const closeModal = function () {modal.classList.add('hidden');overlay.classList.add('hidden');
};btnCloseModal.addEventListener('click', closeModal);overlay.addEventListener('click', closeModal);

● 当然上面的点击函数,我们也可以单独提取出来

const modal = document.querySelector('.modal');
const overlay = document.querySelector('.overlay');
const btnCloseModal = document.querySelector('.close-modal');
const btnsOpenModal = document.querySelectorAll('.show-modal');const openModal = function () {modal.classList.remove('hidden');overlay.classList.remove('hidden');
};const closeModal = function () {modal.classList.add('hidden');overlay.classList.add('hidden');
};for (let i = 0; i < btnsOpenModal.length; i++)btnsOpenModal[i].addEventListener('click', openModal);btnCloseModal.addEventListener('click', closeModal);overlay.addEventListener('click', closeModal);

这样代码逻辑更加的清晰明了;
下一篇文章将给大家介绍按键事件(当用户按下ESC按钮执行一些操作!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/102654.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Debian系统】:安装debian系统之后,很多命令找不到,需要添加sudo之后才能使用,以下解决方法

项目场景&#xff1a; 问题描述 解决方案&#xff1a; 1.临时解决方案 2.永久解决方案 1.首先打开编辑&#xff1a; 2.打开之后最后一行添加代码&#xff1a; 3.最后运行一遍 .bashrc 4.已经可以了&#xff0c;可以试试reboot&#xff0c;重启一下机子 一点一滴才能成长 …

windows的最佳选项卡式窗口管理器软件TidyTabs

下载&#xff1a; https://jmj.cc/s/z1t3kt?pucodeS1wc https://download.csdn.net/download/mo3408/88420433 TidyTabs是一款Windows应用程序&#xff0c;它可以将多个打开的窗口整理成一个选项卡式的界面&#xff0c;使得用户可以更加方便地切换和管理不同的窗口。 Tidy…

java try 自动关闭流

Java Try自动关闭流实现步骤 在开始之前&#xff0c;我们先来了解一下整个实现过程的流程。下面的表格展示了实现"try自动关闭流"的步骤&#xff1a; 步骤 描述 1 创建需要操作的流对象 2 在try语句块中使用流对象 3 在try语句块中自动关闭流对象 接下来…

uniapp web-view调整修改高度设置

web-view默认是占全屏&#xff0c;需求想要在头部添加一个返回导航。实现如下&#xff1a; 界面如下&#xff1a; <view class"myCardNav"><!-- 状态栏占位符 --><uni-nav-bar height"125rpx" border"false" left-icon"le…

【目录】RV1103/RV1106开发记录

【RV1103】Luckfox Pico RV1103 开发记录 【RV1103】Luckfox Pico 构建系统分析 【RV1103】RTL8723bs (SD卡形状模块)驱动开发 【RV1103】SD卡和无线WiFi同时使用

京东商品数据:8月京东环境电器行业数据分析

8月份&#xff0c;环境电器大盘市场整体下滑。鲸参谋数据显示&#xff0c;8月京东平台环境电器的大盘将近570万&#xff0c;环比下滑约29%&#xff0c;同比下滑约10%&#xff1b;销售额为25亿&#xff0c;环比下滑约23%&#xff0c;同比下滑约8%。 *数据源于鲸参谋-行业趋势分析…

网工内推 | 技术支持工程师,厂商公司,HCIA即可,有带薪年假

01 华为终端有限公司 招聘岗位&#xff1a;初级技术支持 职责描述&#xff1a; 1、通过远程方式处理华为用户在产品使用过程中各种售后问题&#xff1b; 2、收集并整理消费者声音&#xff0c;提供服务持续优化建议&#xff1b; 3、对服务中发现的热点、难点问题及其他有可能造…

iMazing2023免费版苹果iPhone手机备份应用软件

iMazing是一款功能强大的苹果手机备份软件&#xff0c;它可通过备份功能将通讯录备份到电脑上&#xff0c;并在电脑端iMazing“通讯录”功能中随时查看和导出联系人信息。它自带Wi-Fi自动备份功能&#xff0c;能够保证通讯录备份数据是一直在动态更新的&#xff0c;防止手机中新…

收银系统商品定价设计思考

一、背景 因为门店系统里商品总共也就几万款&#xff0c;一直以来都是根据条码由总部统一定价销售&#xff0c;现在有加盟店&#xff0c;各门店也有进行各自促销活动的需求&#xff0c;这就需要放开门店自主定价权&#xff0c;所以近段时间系统在商品定价上做了扩展。 二、商…

Mybatis事务如何跟Spring结合到一起?

Mybatis事务如何跟Spring结合到一起&#xff1f; 在Java Web开发中&#xff0c;MyBatis和Spring是两个常用的框架&#xff0c;它们可以有效地结合在一起&#xff0c;提供强大的数据库事务管理功能。在本文中&#xff0c;我们将从数据库事务特性和Spring事务管理源码两个角度来…

2562.找出数组中的串联值

2562. 找出数组的串联值 - 力扣&#xff08;LeetCode&#xff09; 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如&#xff0c;15 和 49 的串联是 1549 。 nums 的 串联值 最初等于 0 。执行下述操作直到 nums…

【SCS-CN】SCS-CN模型中CN值的确定

目录 一、说明二、SWAT三、HEC-HMS四、CN值转换公式五、确定CN25.1 ArcSWAT 2009用户指南5.2 SWAT plus Document5.3 National Engineering Handbook5.4 HEC-HMS水文建模系统原理方法应用5.5 Technical Release 55 (TR-55) 六、确定水文土壤单元&#xff08;HSG&#xff09;6.1…

移动应用-Android开发基础\核心知识点

Android开发基础 知识点 1 介绍了解2 系统体系架构3 四大应用组件4 移动操作系统优缺点5 开发工具6 配置工具7 下载相关资源8JDK下载安装流程9配置好SDK和JDK环境10 第一个Hello word11 AS开发前常用设置12模拟器使用运行13 真机调试14 AndroidUI基础布局15 加载展示XML布局16…

JS VUE 用 canvas 给图片加水印

最近写需求&#xff0c;遇到要给图片加水印的需求。 刚开始想的方案是给图片上覆盖一层水印照片&#xff0c;但是这样的话用户直接下载图片水印也会消失。 后来查资料发现用 canvas 就可以给图片加水印&#xff0c;下面是处理过程。 首先我们要确认图片的格式&#xff0c;我们通…

IX模式和其他模式

根据您提到的 "IX 模式"&#xff0c;我猜测您可能是在讨论分布式事务处理中的一种模式。通常&#xff0c;在分布式事务领域&#xff0c;存在多种模式和协议&#xff0c;用于实现不同类型的分布式事务。以下是一些常见的分布式事务模式以及一些其他常见的模式&#xf…

爬虫数据采集:探秘网络数据的捕获之道

随着互联网的发展&#xff0c;大量的数据被存储在各种网站和服务器上。为了获取这些数据&#xff0c;人们开发了一种称为爬虫的技术&#xff0c;它可以自动化地从网页上提取所需的信息。本文将介绍爬虫数据采集的原理。 网页结构分析&#xff1a;爬虫首先需要分析目标网页的结构…

华为云云耀云服务器L实例评测|使用redis事务和lua脚本

文章目录 云服务器的类型云服务优点redis一&#xff0c;关系型数据库&#xff08;sqlserver&#xff0c;mysql&#xff0c;oracle&#xff09;的事务隔离机制说明&#xff1a;redis事务机制 lualua脚本好处&#xff1a;一&#xff0c;怎么在redis中使用lua脚本二&#xff0c;脚…

vue中计算属性是否可以 异步获取?

众所周知一般来说&#xff0c;这个计算属性是同步计算获取得到&#xff0c;这个也是计算属性的初衷&#xff0c;但是你要是非要在里面 关联一些异步的东西也不是不可以哈。 面试的时候&#xff0c;会问到这个问题&#xff0c;计算属性能不能涉及一些异步的东西&#xff0c;也不…

【网络安全】「漏洞原理」(一)SQL 注入漏洞之概念介绍

前言 严正声明&#xff1a;本博文所讨论的技术仅用于研究学习&#xff0c;旨在增强读者的信息安全意识&#xff0c;提高信息安全防护技能&#xff0c;严禁用于非法活动。任何个人、团体、组织不得用于非法目的&#xff0c;违法犯罪必将受到法律的严厉制裁。 【点击此处即可获…

redis在linux系统的安装与使用

一、单机安装Redis。 1.安装redis依赖 在控制台输入 yum install -y gcc tcl2.上传安装包 下载好的安装包上传到/usr/local/src/ 上传方法&#xff1a; 1.确保你拥有Linux服务器的IP地址、用户名和密码。 2.在Windows上&#xff0c;打开命令提示符&#xff08;Command Promp…