DOM(全)

DOM

元素也是对象

  • 在html中叫做标签,在js中叫做元素;JS中的元素都是对象数据类型的
  • style:操作的是元素的行内样式
  • ClassName:操作的是元素的class名
  • innerHTML:操作的是元素的内容(可以识别标签)
  • innerText:操作的是元素的内容(不可以识别标签)
        //1.要想操作谁,就要先获取谁;
        //1. document.getElementById
        //document:上下文本
        //get : 获取
        //Element: 元素
        //By :通过
        //Id :id名
        // let div1 = document.getElementById("box");
        // console.dir(div1);
        // div1.onclick=function(){
        //     //这里面代码不运行;当点击元素的时候,这个函数就会执行;
        //     //console.log(200);
        //     if(div1.style.background==="black"){
        //         div1.style.background="red"
        //     }else{
        //         div1.style.background = "black";
        //     }
        // console.log(div1.style.background);
		//{style:{background:"red"}}
        // }

JS中获取DOM的方法

JS中获取DOM的方法

JS节点(node)

JS节点(node)

获取DOM的className

• 元素.calssList:当前元素的class名列表
• 元素.calssList.add(‘class名’):增加指定的class名
• 元素.calssList.remove(‘class名’):移除指定的class名
• 元素.replaceChild(newnode,oldnode):replaceChild() 方法用新节点替换某个子节点。这个新节点可以是文档中某个已存在的节点,或者您也可创建新的节点。

获取DOM所有的元素

• let eles = document.getElementsByTagName("*");
• $("*"); // 获取所有的元素

DOM映射机制

  • DOM 映射: 页面中的元素(标签)和js中的获取的DOM元素(元素对象)是一一关联的,当操作或移动JS的元素对象时,页面的标签元素也会跟着发生改变;这就是DOM映射的机制;

Dom的回流和重绘

  • dom的回流:单页面的dom产生变化(增加,删除,改变位置,改变大小)都会引发dom的回流,所谓回流:就是把dom重新排列进行渲染,他会非常消耗性能

    • 创建一个文档碎片进行优化
    • 模板字符串进行优化
  • 重绘:当某一个dom元素的样式发生改变(比如改变dom的颜色),不会引起dom的回流,但是会重新绘制

      <div id="box"></div>
        <script>
            let box = document.getElementById('box');
            // console.time()
            // for (var i = 0; i < 10; i++) {
            //     var cur = document.createElement('li');
            //     cur.innerHTML = 111;
            //     box.appendChild(cur);
            // }
            // console.timeEnd()
    
            // console.time()
            //优化
            // 1.创建一个文档碎片
            let frg = document.createDocumentFragment(); // 创建一个文档碎片;//在js里装着的
            // 创建一个空容器,用来存储dom元素
            //console.log(frg)
            for (var i = 0; i < 10; i++) {
                var cur = document.createElement('li');
                cur.innerHTML = 111;
                frg.appendChild(cur)
            }
            console.log(frg)
            box.appendChild(frg); //添加节点,标签
            // console.timeEnd()
            let obj = {
                name: 'ls',
                age: 18,
                boyFriend: 'me'
            }
            
            //2.模板字符串
            let obj = {
                name: 'ls',
                age: 18,
                boyFriend: 'me'
            }
            let htmlStr = `
                <li>
                 <span>${obj.name}</span> 
                 <span>${obj.age}</span> 
                 <span>${obj.boyFriend}</span>   
                </li>
            `
            box.innerHTML = htmlStr;//操作字符串
            // box.innerText = htmlStr
        </script>
    

    回流(reflow)和重绘(repaint)

    • 回流

    当页面中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(也有人会把回流叫做是重布局或者重排)。每个页面至少需要一次回流,就是在页面第一次加载的时候。
    dispaly 属性会产生回流,而 opacity 和 visibility 属性不会产生回流。

    • 重绘

    当页面中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的时候,比如background-color。则称为重绘。

    dispaly 和 visibility 属性会产生重绘,而 opacity 属性不一定会产生重绘。

    元素提升为合成层后,transform 和 opacity 不会触发 repaint,如果不是合成层,则其依然会触发 repaint。
    在 Blink 和 WebKit 内核的浏览器中,对于应用了 transition 或者 animation 的 opacity 元素,浏览器会将渲染层提升为合成层。
    也可以使用 translateZ(0) 或者 translate3d(0,0,0) 来人为地强制性地创建一个合成层。

    • 查看重绘方法

    我们可以用 Chrome DevTools 的 Rendering 来看看,
    先打开 Rendering,把第一个选项勾选,这个选项会 高亮显示需要重绘的区域。

    • 回流必将引起重绘,而重绘不一定会引起回流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值