JS盒子模型

1.操作DOM的属性和方法

1.1.获取元素或元素集合

getElementById

  • 上下文只是document(只有document这个实例的原型链上才能找到这个方法,其他实例都找不到)

  • ID重复了获取第一个

  • IE6~7中会把表单元素的name当做id使用

getElementsByTagName

  • 获取当前上下文中,所有子子孙孙中标签名叫做xxx的元素

getElementsByClassName

  • IE6~8中不兼容

getElmentsByName

  • 在IE浏览器中只对表单元素的name起作用

  • 上下文也只能是document

querySelector

querySelectorAll

  • 不兼容IE6~8

  • 没有DOM映射

document.documentElement

document.body

document.head

........

1.2.描述节点和节点之间的关系的属性

 nodeTypenodeNamenodeValue
元素节点1大写标签名null
文本节点3#text文本内容
注解节点8#comment注解内容
文档节点9#documentnull

childNodes:所有子节点

children:所有元素子节点(IE6~8中会把注解当做元素节点)

parentNode

previousSibling/previousElmentString

nextSibling

firstChild

lastChild

1.3.动态操作DOM

createElement

createDocumentFragment

appendChild

insertBefore

cloneNode(true/false)

removeChild

set/get/removeAttribute

2.JS盒子模型属性

在JS中通过相关的属性可以获取(设置)元素的样式信息,这些属性就是盒子模型属性(基本上都是有关于样式的)

Client系列:

  • clientTop

  • clientLeft

  • clientWidth

  • clientHeight

offset系列:

  • offsetTop

  • offsetLeft

  • offsetWidth

  • offsetHeight

  • offsetParent

scroll系列:

  • scrollTop

  • scrollLeft

  • scrollWidth

  • scrollHeight

2.1.client系列

clientWidth&clientHeight

内容区+padding

 //=>获取一屏幕(可视区)的宽高
 document.documentElement.clientWidth || document.body.clientWidth
 document.documentElement.clientHeight ||document.body.clientHeight

clientTop & clientLeft:

获取(上/左)边框的宽度

2.2.offset系列

offsetWidth & offsetHeight:内容区+padding+border

offsetParent:当前盒子的父级参照物

offsetTop & offsetLeft:获取当前盒子距离其父级参照物的偏移量(上偏移/左偏移),当前盒子的外边框开始到照物的内边框

参照物:同一个平面中,元素的父级参照物和结构没有必然联系,默认他们的父级参照物都是Body(当前平面最外层的盒子),body的父级参照物是null

2.3.scroll系列

scrollWidth & scrollHeight:

真实内容的宽高(不一定是自己设定的值,因为可能会存在内容溢出,有内容溢出的情况下,需要把溢出的内容计算在内)

在不同浏览器,或者是否设置overflow:hidden都会对最后的结果产生影响,所以这个值仅仅作参考,属于约等于的值

scrollTop & scrollLeft:滚动条卷去的宽度或者高度

最小卷去值:0

最大卷去值:document.documentElement.scrollHeight-document.documentElement.clientHeight

在JS盒子模型13个属性中,只有scrollTop、/scrollLeft是可读写属性,其余都是只读属性

 //=>获取当前页面的真是高度(包含溢出的部分)
 document.documentElement.scrollWidth || document.body.scrollWidth
 document.documentElement.scrollHeight||document.body.scrollHeight

2.4.特点

通过JS盒模型属性获取值得特点:

  • 获取的都是数字不带单位

  • 获取的都是整数,不会出现小数(一般都会四舍五入,尤其是获取的偏移量)

  • 获取的结果都是符合样式值(好几个元素的样式组合在一起的值),如果只想获取单一样式值(例如:padding),我们的盒子模型属性就操作不了了

2.5.获取元素具体的某个样式值

1.[元素].style.xxx:

只能获取所有写在元素行内上的样式

2.获取当前元素所有经过浏览器计算的样式:

经过计算的样式:只要当前元素可以在页面中呈现(或者浏览器渲染它了),那么它的样式都是被计算过的

  • window.getComputedStyle([元素],[伪类,一般都写null]):标准浏览器(IE9+)获取到当前元素所有被浏览器计算过的样式(对象)

  • [元素].currentStyle:IE6~8,获取经过计算的样式

案例:

封装一个获取,单个设置,多个设置样式属性

 let utils=(function(){
     let getCss=function(curEle,attr){
         if('getComputedStyle' in window){
             let val=window.getComputedStyle(curEle,null)[attr]
                 reg=/^-?\d+(\.\d+)?(px|rem|em|pt)?$/i
             reg.test(val) ? val=parseFloat(val) :null
             return val
         }
         return; 
     }
 ​
     let setCss=function(curEle,attr,value){
         if(attr==='opacity'){
             curEle.style.opacity=value
             curEle.style.filter=`alpha(opacity=${value * 100})`
             return
         }
 ​
         if(!isNaN(value)){
             let reg = /^(width|height|fontSize|((margin|padding)?(top|left|right|bottom)?))$/i;
             reg.test(attr) ? value += 'px' : null;
         }
         curEle['style'][attr] = value
     }
 ​
     let setGrounpCss=function(curEle,options={}){
         for (const key in options) {
           if (object.hasOwnProperty(key)) {
             setCss(curEle,key,options[key])
           }
         }
     }
         
     let css=function(...arg){
         let len=arg.length,
             fn=getCss;
         len>=3 ? fn=setCss : null
         len===2 && arg[1] instanceof Object ? fn=setGrounpCss : null
         return fn(...arg)
     }
 ​
     return {
         css
     }
 })()

For in循环:

遍历一个对象中的键值对,有多少组键值对,我们就遍历多少次;

for in 遍历的时候有自己的顺序:先遍历数字属性名(按照小->大),再遍历字符串属性名(按照书写顺序);

for in 循环遍历当前对象可枚举的属性(包括私有属性,以及自己在类的原型上设置)

 //=>先遍历数字属性
 let obj={name:'zhangsan',age:18,1:2,source:80,2:4}
 for(let key in obj){
     console.log(key);//=>1,2,name,age,source
 }
 //=>类的原型上的属性也会变遍历出来
 let obj={name:'zhangsan',age:18,1:2,source:80,2:4}
 Object.prototype.getName=function(){
 ​
 }
 for(let key in obj){
     console.log(key);//=>1,2,name,age,source,getName
 }
 ​
 //解决办法
 for (const key in obj) {
     //公有属性在最后遍历,这种可以屏蔽点公有属性
   if (!obj.hasOwnProperty(key)) break;
   console.log(key);  //=>1,2,name,age,source
 }

跑马灯:

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Document</title>
     <style>
         .container{
             width: 600px;
             height: 300px;
             border: 1px solid red;
             margin: 100px auto;
             overflow: hidden;
             position: relative;
         }
         .wrapper{
             height: 300px;
             width: 900px;
             position: absolute;
             left: 0;
             top: 0;
             margin: 0;
             padding: 0;
         }
         .wrapper li{
             height: 300px;
             width: 100px;
             text-align: center;
             line-height: 300px;
             list-style: none;
             float: left;
         }
         .wrapper li:nth-child(3n+1){
             background: red;
         }
         .wrapper li:nth-child(3n+2){
             background: green;
         }
         .wrapper li:nth-child(3n+3){
             background: blue;
         }
     </style>
 </head>
 <body>
     <div class="container">
         <ul class="wrapper">
             <li>1</li>
             <li>2</li>
             <li>3</li>
             <li>4</li>
             <li>5</li>
             <li>6</li>
             <li>7</li>
             <li>8</li>
             <li>9</li>
         </ul>
     </div>
     <script src="./utils.js"></script>
     <script>
         let wrapper=document.querySelector('.wrapper')
         wrapper.innerHTML+=wrapper.innerHTML
         utils.css(wrapper,'width',utils.css(wrapper, 'width') * 2)
         setInterval(()=>{
             utils.css(wrapper,'left',utils.css(wrapper,'left')-2)
             if(Math.abs(utils.css(wrapper,'left'))>=utils.css(wrapper,'width')/2){
                 utils.css(wrapper,'left',0)
             }
         },17)
     </script>
 </body>
 </html>

 

珠峰视频笔录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值