> 文档中心 > 【DOM】DOM操作之如何修改元素的样式_03

【DOM】DOM操作之如何修改元素的样式_03

目录

一. 修改: 3种

1. 元素内容: 3种

2. 元素属性: 3种

3. 元素样式:

    (1). 修改内联样式

    (2). 修改样式表中的样式

    (3). 示例: 修改元素的内联样式和样式表中的样式

    (4). 获取样式

    (5). 问题:使用内联样式修改多个css属性,会很繁琐

    (6). 解决: 通过修改class,批量修改一个元素的多个css属性。——划算

    (7). 示例: 带样式的表单验证

⬛总结: DOM 5件事: 增删改查+事件绑定:


【前文回顾】👉 DOM操作之如何修改元素的内容与属性_02


 

 

一. 修改: 3种

1. 元素内容: 3种

2. 元素属性: 3种

3. 元素样式:

    (1). 修改内联样式

         a. 元素.style.css属性名="属性值"           
         b. 相当于: 修改HTML中的style属性内的某个css属性的值

                 

         c. 问题: 有些css属性名是带-的,但是js中除了减法计算之外,不允许随便写-。会混淆

         d. 解决: DOM标准规定,所有带-的css属性名,一律去横线变驼峰:

                  比如: z-index  ->   zIndex

                           font-size  ->   fontSize

    (2). 修改样式表中的样式

         a. 强烈不建议直接修改样式表中的样式,因为样式表中的样式是共用的,一旦随意修改,会牵一发而动全身!

         b. 如果针对一个元素,确实想改变样式表中继承或层叠来的样式,应该也修改内联样式:

                  1). 因为内联样式优先级最高!可以覆盖样式表中的样式

                  2). 因为内联样式只影响当前一个元素,不会影响其他元素。

    (3). 示例: 修改元素的内联样式和样式表中的样式

         0_style.html

              Document          h1 { background-color: red;      }            

Welcome

var h1 = document.getElementById("h1"); //修改: //想修改字体颜色为白色 h1.style.color = "#fff"; //想修改背景样色为绿色 h1.style.backgroundColor = "green";

运行结果:
​​​​​​​

 

    (4). 获取样式

         a. 不好的做法: 使用.style获取样式。因为.style仅仅代表元素的内联样式,不包含继承和层叠来的样式表中的样式。而实际项目中,很少使用内联样式。结果.style几乎拿不到所有的样式!

         b. 好的做法: 今后只要获得css属性值,都要获得计算后的样式

               1). 什么是计算后的样式: 网页加载完成后,最终应用到一个元素身上的所有样式的集合。即包含内联,又包含所有样式表中的样式!

                  2). 如何: 2步:

                  i. 先获得包含所有计算后的样式的对象:

                  var style=getComputedStyle(元素对象)                  

◼️ 扩展:getComputedStyle() 方法
 

getComputedStyle() 方法用于获取指定元素的 CSS 样式。
获取的样式是元素在浏览器中最终渲染效果的样式。​​​​​​​

getComputedStyle()浏览器自带的全局函数

所以不用元素.调用:元素. getComputedStyle(),可直接使用getComputedStyle() 

                  ii. 从style中获取对应的css属性值

                  style.css属性

                  3). 坑: getComputedStyle()虽然可以获得完整的样式集合,但是其中的样式,一个也不允许修改!都是只读!

                  4). 原因: 计算后的样式来源不确定!所以,一旦擅自修改,很可能牵一发而动全身!所以,计算后的样式都是只读的。要想修改只能用.style通过修改内联样式来覆盖样式表中的样式。

         c. 示例: 获取元素的多个样式属性

         0_getComputedStyle.html

      Document      h1{      background-color:red    }    

Welcome

var h1=document.getElementById("h1"); //获取: //不好的做法: // //想获取h1的字体颜色属性: // console.log(h1.style.color);//内联 // //想获取h1的背景颜色属性: // console.log(h1.style.backgroundColor);//样式表 // //想获得h1的字体大小: // console.log(h1.style.fontSize);//默认样式表 //好的做法: var style=getComputedStyle(h1); console.log(style); //想获取h1的字体颜色属性: console.log(style.color); //想获取h1的背景颜色属性: console.log(style.backgroundColor); //想获得h1的字体大小: console.log(style.fontSize);//32px //想把h1的字体大小改为64px style.fontSize="64px";//报错: Failed to set the 'font-size' property on 'CSSStyleDeclaration': These styles are computed, and therefore the 'font-size' property is read-only. //不能修改计算后的属性中的font-size属性。因为这些样式是计算后的,所以是只读的。

运行结果:
 

 

     (5). 问题:使用内联样式修改多个css属性,会很繁琐

       实际开发中修改一个元素的样式,可能同时修改多个css属性。如果用.style一个属性一个属性 的修改,代码会很繁琐。

    (6). 解决: 通过修改class,批量修改一个元素的多个css属性。——划算

        a. 先在css中定义好不同场景下的样式类预案

        b. 再在js中只通过`元素.className="样式类名"`一句话就可批量更换元素的多个css属性值。      

    (7). 示例: 带样式的表单验证

         0_valiWithCss.html

          实现带样式的表单验证          table { width: 700px;      }      td:first-child { width: 60px;      }      td:nth-child(2) { width: 200px;      }      /*IE*/      td:first-child + td { width: 200px;      }      td span { color: red;      }      .vali_info { display: none;      }      .txt_focus { border-top: 2px solid black; border-left: 2px solid black;      }      .vali_success,      .vali_fail { background-repeat: no-repeat; background-position: left center; display: block;      }      /*如果验证文本框中的内容通过,则修改文本框旁边的div的class为vali_success,文本框旁边的div就变成了验证通过的样式!*/      .vali_success { background-image: url("../images/ok.png"); padding-left: 20px; width: 0px; height: 20px; overflow: hidden;      }      /*当验证文本框的内容没通过,则修改文本框旁边的div的class为vali_fail,就能让文本框旁边的div变成验证失败的样子*/      .vali_fail { background-image: url("../images/err.png"); border: 1px solid red; background-color: #ddd; color: Red; padding-left: 30px;      }                  

增加管理员

姓名: *
10个字符以内的字母、数字或下划线的组合
密码: *
6位数字
//DOM 4步 //1. 查找触发事件的元素 //本例中: 姓名文本框失去焦点时触发验证 var inputName = document.getElementsByName("username")[0]; //复习第一天查找元素 //2. 绑定事件处理函数 //当姓名文本框失去焦点时,自动执行 inputName.onblur = function () { //3. 查找要修改的元素 //本例中: 要修改当前文本框的爹的下一个兄弟的第一个孩子 var div = this.parentElement.nextElementSibling.children[0]; //4. 修改元素 //先定义验证姓名的正则表达式 var reg = /^\w{1,10}$/; //如果用正则表达式验证当前姓名文本框的内容通过 if (reg.test(this.value) == true) { //就修改div的class为验证通过的样式类名 div.className = "vali_success"; } else { //否则如果验证不通过 //就修改div的class为验证不通过的样式类名 div.className = "vali_fail"; } };

运行结果:
 

⬛总结: DOM 5件事: 增删改查+事件绑定:

1. 查找元素: 4种查找方式

2. 修改元素: 3种东西可修改

(1). 修改内容: 3种内容可修改:

a. 获取或修改元素的HTML内容:

  1). 元素.innerHTML

  2). 获取时: 返回原始HTML内容

  3). 修改时: 先将新内容交给浏览器编译,再显示给人看

b. 获取或修改元素的纯文本内容:

  1). 元素.textContent

  2). 获取时: 返回去掉内嵌标签,将特殊符号翻译为正文后的纯文本

  3). 修改时: 不会将新内容交给浏览器编译,而是原样显示给人看

c. 获取或修改表单元素的值:

  表单元素.value

(2). 修改属性: 3种

a. 字符串类型的HTML标准属性: 2种:

  1). 旧核心DOM: 4个函数

  i. 元素.getAttribute("属性名");

  ii. 元素.setAttribute("属性名", "属性值")

  iii. var bool=元素.hasAttribute("属性名")

  iv. 元素.removeAttribute("属性名")

  优点: 万能, 缺点: 繁琐

  2). 新HTML DOM:

  i. 元素.属性名

  ii. 元素.属性名="属性值"

  iii. 元素.属性名!==""

  iv. 元素.属性名=""

  优点: 简单, 缺点: 不万能

b. bool类型的HTML标准属性:

  1). 不能用旧核心DOM4个函数修改

  2). 只能用HTML DOM的"元素.属性名"方式获取或修改,且值为bool类型

c. 自定义扩展属性:

  1) HTML中:

  2). js中: 2种: (不能用.访问)

  i. 核心DOM:

  var 属性值=元素.getAttribute("data-自定义属性名")

  元素.setAttribute("data-自定义属性名","属性值")

  ii. HTML5标准:  元素.dataset.自定义属性名

(3). 修改样式:

a. 修改元素的内联样式:

  元素.style.css属性="属性值"

b. 获取元素的完整样式:

  var style=getComputedStyle(元素对象);

  style.css属性

  计算后的样式都是只读的

c. 批量修改元素的样式时,都用class:

  元素.className="class名"

如果这篇【文章】有帮助到你,希望可以给【青春木鱼】点个👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【前端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️青春木鱼❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

海量搞笑GIF动态图片