JS中通过类操作样式

什么是类操作样式?

        类操作样式简单来说就是在js里面不使用:对象.style.样式  的形式对样式进行更改,而是直接对对象class属性进行更改,通过将class更改为在css里面预设定好的样式,能一步到位的直接进行样式更换

        原理:

        类操作就是在js类名类名对元素的className进行增删

注意:类的更改不一定完全是对一个类名的替换,由于允许对一个元素的类设置多个,那么就也有对类的增删

对类操作的好处:

        相比于:对象.style.样式  这种方法在js里面对样式进行操作,通过更换class进行操作写的代码更少、更易于维护、耦合性更低(本质上来说js是用来设置页面里面的行为的,css才是用来操作样式的)

例如:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.style1{width: 100px;height: 50px;background-color: pink;border-radius:20px;transition: 0.3s;}.style2{width: 200px;height: 100px;border-radius: 40px;background-color: skyblue;transition: 0.3s;}</style>
</head>
<body><div class="style1" id="box"></div><script>var box=document.getElementById("box");box.addEventListener("mouseover",function(){/*box.style.width="200px";box.style.height="100px";box.style.backgroundColor="skyblue";*/box.className="style2";},false);box.addEventListener("mouseout",function(){/*box.style.width="100px";box.style.height="50px";box.style.backgroundColor="pink";*/box.className="style1";},false)</script>
</body>
</html>

        当需要对一个元素绑定一个事件,触发事件对该元素的样式进行更改时,如果更改的样式少些,那么style也可以使用,但稍多一点就会产生很多问题,

比如:1、下次更改时找半天也找不到要更改的样式;

           2、js代码显得杂乱(一堆style更改);

          3、更改时需要对很多部分进行更改,容易遗忘或改错;

而使用类进行更改时就简介很多,如果需要对元素的样式进行更改,只需要对类名进行增删就可以了。

类操作的几个方法:

        1、判断元素是否含有某个类

创建一个函数hasClass来判断一个元素是否含有某个类名

function hasClass(obj,cn){//注意://正则表达式简写形式貌似无法传一个变量,这里用构造器创建正则表达式var reg = new RegExp("\\b"+cn+"\\b");return reg.test(obj.className);
}

        使用正则表达式来进行判断,注意使用分隔符\b,防止style1和style11弄混

        2、向元素里面添加类

创建一个函数addClass来向一个元素里面添加某个类

function addClass(obj,cn){if(hasClass(obj,cn))return;     //如果元素里面有要添加的类,则不再添加else obj.className+=` ${cn}`;
}

添加类名前先判断该元素是否含有这个类

        3、删除元素类名的某个类

创建一个函数removeClass来删除一个元素里面某个类

function removeClass(obj,cn){var reg = new RegExp("\\b "+cn+"\\b");    //第一个\\b后面要添加一个空格,可以保证删除后空格也删除if(reg.test(obj.className)){obj.className=obj.className.replace(reg,"");}else return;
}

先通过正则表达式判断元素类名是否含有该类,再通过replace的正则表达式用法删除这个类

        replace的使用:

                replace是String的一个方法,用来将一段内容替换为另一段内容

                参数

                        1、要替换的内容,可以为正则表达式

                                如果为正则表达式,则默认只会替换第一个出现的,可以设置为g来去全部替换

                        2、替换的新内容

完整代码:

        

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.style1{width: 100px;height: 50px;background-color: pink;border-radius:20px;transition: 0.3s;}.style2{width: 200px;height: 100px;border-radius: 40px;background-color: skyblue;transition: 0.3s;}.style12{display: flex;align-items: center;justify-content: center;}</style>
</head>
<body><div class="style1 style12" id="box">1</div><button id="btn01">点击更换div样式</button><button id="btn02">点击恢复div样式</button><script>var box=document.getElementById("box");var btn01=document.getElementById("btn01");var btn02=document.getElementById("btn02");btn01.onclick=function(){addClass(box,"style2");}btn02.onclick=function(){removeClass(box,"style2");}function hasClass(obj,cn){//注意://正则表达式简写形式貌似无法传一个变量,这里用构造器创建正则表达式var reg = new RegExp("\\b"+cn+"\\b");return (reg.test(obj.className));}function addClass(obj,cn){if(hasClass(obj,cn))return;     //如果元素里面有要添加的类,则不再添加else obj.className+=` ${cn}`;}function removeClass(obj,cn){var reg = new RegExp("\\b "+cn+"\\b");if(reg.test(obj.className)){obj.className=obj.className.replace(reg,"");}else return;}</script>
</body>
</html>

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

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

相关文章

数据库基本建表操作

1.登录数据库并创建数据库db_ck 创建完成后使用到我们创建的数据库。 2.创建表t_hero 根据hero属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; 创建完…

标准卷积(Standard Convolution)

标准卷积的基础操作图解&#xff1a; 卷积之后尺寸公式&#xff1a; 输入尺寸&#xff1a;WH卷积核尺寸&#xff1a;Fw​Fh​填充大小&#xff1a;P步长&#xff1a;S 输出尺寸 WoutHout可以通过以下公式计算&#xff1a; 其中[x]表示向下取整。 实例&#xff1a; 输入图像…

初阶数据结构习题【14】(4栈和队列)——225. 用队列实现栈

1. 题目描述 力扣在线OJ——225. 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x …

使用NVM工具管理Node版本

Date: 2025.03.10 14:53:55 author: lijianzhan NVM&#xff08;Node Version Manager&#xff09;用于在同一个系统上管理多个 Node.js 版本,NVM 允许你安装、使用和切换不同的 Node.js 版本。这对于前端工作人员来说可以更方便的管理和维护不同nodejs版本的项目。 &#xff0…

vue使用slot时子组件的onUpdated执行问题

vue使用slot时子组件的onUpdated执行问题 在使用 Vue 的插槽 (slot) 功能时&#xff0c;可能会遇到一个问题&#xff1a;当父组件的任何状态更新时&#xff0c;子组件的 onUpdated 事件会被触发。这个问题在使用默认插槽时尤为明显。 为了避免这种情况&#xff0c;可以使用作用…

淘立方电商前端网站(HTML开发)源代码

一、页面展示 &#xff08;一&#xff09;欢迎界面 &#xff08;二&#xff09;首页 &#xff08;三&#xff09;登录界面 &#xff08;四&#xff09;女装界面 &#xff08;五&#xff09;女鞋界面 &#xff08;六&#xff09;商品详情页 &#xff08;七&#xff09;注册界面…

Flutter:StatelessWidget vs StatefulWidget 深度解析

目录 1. 引言 2. StatelessWidget&#xff08;无状态组件&#xff09; 2.1 定义与特点 2.2 代码示例 3. StatefulWidget&#xff08;有状态组件&#xff09; 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…

大模型是如何工作的

近几十年来&#xff0c;人工智能经历了从基础算法到生成式AI的深刻演变。生成式AI通过学习大量数据可以创造出全新的内容&#xff0c;如文本、图像、音频和视频&#xff0c;这极大地推动了AI技术的广泛应用。常见的应用场景包括智能问答&#xff08;如通义千问、GPT&#xff09…

SSL VXN

SSL VPN是采用SSL&#xff08;Security Socket Layer&#xff09;/TLS&#xff08;Transport Layer Security&#xff09;协议来实现远程接入的一种轻量级VPN技术,其基于B/S架构&#xff0c;免于安装客户端&#xff0c;相较与IPSEC有更高的灵活度和管理性&#xff0c;当隧道建立…

【C】链式二叉树算法题2

目录 1 另一棵树的子树 1&#xff09; 题目描述 示例1&#xff1a; 示例2&#xff1a; 2&#xff09; 算法解析 3&#xff09; 代码 2 二叉树的遍历 1&#xff09; 问题描述 2&#xff09; 算法解析 3&#xff09; 代码 3 总结 1 另一棵树的子树 leetcode链接…

【Java并发】【synchronized】适合初学者体质入门的synchronized

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…

STM32---FreeRTOS消息队列

一、简介 1、队列简介&#xff1a; 队列&#xff1a;是任务到任务&#xff0c;任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09;。 FreeRTOS基于队列&#xff0c;实现了多种功能&#xff0c;其中包括队列集、互斥信号量、计数型信号量、二值信号量…

目标检测Anchor-based 与 Anchor-free

一.二者对比 anchor-free和anchor-based是两种不同的目标检测方法&#xff0c;区别在于是否使用预定义的anchor框来匹配真实的目标框。 anchor-based方法使用不同大小和形状的anchor框来回归和分类目标&#xff0c;例如faster rcnn、retinanet和yolo等。anchor-free&#xff0…

Node.js与VUE安装

目录 Win下载安装 Mac下载安装 Win与Mac配置检查是否安装成功切换淘宝NPM库检查镜像配置是否生效设置 npm 全局环境目录&#xff08;避免权限问题&#xff09;WinMac VUE安装安装 Vue CLI验证 Vue CLI打开vue面板 Win 下载 直接从官网下载官网地址&#xff1a;https://nodejs…

LabVIEW基于双通道FFT共轭相乘的噪声抑制

对于双通道采集的含噪信号&#xff0c;通过FFT获取复数频谱后&#xff0c;对第二通道频谱取共轭并与第一通道频谱相乘&#xff0c;理论上可增强相关信号成分并抑制非相关噪声。此方法适用于通道间信号高度相关、噪声独立的场景&#xff08;如共模干扰抑制&#xff09;。以下为L…

c语言笔记 静态数据与ELF程序格式

数据段&#xff1a; 1.全局变量 2.常量.rodata段 3.已初始化的静态数据(全局变量).data段 4.未初始化的静态数据(static修饰的局部变量).bss段 为什么需要静态数据? 全局变量 可以在任何文件&#xff0c;函数中使用&#xff0c;数据操作上更加方便。static修饰的局部变量&a…

算法 之 树形dp 树的中心、重心

文章目录 重心实践题目小红的陡峭值 在树的算法中&#xff0c;求解树的中心和重心是一类十分重要的算法 求解树的重心 树的重心的定义&#xff1a;重心是树中的一个节点&#xff0c;如果将这个点删除后&#xff0c;剩余各个连通块中点数的最大值最小&#xff0c;那么这个节点…

Ubuntu切换lowlatency内核

文章目录 一. 前言二. 开发环境三. 具体操作 一. 前言 低延迟内核&#xff08;Lowlatency Kernel&#xff09; 旨在为需要低延迟响应的应用程序设计的内核版本。Linux-lowlatency特别适合音频处理、实时计算、游戏和其他需要及时响应的实时任务。其主要特点是优化了中断处理、调…

【Zinx】Day5-Part2:Zinx 的消息队列及多任务机制

目录 Day5-Part2&#xff1a;Zinx 的消息队列及多任务机制创建消息队列创建及启动 Worker 工作池在 Server 启动的同时对连接池进行初始化 Day5-Part2&#xff1a;Zinx 的消息队列及多任务机制 接下来我们需要给 ZInx 添加消息队列以及多任务 Worker 机制。可以通过限制 worke…

项目上传到Gitee过程

在gitee上新建一个仓库 点击“克隆/下载”获取仓库地址 电脑上要装好git 在电脑本地文件夹右键“Git Bash Here” 依次执行如下命令 git init git remote add origin https://gitee.com/qlexcel/stm32-simple.git git pull origin master git add . git commit -m ‘init’…