类的操作(className)

类的操作

通过style来修改属性,每次修改,浏览器都要重新渲染一次,多个属性修改,需要多次语句,我们可以通过类操作样式,统一修改。增删改查四个方法的封装。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>类的操作</title>
    <style>
        .b1 {
            width: 100px;
            height: 100px;
            background-color: red;
        }

        .b2 {
            width: 200px;
            /*height: 200px;*/
            background-color: yellow;
        }
    </style>
    <script>
        window.onload = function () {
            //获取box
            var box = document.getElementById("box");
            //获取btn01
            var btn01 = document.getElementById("btn01");
            //为btn01绑定单击响应函数
            btn01.onclick = function () {
                //修改box样式
                /**
                 * 通过style属性来修改元素样式,每修改一个样式,
                 * 就重新渲染一次页面,这样执行性能是很差的,
                 * 而且当我们需要修改很多样式时,要逐一去写,不太方便
                 */
                // box.style.width = "200px";
                // box.style.height = "200px";
                // box.style.backgroundColor = "yellow";
                /**
                 * 我们希望一行代码,可以同时修改多行样式
                 * 我们可以通过修改元素的class属性来简介修改样式
                 * 这样我们只需要修改一次,即可修改多个样式
                 * 浏览器只用重新渲染一次,性能比较高
                 * 并且这种方式,可以将表现和行为进一步分离
                 * html结构  css表现   javascript行为
                 */
                //box.className = "b2";
                /**
                 * 如果不行直接替换b1,需要保留b1中的部分属性
                 * b2用来顶替同名属性,就可以通过多个类名实现
                 * + = 但是需要注意,类名和类名之间有空格,后加类名前需要加一个空格
                 */
                box.className += " b2";//记得加一个空格
                alert(hasClass(box,"b2"));
                removeClass(box,"b1");
                toggleClass(box,"b2");
            };
            //这种操作很普遍,我们可以定义一个函数,用来向一个元素中添加指定class属性
            /**
             * 参数:
             *      1.obj:要添加class属性的对象
             *      2.cn: 要添加的class值
             */
            function addClass(obj,cn) {
                //检查obj中是否含有cn
                if (!hasClass(obj,cn)){
                    obj.className += " "+cn;
                }
            }

            /**
             * 每点依次就会添加一次,肯定不好,
             * 我们需要一个判断函数,来判断一个元素中是否有指定的class值
             * 参数和上边一样,如果有返回true ,没有返回false
             */
            function hasClass(obj,cn) {
                //判断obj中有没有cn class
                //创建一个正则表达式,\b单词边界,
               // var reg = /\bb2\b/ ;
                /**
                 * 变量名无法直接写入正则表达式,会被当成字母
                 * 故采用构造函数,将其转化为正则表达式
                 * 斜杠需要转义\\表示\
                 */
                var reg = new RegExp("\\b"+cn+"\\b");
                    return reg.test(obj.className);

            }

            /**
             * 增加有了,查找有了,现在肯定要有移除class函数
             * 删除一个元素中指定的class属性
             */
            function removeClass(obj,cn) {
                //创建一个正则表达式
                var reg = new RegExp("\\b"+cn+"\\b");
                //删除class ,就是将匹配到的字符串用空串替换
                obj.className = obj.className.replace(reg,"");
                
            }

            /**
             * toggleClass()方法
             *      增删改查,最后就是一个改的方法
             *      如果元素中具有该类就删除,
             *      如果元素中没有该类就删除
             *      
             */
            function toggleClass(obj,cn) {
                //判断obj中是否有cn
                if (hasClass(obj,cn)){
                    //有删除,
                    removeClass(obj,cn);
                } else {
                    //没有添加
                    addClass(obj,cn);
                }
                
            }
        }
    </script>
</head>
<body>
<button id="btn01">点击按钮修改box的样式</button>
<br>
<br>
<div id="box" class="b1"></div>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值