一、js 中的 dom 操作

dom:document object model 文档对象模型,提供系列的属性和方法,让我们能在 js 中操作页面中的元素

1. 获取元素的属性和方法

  1. document.getElementById([ID])
  2. [context].getElementsByTagName([TAG-NAME])
  3. [context].getElementsByClassName([CLASS-NAME])
  4. // 在 IE6~8 中不兼容
  5. document.getElementsByName([NAME])
  6. // 在 IE 浏览器中只对表单元素的 NAME 有作用
  7. [context].querySelector([SELECTOR])
  8. [context].querySelectorAll([SELECTOR])
  9. // 在 IE6~8 中不兼容
  10. //---------------------
  11. document
  12. document.documentElement
  13. document.head
  14. document.body
  15. childNodes // 所有子节点
  16. children // 所有元素子节点
  17. // IE6~8 中会把注释节点当做元素节点获取到
  18. parentNode
  19. firstChild / firstElementChild
  20. lastChild / lastElementChild
  21. previousSibling / previousElementSibling
  22. nextSibling / nextElementSibling
  23. // 所有带 Element 的,在 IE6~8 中不兼容

2. dom 的增删改操作

  1. document.createElement([TAG-NAME])
  2. document.createTextNode([TEXT CONTENT])
  3. 字符串拼接(模板字符串),基于 innerHTML / innerText 存放到容器中
  4. [PARENT].appendChild([NEW-ELEMENT])
  5. [PARENT].insertBefore([NEW-ELEMENT],[ELEMENT])
  6. [ELEMENT].cloneNode([TRUE/FALSE])
  7. [PARENT].removeChild([ELEMENT])
  8. // 设置自定义属性
  9. [ELEMENT].xxx = xxx;
  10. console.log([ELEMENT].xxx);
  11. delete [ELEMENT].xxx;
  12. [ELEMENT].setAttribute('xxx',xxx);
  13. console.log([ELEMENT].getAttribute('xxx'));
  14. [ELEMENT].removeAttribute('xxx');

3. 获取元素样式和操作样式

  1. // 修改元素样式
  2. [ELEMENT].style.xxx = xxx; // 修改和设置它的行内样式
  3. [ELEMENT].className = xxx; // 设置样式类
  4. // 获取元素的样式
  5. console.log([ELEMENT].style.xxx); // 获取的是当前元素写在行内上的样式,如果有这个样式,但是没有写在行内上,则获取不到

CSS盒子模型属性.png

二、js盒子模型属性

基于一些属性和方法,让我们能够获取到当前元素的样式信息,例如:clintWidth 、 offsetWidth 等 client

  • width / height
  • top / left

offset

  • width / height
  • top / left
  • parent

scroll

  • width / height
  • top / left

方法:window.getComputedStyle([element],[伪类]) / [element].currentStyle 获取当前元素所有经过浏览器计算过的样式

  • 只要元素在页面中呈现出来,那么所有的样式都是经过浏览器计算的,哪怕你没有设置和见过的样式也都计算了,不管你写或者不写,也不论写在哪儿,样式都在这,可以直接获取
  • 在 IE6~8 浏览器中不兼容,需要基于 currentStyle 来获取
  1. // 第一个参数是操作的元素 第二个参数是元素的伪类:after/:before
  2. // 获取的结果是 CSSStyleDeclaration 这个类的实例(对象),包含了当前元素所有的样式信息
  3. let styleObj = window.getComputedStyle([element],null);
  4. styleObj["backgroundColor"]
  5. styleObj.display
  6. // IE6~8
  7. styleObj = [element].currentStyle;

1. client

  1. let box = document.getElementById('box');
  2. // 获取盒子可视区域的宽高(内容宽度+左右PADDING)
  3. // 1.内容溢出与否对他无影响
  4. // 2.获取的结果是没有单位的(其余的盒模型属性也是)
  5. // 3.获取的结果是整数,它会自己进行四舍五入(其余的盒模型属性也是)
  6. box.clientWidth
  7. box.clientHeight
  8. // 获取当前页面一屏幕(可视化)区域的宽高
  9. let winW = document.documentElement.clientWidth || document.body.clientWidth;
  10. let winH = document.documentElement.clientHeight || document.body.clientHeight;
  11. // 获取盒子左边框和上边框的大小
  12. box.clientLeft
  13. box.clientTop

2. offset

  1. let box = document.getElementById('box');
  2. // 在CLIENT的基础上加上 BORDER == 盒子本身的宽高
  3. box.offsetWidth
  4. box.offsetHeight
  5. // 在没有内容溢出的情况下,获取的结果和 CLIENT 是一样的
  6. // 在有内容溢出的情况下,获取的结果约等于真实内容的宽高(上/左PADDING + 真实内容的高度/宽度)
  7. // 1.不同浏览器获取的结果不尽相同
  8. // 2.设置 overflow 属性值对最后的结果也会产生一定的影响
  9. box.scrollWidth
  10. box.scrollHeight
  11. // 获取整个页面真实的高度
  12. document.documentElement.scrollHeight || document.body.scrollHeight

3. scroll

  1. let box = document.getElementById('box');
  2. // 竖向滚动条卷去的高度
  3. // 横向滚动条卷去的宽度
  4. // 1.边界值
  5. // min = 0
  6. // max = 整个的高度 scrollHeight - 一屏幕高度 clientHeight
  7. box.scrollTop
  8. box.scrollLeft
  9. // 13个盒子模型属性,只有这两个是“可读写”的属性(既可以获取也可以设置对应的值),其余的都是“只读”属性(不能设置值,只能获取)
  10. box.scrollTop = 0;
  1. // offsetParent:获取它的父参照物(不一定是父元素)
  2. // 父参照物和它的父元素没有必然的联系,父参照物查找:同一个平面中,最外层元素是所有后代元素的父参照物,而基于 position:relative / absolute / fixed 可以让元素脱离文档流(一个新的平面),从而改变元素的父参照物
  3. document.body.offsetParent === null;
  4. // offsetTop:距离其父参照物的上偏移
  5. // offsetLeft:距离其父参照物的左偏移(当前元素的外边框到父参照物的里边框)

三、获取当前元素距body的左/上偏移值

  1. /*
  2. * offset:获取当前元素距离 BODY 的左/上偏移(不论其父参照物是谁)
  3. * @params
  4. * curEle:current element当前要操作的元素
  5. * @return
  6. * [object]包含上/左偏移的信息 => {top:xxx,left:xxx}
  7. */
  8. function offset(curEle) {
  9. let par = curEle.offsetParent,
  10. l = curEle.offsetLeft,
  11. t = curEle.offsetTop;
  12. // 存在父参照物,而且还没有找到 BODY
  13. while (par && par.tagName !== "BODY") {
  14. //在原有偏移的基础上累加:父参照物的边框、父参照物的偏移
  15. if (!/MSIE 8\.0/.test(navigator.userAgent)) {
  16. // IE8 中偏移值自已就算了边框了,不需要我们在加边框的值 navigator.userAgent 获取当前浏览器的版本信息
  17. l += par.clientLeft;
  18. t += par.clientTop;
  19. }
  20. l += par.offsetLeft;
  21. t += par.offsetTop;
  22. // 继续获取上级参照物
  23. par = par.offsetParent;
  24. }
  25. return {
  26. top: t,
  27. left: l
  28. };
  29. }

JS盒子模型属性.png