常年混迹于茶水间的前端攻城狮日常记录
节点关系
我们以下面 DOM 结构来讨论根据节点关系获取节点的属性
<div id="parent">
<div id="child1"></div>
<div id="child2"></div>
<div id="child3"></div>
</div>
父节点
// 获取的永远都是一个元素或者是 null
document.getElementById('child1').parentElement
// 获取的可能是元素、或文档节点、或文档碎片
document.getElementById('child1').parentNode
子节点
// 获取的一定是元素
document.getElementById('parent').children
// 可能获取除了元素以外的文本节点或文档碎片等
document.getElementById('parent').childNodes
⚠️ 注意:返回的数据结构是个类数组,要是需要使用数组的方法去处理,还是需要转成数组的
第一个子节点
// 获取的一定是元素
document.getElementById('parent').firstElementChild
// 获取的不一定是个啥
document.getElementById('parent').firstChild
最后一个子节点
// 获取的一定是元素
document.getElementById('parent').lastElementChild
// 获取的不一定是个啥
document.getElementById('parent').lastChild
兄弟节点
上一个兄弟节点
// 获取的一定是元素
document.getElementById('child2').previousElementSibling
// 获取的不一定是个啥
document.getElementById('child2').previousSibling
下一个兄弟节点
// 获取的一定是元素
document.getElementById('child2').nextElementSibling
// 获取的不一定是个啥
document.getElementById('child2').nextSibling
节点操作
parentDOM.appendChild(childDOM)追加子节点parentDOM.removeChild(childDOM)删除子节点parentDOM.replaceChild(newDOM, oldDOM)替换子节点parentDOM.insertBefore(newDOM, positionDOM)插入子节点。这里的positionDOM是指你要插在哪个子节点之前DOM.setAttribute(key, value)设置属性DOM.setAttribute(key)获取属性
元素尺寸
⚠️ 这里注意一点,如果用 JS 来获取元素的大小,除非行内样式写了 width 和 height,否则通过 element.style.width 和 element.style.height 获取的都是 ''
offsetWidth offsetHeight
它是一个只读属性,返回该元素的像素宽度和高度,包含内边距、边框以及滚动条(如果存在且渲染的话),但不包括伪元素。并且是个整数。

scrollWidth scrollHeight
它是一个只读属性,返回该元素内容高度,包括由于溢出导致视图中不可见的内容,也包括伪元素,但是不包括内边距、边框以及滚动条。

clientWidth clientHeight
它是一个只读属性,返回该元素的内容宽,包括内边距,但是不包括边框和滚动条。也是这个整数。

getBoundingClientRect()
把这个单独拿出来是因为太好用了。尤其是用来判断元素是否在视口内。
这个方法会返回一组用来描述尺寸位置的数据,除了 width 和 height 以外,其他的 left、top 什么的都是基于视口来做的。

其实常用的还有很多,这里只记录一些对于我来说常用,但是又不是那么常用的 DOM 操作。