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.描述节点和节点之间的关系的属性
nodeType | nodeName | nodeValue | |
---|---|---|---|
元素节点 | 1 | 大写标签名 | null |
文本节点 | 3 | #text | 文本内容 |
注解节点 | 8 | #comment | 注解内容 |
文档节点 | 9 | #document | null |
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>
珠峰视频笔录