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知识库 -> classList属性配合内置方法add()、remove()、toggle(),添加或删除某个类,以此改变CSS样式 -> 正文阅读

[JavaScript知识库]classList属性配合内置方法add()、remove()、toggle(),添加或删除某个类,以此改变CSS样式


改变某HTML元素样式,有多种方法,各有优缺。推荐方法二:通过添加或切换元素的类来改变其样式。

知识储备

1.正则表达式

双斜杠中,第一个为转义字符。

alert("\\b");

在这里插入图片描述

2.Syntax上需要注意的问题

 			box1.style.width = "200px";
            box1.style.backgroundColor = "#bfa"; 
  • 赋值时,右值有时要用引号圈起来;

  • 在CSS样式表和内联样式中,形如“background-color"、”border-width"等用-连接起来的样式属性名,在JavaScript中,词法规则变为驼峰,比如“backgroundColor"、“borderWidth”。否则回报语法错误(赋值中左值无效):在这里插入图片描述

  • 赋值所用到的数字后要跟单位px,并且数字连同px一起被圈在引号里。 否则会报语法错误:在这里插入图片描述

3.属于多个类的情况下,样式的覆盖情况

<div id="box1" class="b1 b2"> </div>

表示既属于类b1,又属于类b2。按照排列顺序,靠后的类的CSS样式,会覆盖掉相对靠前的类中与之重合的CSS样式,比如widthbackground-color;但是不同的样式不会被覆盖掉,比如下图中的height在这里插入图片描述

方法一:改变内联样式

  • 优点:
    • 不需要考虑兼容性;
    • 代码量少;
  • 缺点:
    • 每执行一句element.style.styleName = " ";,都会重新进行一次整个页面的渲染,在网络拥堵的情况下效果巨差,不符合异步更新策略。因此不推荐使用。
<style>
    .b1{
        width:100px;
        height:100px;
        background-color: coral;
    }
    .b2{
        width:200px;
        background-color:darkseagreen;
    }

</style>
<body>
    <div id = 'box1' class = 'b1'>      
    </div>
    <br>
    <button id="btn01">测试一下</button><br><br>
    <script >

        const btn01 = document.getElementById('btn01');
        const box1 = document.getElementById('box1');
        btn01.onclick = function(){
            box1.style.width = "200px";
            box1.style.backgroundColor = "#bfa";    
        };
  	</script >   
</body>  

方法二: classList属性配合add()remove()toggle(),添加或删除元素的类来改变其样式。

<style>
    .b1{
        width:100px;
        height:100px;
        background-color: coral;
    }
    .b2{
        width:200px;
        background-color:darkseagreen;
    }
    .b3{
        width:200px;
        border-radius: 2px;
        background-color:lightslategray;
    }
</style>
<body>
    <div id = 'box1' class = 'b1'>      
    </div>
    <br>
    <button id="btn01">add</button>&nbsp;&nbsp;
    <button id="btn02">remove</button>&nbsp;&nbsp;
    <button id="btn03">toggle</button>

    <script >

        const btn01 = document.getElementById('btn01');
        const btn02 = document.getElementById('btn02');
        const btn03 = document.getElementById('btn03');
        const box1 = document.getElementById('box1');
              
        //DOM2级的句柄事件,第三个参数表示是否useCapture,是否在捕获阶段触发事件。
        btn01.addEventListener("click", function(){
            box1.classList.add("b2");
        },false);
    
        btn02.addEventListener("click",function(){
            box1.classList.remove("b2");
        },false);

        btn03.addEventListener("click",function(){
            //toggleClass(box1, "b2");
            box1.classList.toggle("b3");
        },false);


   </script>
</body>

</html>

方法三:利用正则表达式、自定义addClass()、removeClass()、toggleClass()函数

首先说明一下,方法三为尚硅谷课程的笔记,课程比较老了,但是老师为大家提供了正则表达式在容错方面的巨大作用。方法二为JS内置函数,自然有容错机制,但是学习方法三也是非常必要的。实际开发中,建议使用方法二。

首先说明一下

<style>
    .b1{
        width:100px;
        height:100px;
        background-color: coral;
    }
    .b2{
        width:200px;
        background-color:darkseagreen;
    }

</style>
<body>
    <div id = 'box1' class = 'b1'>      
    </div>
    <br>
    <button id="btn01">add</button>&nbsp;&nbsp;
    <button id="btn02">remove</button>&nbsp;&nbsp;
    <button id="btn03">toggle</button>

    <script >

        const btn01 = document.getElementById('btn01');
        const btn02 = document.getElementById('btn02');
        const btn03 = document.getElementById('btn03');
        const box1 = document.getElementById('box1');
              
        //DOM2级的句柄事件,第三个参数表示是否useCapture,是否在捕获阶段触发事件。
        btn01.addEventListener("click", function(){
            addClass(box1, "b2");
        },false);
    
        btn02.addEventListener("click",function(){
            removeClass(box1, "b2");
        },false);

        btn03.addEventListener("click",function(){
            toggleClass(box1, "b2"); //自定义函数
        },false);


        function hasClass(obj,cn){
            //两个"\b"之间表示一个单词,boundary,两个\\中,前面一个为转义字符。
            var reg = new RegExp("\\b"+ cn + "\\b");
            //若有cn则返回true,没有则返回false
            return reg.test(obj.className);
        }
        function addClass(obj,cn){
            //当没有cn时,添加;否则什么都不用做。
                if(!hasClass(obj,cn)){
                    obj.className += " " + cn;
                }
        }
        function removeClass(obj, cn){
            if(hasClass(obj,cn)){
                var reg = new RegExp("\\b"+cn+"\\b"); 
                //使用空串替换掉reg,注意空串不等于空格
                obj.className = obj.className.replace(reg, "");
            }
        }

        function toggleClass(obj, cn){
        	//调用上述自定义函数
            if(hasClass(obj, cn)){
                //有,则删除
                remove(obj, cn);
            }else{
                //没有,则添加
                addClass(obj, cn);
            }
        }
   </script>
</body>

removeClass()这么写,在多次操作同一个类后会有空格遗留问题

		function removeClass(obj, cn){
            if(hasClass(obj,cn)){
                var reg = new RegExp("\\b"+cn+"\\b"); 
                obj.className = obj.className.replace(reg, "");
                //obj.classList.remove(cn);
            }
        }

上述方法会在add和remove同一个类多次之后,造成空格遗留问题。
在这里插入图片描述

CSS样式优先级

1.在不考虑继承的情况下,从上到下优先级递减:

  • 属性后插有 !important 的属性拥有最高优先级;,且不会被覆盖掉

    .b1{
        width:100px;
        height:100px;
        background-color: coral !important;
    }
    
  • 内联样式

    <!-- 在html中,赋值运算符的右边要被引号圈起来;而键值对的右边不能被引号圈起来 -->
    <div id = 'box1' style="background-color: cadetblue; width: 300px;"></div>
    
  • 样式表样式

    .b1{
        width:100px;
        height:100px;
        background-color: coral !important;
    }
    

2.单论样式的继承优先级,从上到下依次递减:

  • 直接样式
    <!-- 类名为 son 的 div 的 color 为 coral -->
    <div style="color: red">
        <div style="color: blue">
            <div class="son" style="color: coral"></div>
        </div>
    </div>
    
  • 最近的祖先样式
    <!-- 类名为 son 的 div 的 color 为 blue -->
    <div style="color: red">
        <div style="color: blue">
            <div class="son"></div>
        </div>
    </div>
    
  • 较远的祖先样式
    <!-- 类名为 son 的 div 的 color 为 red -->
    <div style="color: red">
        <div>
            <div class="son"></div>
        </div>
    </div>
    

关于CSS样式优先级更详细的讲解,详见菜鸟教程

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:08:57  更:2022-04-06 16:13:07 
 
开发: 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 2:50:14-

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