DOM操作

DOM操作

DOM(DOcument Object Model,文档对象模型)描绘了一个层次化的节点树,允许开发人员添加、移除和修改页面的某一部分,这使得Javascript操作HTML,不是在操作字符串,而是在操作节点,极大的降低了编程难度。

一、DOM树

1.1、DOM树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mhdl7dO0-1635344857988)(C:\Users\web\AppData\Roaming\Typora\typora-user-images\image-20210828154059101.png)]

1.2、DOM常用节点

元素节点1

属性节点2

文本节点3

注释节点8

document 文档节点9

DocumentFragment 文档判断节点 11

1.3、DOM节点属性

在文档对象模型(DOM)中,每一个节点都是一个对象

nodeName:元素节点的标签名,以大写字母的形式表示,只读不能修改

nodeValue:文本节点和注释节点的内容,可读可写

nodeType:节点的类型(最有用的),帮助我们区分节点,只读

attributes:元素节点的属性集合(只能修改属性值),name属性名,value属性值

二、获取DOM元素

2.1、查询DOM节点

document 获取document文档(这是一个对象)

document.head 获取head标签

document.body 获取body标签

document.documentElement 获取HTML标签

2.2、get系列

动态获取,每次使用会重新获取

document.getElementById() 通过id获取元素

element.getElementsByTagName() 通过标签名获取元素

document.getElementsByName 通过name属性获取(注意:只有部分标签可以用,通过name属性获取元素(表单、表单元素、img、iframe))

element.getElementsByClassName() 通过class类名获取

<body>
    <div id="one">你好。世界</div>
    <p>我好想在哪见过你</p>
    <div class="two">童话</div>
    <span>原宿酒店</span>
    <div>你好</div>
    姓名:<input type="text" name="user">
    <script>
      	//1. 通过id获取元素
        var odiv=document.getElementById('one');
        console.log(odiv); 

				//2. 通过标签名 TagName 获取元素  类数组(集合)数组可以有下标,开始是0,最后一项是length-1
        var ap=document.getElementsByTagName('p');
        console.log(ap);
				//这两个方法  所有浏览器全线兼容

				//3. 通过name获取   注意 name不能跟id重名
        var aIn=document.getElementsByName('user');
        console.log(aIn);

				//4. 通过class名获取
        var ad=document.getElementsByClassName('two');
        console.log(ad);
    </script>
</body>

2.3、query系列

静态获取,query系列的好用之处 是参数为css 选择器

element.querySelector() 选到指定选择器下的第一个元素

element.querySelectorAll() 选到指定选择器的所有元素

<body>
    <div id="one">你好。世界</div>
    <p>我好想在哪见过你</p>
    <div class="two">童话</div>
    <div class="two">童话</div>
    <span>原宿酒店</span>
    <div>你好</div>
    姓名:<input type="text" name="user">
    <script>
        //querySelector 获取的是单个元素
        var od=document.querySelector('div#one')
        console.log(od);

        //querySelectorAll  获取的是一个集合
        var ad=document.querySelectorAll('div.two');
        console.log(ad);
    </script>
</body>

2.4、连续打点调用get

先获取一个HTML标签,然后选择这个HTML标签中的所有p标签

<body>
    <div id="three">
        <p></p>
        <p></p>
    </div>
    <script>
        var ap=document.getElementById('three').getElementsByTagName('p');
        console.log(ap);
    </script>
</body>

如果是数组,一定要加上下标,才能变成对象

var ap=document.getElementsByTagName('p')[0];
        console.log(ap);

三、节点的操作

3.1、基于节点树的操作(兼容所有浏览器)

parentNode 父节点(最顶端的parentNode为#document)

childNodes 子节点们

firstChild 第一个子节点

lastChild 最后一个子节点

nextSibling 下一个兄弟节点

previousSibling 上一个兄弟节点

<body>
    <div>你好</div>
    <div id="box" >
        <p>1.你吃饭了没</p>
        <p>2.你吃饭了没</p>
        <p>3.你吃饭了没</p>
        <p>4.你吃饭了没</p>
        <div class="one"></div>
        <span >你饿了吗</span>
        <span class="one">你饿了吗</span>
    </div>
    <input type="text" name="user">

    <div id="dian">点我</div>
    <script>
        //1.body,body的父节点是html,html的父节点是documen,documen的父节点是null
        var parentNode=box.parentNode;
        console.log(parentNode.parentNode.parentNode.parentNode);  
        
        //2.childNodes :子节点们
        var childNodes=box.childNodes;
        console.log(childNodes);  //NodeList(15) [text, p, text, p, text, p, text, p, text, div.one, text, span, text, span.one, text]


        //3.firstChild:第一个子节点
        var firstChild=box.firstChild;
        console.log(firstChild);  //#text


        //4.lastChild:最后一个子节点
        var lastChild=box.lastChild;
        console.log(lastChild);  //#text


        //5.nextSibling:下一个兄弟节点
        //6.previousSibling :上一个兄弟节点
        var aP=document.getElementsByTagName('p')[1];
        console.log(aP);
        var nextSibling=aP.nextSibling;
        console.log(nextSibling);
        var previousSibling =aP.previousSibling ;
        console.log(previousSibling );
    </script>
</body>

3.2、基于元素节点树的操作(除了children,其他都不兼容IE9及以下)

parentElment 父元素节点

children 子元素节点们

firstElementChild 第一个子元素节点

lastElementChild 最后一个子元素节点

nextElementSibling 下一个兄弟元素节点

previousElementSibling 上一个兄弟元素节点

<body>
    <div>你好</div>
    <div id="box" >
        <p>1.你吃饭了没</p>
        <p>2.你吃饭了没</p>
        <p>3.你吃饭了没</p>
        <p>4.你吃饭了没</p>
        <div class="one"></div>
        <span >你饿了吗</span>
        <span class="one">你饿了吗</span>
    </div>
    <input type="text" name="user">

    <div id="dian">点我</div>
    <script>
        //1.parentElement:父元素节点
        var parentElement=box.parentElement;
        console.log(parentElement);


        //2.children:子元素节点们
        var children=box.children;
        console.log(children);  //HTMLCollection(7) [p, p, p, p, div.one, span, span.one]


        //3.firstElementChild:第一个子元素节点
        var firstElementChild=box.firstElementChild;
        console.log(firstElementChild);  // <p>1.你吃饭了没</p>


        //4.lastElementChild:最后一个子元素节点
        var lastElementChild=box.lastElementChild;
        console.log(lastElementChild);  //<span class="one">你饿了吗</span>


        //5.nextElementSibling:下一个兄弟元素节点
        var nextElementSibling=box.nextElementSibling;
        console.log(nextElementSibling);  //<input type="text" name="user">


        //6.previousElementChild: 上一个兄弟元素节点
        var previousElementSibling=box.previousElementSibling;
        console.log(previousElementSibling);  //<div>你好</div>
    </script>
</body>

3.3、增、创建DOM节点

document.createElement() 创建元素节点

document.createTextNode() 创建文本节点

document.createComment() 创建注释节点

document.createDocumentFragment 创建文档判断节点

  var createElement=document.createElement('p');
        console.log('createElement',createElement);

        var createTextNode=document.createTextNode('this is text');
        console.log('createTextNode',createTextNode);

        var createComment=document.createComment('this is 注释');
        console.log('createComment',createComment);
        
        var createDocumentFragment=document.createDocumentFragment;
        console.log('createDocumentFragment',createDocumentFragment);

<script>
        var body=document.body;
        var input=document.createElement('input');
        input.type='button';
        input.value='创建一个按钮';
        body.appendChild(input);
    </script>
    <script>
        var body=document.body;
        var input=document.createElement('input');
        // input.type='button';
        // input.value='创建一个按钮';
        input.setAttribute('type','submit');
        input.setAttribute('name','submit');
        input.setAttribute('value','提交');
        input.setAttribute('onclick','javascript:alert("this is a text");');
        body.appendChild(input);
    </script>

3.4、插、添加(剪切操作)

parentNode.appendChild(A) 在parentNode的最后面添加节点A

parentNode.insertBefore(A,B) 把节点A添加在节点B的前面

 <div id="text">
        <p id="x1">HTML</p>
        <p>JAVASCRIPT</p>
    </div>
    <script>
        //在指定节点的最后一个节点列表之后添加一个新的节点
        //appendChild(newnode)    
        //newnode:指定追加的节点
        var otext=document.getElementById('text');
        var newnode=document.createElement('p');  //创建元素节点p
        newnode.innerHTML="this is a new p";
        console.log(newnode);  
        otext.appendChild(newnode);
    </script>
   <div id="text">
        <p id="p1">HTML</p>
        <p>JAVASCRIPT</p>
    </div>
    <script>
        //insertBefore() 方法可在已有的子节点前插入一个新的节点
        //insertBefore(newnode,node)
        //newnode:指要插入的新节点   node:指定此节点前插入节点
        //在指定节点前插入节点
        var otext=document.getElementById('text');
        var node=document.getElementById('p1');
        var newnode=document.createElement('p');
        newnode.innerHTML="this is a new part";
        otext.insertBefore(newnode,node);  //在p1标签之前插入新的节点    node也可以换成otext.childNodes[0],子节点的第一个
    </script>

3.5、删:删除节点

parentNode.removeChild(A) 删除节点A,父节点删除子节点,这个方法返回被删除的节点,以备后悔再使用

child.remove() 删除节点树上的节点,节点之间删除字节,节点自己删除当前节点是没有返回值的

 <div id="div1">
        <h1>HTML</h1>
        <h2>MYSQL</h2>
    </div>
    <script>
        //removeChild()方法从子节点列表中删除某个节点,如删除成功,此方法可返回被删除的节点,如不成功,则返回NULL
   			//把删除的子节点赋值给removeChild,这个子节点不在DOM树中,但是还在内存中,如果要完全删除对象,给removeChild赋null值
        //nodeObject.removeChild(node)
        //node:必需,指定需要删除的节点
        // var oh=div1.getElementsByTagName('h1')[0];  //获取h1的元素
        // var oh=div1.children[0];  //获取h1的元素
        var oh=div1.childNodes[1];   //获取h1的元素
        var removeChild=div1.removeChild(oh);
        document.write(`删除的内容为:${removeChild.innerHTML}`);
    </script>
 <div id="div1">
        <h1>HTML</h1>
        <h2>MYSQL</h2>
    </div>
    <script>
        //removeChild()方法从子节点列表中删除某个节点,如删除成功,此方法可返回被删除的节点,如不成功,则返回NULL
        //nodeObject.removeChild(node)
        //node:必需,指定需要删除的节点
        // var oh=div1.getElementsByTagName('h1')[0];  //获取h1的元素
        // var oh=div1.children[0];  //获取h1的元素
        var oh=div1.childNodes[1];   //获取h1的元素
        oh.remove();
        document.write(`删除的内容为:${oh.innerHTML}`);
    </script>

3.6、替换(剪切操作)

parentNode.replaceChild(A,B) 用节点A代替节点B

<h1 id="oldnode">JAVA</h1>
    <a href="javascript:newnode()">Java替换JavaScript</a>
    <script>
        //replaceChild实现子节点(对象)的替换,返回被替换对象的引用
        //node.replaceChild(newnode,oldnode)
        //newnode:必需,用于替换oldnode的对象     oldnode:必需,被newnode替换的对象
        function newnode(){
            var newnode=document.createElement('h1');  //点击会生成h1标签
            // console.log(newnode);
            var newnodeText=document.createTextNode('javascript');  //点击会生成javascript文字
            // console.log(newnodeText);
            newnode.appendChild(newnodeText);  //将文本内容插入到h1标签
            console.log(newnode);
            var oldnode=document.getElementById('oldnode');
            console.log(oldnode);
            oldnode.parentNode.replaceChild(newnode,oldnode);  //用newnode代替oldnode  javascript代替java
        }
    </script>

3.7、判断一个元素节点有没有子节点方法

element.hasChildNodes() 如果有则返回true,没有则返回false

 var oEle=document.createElement('h1');
        console.log('createElement',oEle);
        var oText=document.createTextNode('你是否吃饭了');
        console.log('createTextNode',oText);
        // var ap=box.appendChild(oEle);
        // console.log('appendChild',ap);
        box.appendChild(oEle);
        box.appendChild(oText);
        box.insertBefore(oEle,oText)
        box.removeChild(oEle);

        var op2=document.getElementsByTagName('p')[1];
        var op1=document.getElementsByTagName('p')[0];
        console.log(op1);
        var res=box.removeChild(op);
        console.log(res);
        console.log(op);
        var res=op.remove();
        console.log(res);
        console.log(op);
        box.replaceChild(op1,op2);
        var res=box.hasChildNodes('p');
        console.log(res);

四、节点的一些属性和方法

4.1、元素节点常用的属性

1.innerHTML获取元素节点的内容,可读可写,如果内容中有符合HTML格式的,会被解析成标签

2.innerText获取元素节点的内容,可读可写,如果内容有符合html格式的,不会被解析成标签

innerText在赋值的时候要注意,会将标签覆盖掉

4.2、元素节点常用的方法

设置或获取标签属性

element.setAttribute(‘class’,‘on’) 设置元素节点的class属性

element.getAttribute(‘class’) 获取元素节点的class属性

element.removeAttribute(‘class’) 删除元素节点的class属性

五、更改HTML的属性

js可以更改HTML的任何属性,方法是两种:1.点语法。2.setAttribut()、getAttribute()

5.1、getAttribute(),setAttribute()

getAttribute(); 获取属性

setAttribute(); 设置属性

 <h1 id="alink" title="今天你吃饭了么" onclick="dianji()">点击我,获取标签的属性值</h1>
    <script>
        //通过元素节点的属性名称获取属性的值
        //elementNode.getAttribute(name)
        //elementNode:使用getElementById()、getElementsByTagName()等方法获取到的元素节点
        //name:要想查询的元素节点的属性名字(例如:id)
        function dianji(){
            var anode=document.getElementById('alink');
            var attr=alink.getAttribute("id");
            var attr2=alink.getAttribute("title");
            document.write(`h1标签的Id为:${attr}<br/>`);
            document.write(`h1标签的title为:${attr2}`);
        }
    </script>
 <h1 id="alink" title="今天你吃饭了么" onclick="dianji()">点击我,获取标签的属性值</h1>
    <script>
        //setAttribute()方法增加一个指定名称和值的新属性,或者把一个属性设定为指定的值
        //elementNode.setAttribute(name,value)
        //1.name:要设置的属性名    2.value:要设置的属性值
        //把指定的属性设置为指定的值,如果不存在具有指定名称的属性,该方法会创建一个新的属性
        function dianji(){
            var alink=document.getElementById("alink");
            alink.setAttribute('name','h1');
            alink.setAttribute('title','今天我没吃饭');
            console.log(alink);
        }
    </script>

5.2、点语法

得到一个元素之后,直接打点调用它的属性名,就能对HTML相应的属性进行更改,可以获取,也可以设置(class这个属性,要换成className,因为class是JS的保留字,如果想要换一个HTML元素的class属性,那么就要打点调用.className属性)

5.3、区别:

第一:所有自定义的属性,都不能通过点语法获取和设置

第二:所有的行内样式,点语法.style得到的是一个样式对象,我们可以通过.style.border继续得到小样式,但是getAttribute()得到的是字符串

六、H5新增元素节点的classList属性

classLast属性是一个类数组。其身上有几个常用的方法

1.add(value)将给定的参数字符串添加到元素的class属性中,如果存在就不添加了

2.remove(value)将给定的参数字符串从class属性中删除

3.contains(value)返回布尔值,表示class属性中是否包含参数字符串

4.toggle(value)检测class属性中是否有参数字符串,有则删除,返回false,没有则添加,返回true

七、H5新增了自定义属性,但是需要data-开头

八、脚本CSS

8.1、获取计算样式表、行内样式表

计算样式表一般用来获取的,行内样式表一般用来设置的

获取计算样式表:

1、只读,不可写

2、获取的值是计算后的绝对值。不是相对值

3、window.getComputedStyle(ele,null).attr 主流浏览器以及IE8以上

第一个参数为获取元素节点上的计算属性

第二个参数获取伪元素

4、ele.currentStyle IE8及其以下

例子:

getComputedStyle(ob).bagckgroundColor;

getComputedStyle(ob)[backgroundColor]

ob.currentStyle.backgroundColor

ob.currentStyle[backgroundColor]

行内样式表:元素节点.style获取的是行内样式表

1.一般用内联样式(行内样式)表来设置某些css属性

2、可读可写,可以通过行内样式间接控制css属性

3、含有连词符的css属性,需要使用小驼峰写法

4、float是js里面的保留字一般使用cssFloat

5、设置的值要求为字符串形式

//行内样式表的使用
<div id="box" style="width: 100px; height: 100px;"></div>
    <script>
        var ob=document.getElementById('box'); 
        // console.log('width为:'+ob.style.width);
        // console.log(`height为:${ob.style["height"]}`);
        ob.style.width='300px';   //通过对象来赋值设置css的属性
        ob.style.backgroundColor='blue';   //在css中有连接符的属性在js中使用对应的驼峰来转换
        ob.style.cssFloat='right';   //float是保留字,因此需要加css
        ob.className='da';   //如果想要换一个HTML元素的class属性,那么就要打点调用.className属性。
    </script>
//getComputedStyle和currentStyle的使用 
<style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 200px !important;  //用!important在嵌入式把css的权限提到最大
            height: 100px;
            background-color:pink;
        }
    </style>
//计算样式表内元素的权重越大就会计算出元素的指定样式
<div id="box" style="width: 100px;"></div>
    <script>
        var ob=document.getElementById('box');
        console.log(getComputedStyle(box).width);  //主浏览器以及IE8以上
        console.log(ob.currentStyle.width);   //IE8及其以下
    </script>
//getComputedStyle的第二个参数使用
<style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 200px !important;
            height: 100px;
            background-color:pink;
        }
        #box::after{
            content: "";
            display: block;
            width: 300px;
            height: 200px;
            background-color: lightblue;
        }
    </style>
      <div id="box" style="width: 100px;"></div>
    <script>
        var ob=document.getElementById('box');
        console.log(getComputedStyle(box,"after").width);  //主浏览器以及IE8以上
        console.log(ob.currentStyle.width);   //IE8及其以下
    </script>
//封装一个函数,让计算样式表的代码在谷歌和IE浏览器下都可以使用
<style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 200px !important;
            height: 100px;
            background-color:pink;
        }
        #box::after{
            content: "";
            display: block;
            width: 300px;
            height: 200px;
            background-color: lightblue;
        }
    </style>
     <div id="box" style="width: 100px;"></div>
    <script>
        var ob=document.getElementById('box');
        function getStyle(dom,attr){
            if(dom.currentStyle){
                return dom.currentStyle[attr];
            }else{
                return getComputedStyle(dom,null)[attr];
            }
        }
        console.log(getStyle(ob,'width'));

        var ob=document.getElementById('box');
        function getStyle(ele,attr){
            if(window.getComputedStyle){
                return getComputedStyle(ele)[attr];
            }else{
                return ele.currentStyle[attr];
            }
        }
        console.log(getStyle(ob,'width'));
    </script>

8.2、设置元素样式

如果设置样式通过行内style来设置元素样式,那么我们可以通过获取计算样式值,然后修改

8.3、快捷位置和尺寸

DOM的API,获取元素的显示尺寸(数字类型的值)

ele.offsetWidth width+左右padding+左右border

ele.offsetHeight height+上下padding+上下border

ele.offsetLeft 水平距离(常用)

ele.offsetTop 竖直距离(常用)

ele.clientWidth width+左右padding(常用)

ele.clientHeight height+上下padding(常用)

dom.clientLeft 上边框的width

dom.clientTop 左边框的width

8.3.1、offsetWidth和offsetHeight
   <div id="box"></div>
        <script>
            var ob=document.getElementById('box');
            console.log(ob.offsetHeight);  //width:100+上下padding:20+20+上下border:10==160
            console.log(ob.offsetWidth);   //width:200+左右padding:30+30+左右border:10==280
        </script>
8.3.2、offsetLeft属性和offsetTop

一个元素的offsetLeft值,就是这个元素左边框外,到自己的offsetParent对象的左边框内的距离每一个元素,天生都有一个属性,叫做offsetParent

offsetParent就是自己祖先元素中,距离自己最近的已经定位的元素,如果自己的祖先元素中,没有任何盒子进行了定位,那么offsetParent对象就是body

IE6、IE7:

情形1:如果自己没有定位属性,那么自己的offsetParent对象就是自己的祖先元素中离自己最近的有width或者有height的元素

情形2:自己如果有定位属性,那么自己的offsetParent就是自己的祖先元素中离自己最近的有定位的元素,数值就是自己的左外边框到offsetParent对象的左内边距的值

IE8:

无论自己是否定位,自己的offsetParent就是自己祖先元素中,离自己最近的已经定位的元素

<style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            position: absolute;
            left: 10px;
            top: 10px;
            width: 300px;
            height: 300px;
            margin-left: 20px;
            margin-top: 40px;
            background-color:pink;
        }
    </style>   
<div id="box">
             <div id="middle"></div>
         </div>
         <script>
             var ob=document.getElementById('box');
             //dom.offsetLeft:获取dom到定位父级的水平距离
             console.log(ob.offsetLeft);  //30  position:absolute;left:10+margin-left:20==30
             //dom.offsetTop:获取dom到定位父级的竖直距离
             console.log(ob.offsetTop);  //50  position:absolute;top:10+margun-top:40==50
         </script>
  <style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            position: absolute;
            left: 10px;
            top: 10px;
            width: 300px;
            height: 300px;
            background-color:pink;
        }
        #middle{
            position: absolute;
            left: 20px;
            top: 5px;
            width:200px;
            height: 200px;
            margin-left: 20px;
            background-color: green;
        }
    </style>
<div id="box">
            <div id="middle"></div>
        </div>
        <script>
            var ob=document.getElementById('box');
            //父元素是浏览器窗口
            console.log(ob.offsetLeft);
            console.log(ob.offsetTop);
            //水平距离是40=(position:absolute;left:20+margin-left:20=40)是按照子元素到父元素的水平位置来计算的
            var om=document.getElementById('middle');
            console.log(om.offsetLeft);
            //竖直距离是5=(position:absolute;top:5==5)
            console.log(om.offsetTop);
        </script>
8.3.3、clientWidth和clientHeight

clientWidth就是自己的width+padding的值,也就是说,比offWidth少了border,如果盒子没有高度,用文字撑的,IE6的clientHeight是0,其他浏览器都是数值

   <style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 200px !important;
            height: 100px;
            padding: 20px 30px;
            background-color:pink;
        }
    </style>
<div id="box"></div>
    <script>
        var ob=document.getElementById('box');
        console.log(getComputedStyle(ob).width); //200px 
        //但是这个元素在页面真实显示的是260px,用clientWidth获取真实的宽度,clientHeight获取真实的高度
        console.log(ob.clientWidth+'px');  //width:200+左右padding:30+30==260
        console.log(ob.clientHeight+'px'); //width:100+上下padding:20+20==140
    </script>
8.3.4、clientLeft和clientTop
 <style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            position: absolute;
            left: 10px;
            top: 10px;
            width: 300px;
            height: 300px;
            background-color:pink;
        }
        #middle{
            position: absolute;
            left: 30px;
            top: 30px;
            width:200px;
            height: 200px;
            border-top: 10px solid red;
            border-left: 15px solid red;
            background-color: green;
        }
    </style>
      <div id="box">
            <div id="middle"></div>
        </div>
        <script>
            var om=document.getElementById('middle');
            console.log(om.clientLeft);  //15  左边框的15
            console.log(om.clientTop);  //10   上边框的10
        </script>

8.4、获取元素的有定位属性的父级

ele.offsetParent 如果没有定位父节点,则返回body

  <style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            position: absolute;
            left: 10px;
            top: 10px;
            width: 300px;
            height: 300px;
            margin-left: 20px;
            margin-top: 40px;
            background-color:pink;
        }
    </style>
     <div id="box">
             <div id="middle"></div>
         </div>
         <script>
             var ob=document.getElementById('box');
             console.log(ob.offsetParent);
         </script>

九、获取元素的滚动值

9.1、获取滚动元素的宽高

当元素实际内容超过设置的内容时

dom.scrollWidth ====> 元素实际内容的width

dom.scrollHeight ====> 元素实际内容的height

当内容没有容器高、宽度的时候,scrollWidth和scrollHeight获取的是容器的高度和宽度

<style>
        *{
            margin: 0;
            padding: 0;
        }
        #box{
            width: 200px;
            height: 100px;
            background-color:pink;
        }
    </style>
<div id="box">
            yellowyellowyellowyellowyellowyellow
            yellowyellowyellowyellowyellowyellow
            yellowyellowyellowyellowyellowyellow
            yellowyellowyellowyellowyellowyellow
            yellowyellowyellowyellowyellowyellow
            yellowyellowyellowyellowyellowyellow
            yellowyellowyellowyellowyellowyellow
         </div>
         <script>
             var ob=document.getElementById('box');
             console.log(ob.scrollWidth);
             console.log(ob.scrollHeight);
         </script>

9.2、获取元素的滚动距离(数字类型的值)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvHvBRpe-1635344857997)(C:\Users\web\AppData\Roaming\Typora\typora-user-images\image-20210902082000446.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqWI80x4-1635344857999)(C:\Users\web\AppData\Roaming\Typora\typora-user-images\image-20210902082933145.png)]

dom.scrollLeft 滚动的水平距离

dom.scrollTop 滚动的竖直距离

9.3、滚动距离的兼容写法

1、获取滚动条的滚动距离IE8以上

window.pageXOffset 页面滚动的水平距离

window.pageYOffset 页面滚动的竖直距离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBWYw7oE-1635344858000)(C:\Users\web\AppData\Roaming\Typora\typora-user-images\image-20210902173255437.png)]

    <style>
        #box{
            width: 300px;
            height: 300px;
            border: 3px solid pink;
            margin: 10px auto;
            /* overflow-y: scroll; */
        }
    </style>
</head>
<body>
    <div id="box">
        <div>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
            <span>的结论是打飞机第三方士大夫水电费但是</span>
          </div>
    </div>
    <script>
        // var val=0;
        // setInterval(function(){
        //     val+=10;
        //     box.scrollTop=val;
        // },1000)
        
    </script>

2、获取滚动条的滚动距离IE8以下

document.documentElement.scrollLeft IE7,8

document.documentElement.scrollTop IE7,8

document.body.scrollLeft

document.body.scrollTop

十、获取浏览器窗口的尺寸

IE8以上

window.innerWidth 窗口的宽度(包含滚动条)

window.innerHeight 窗口的高度(包含滚动条)

IE8及其以下

document.documentElement.clientWidth 标准模式下

document.documentElement.clientHeight

(在Chrome,Firefox。IE7,8不包含滚动条,在IE8以上包含滚动条)

document.body.clientWidth 怪异模式下

document.body.clientWidth

十一、设置滚动条的滚动距离

浏览器页面滚动

window.scrollTo(x,y) 让滚动条滚动指定的位置

window.scrollBy(x,y) 让滚动条滚动到指定的距离

页面元素滚动

ele.scrollTo(x,y)

ele.scrollBy(x,y)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值