JS 进阶 (六) 浏览器事件模型DOM操作(1)

简介: JS 中的 DOM 操作:盒子模型属性DOM: document object model 文档对象模型,提供系列的属性和方法,让我们能在 JS 中操作页面中的元素。获取元素的属性和方法

JS 中的 DOM 操作:盒子模型属性

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

获取元素的属性和方法

获取元素的方法
1、 document.getElementById([ID])
2、 [context].getElementsByTagName([TAG-NAME])
3、 [context].getElementsByClassName([CLASS-NAME]) // IE6-8 不兼容
4、 document.getElementsByName([NAME]) //=>在IE浏览器中只对表单元素的NAME有作用
5、 [content].querySelect([SELECTOR])
6、 [content].querySelectAll([SELECTOR])
获取元素的属性
document
document.documentElement
document.head
document.body
childNotes 获取所有子节点
children 所有元素子节点  IE6-8中会吧注释节点也获取到
parentNode
firstChild / firstElementChild
lastChild / lastElementChild
previousSibling / previousElementSibling 上一个哥哥节点
nextSibling / nextElementSibling
// 后面几个带element的都不知持IE6-8

DOM 的增删改操作

// 增
document.createElement([TAG-NAME])
document.createTextNode([TEXT CONTENT])
(模版)字符串拼接,基于innerHTML/innerText存到容器中
// 插入
[Parent].appendChild([NEW-ELEMENT])
[Parent].insertBefore([NEW-ELEMENT],[ELEMENT])
// 克隆
[Element].cloneNode([TRUE/FALSE])
// 删除
[Parent].removeChild([Element])
// 设置自定义属性
[ELEMENT].xxx = xxx; // 写到堆内存上了
delete [ELEMENT].xxx // 删除属性
console.log([ELEMENT].xxx)
[ELEMENT].setAttribute('xxx',xxx) // 写到结构上
console.log([ELEMENT].getAttribute('xxx'));
[ELEMENT].removeAttribute('xxx')

获取元素样式和操作样式

// 修改元素样式
// 修改行内样式
[ELEMENT].style.width = "12px"[ELEMENT].style.cssText = "width:12px;height:12px;"
// 获取元素样式 // 多个行内样式的写法
[ELEMENT].className = "className"[ELEMENT].classList.add[ELEMENT].style.xxx; 
// 设置样式类 // 新增的
let w = box.style.width; 
// 弊端只能获取当前元素写到行内上的样式,如果没有写到行内获取不到

JS 盒模型属性

基于一些属性和方法,让我们能够获取到当前元素的样式信息 【13 个】

如:

clientWidth: 可视区域的宽度(真实内容宽度),内容溢出无影响

clientTop: 距离可视区域的宽高

offsetWidth:获取他的父参照物(不一定是父元素)

offsetTop:距离他的父参照物的宽到

获取可视化宽度

属性

  • client
  • width/height (获取盒子内容的宽高+padding)
  • top/left (边框的大小)
  • offset
  • width/height clientWidth 的基础上几个边框。内容宽度+padding+border
  • top/left 距离他的父参照物的宽高
  • parent 父参照物,不脱离文档流是 body
  • scroll 唯一一组可设置的
  • width/height (在没有内容溢出的情况下和 client 一模一样, 溢出情况下,包含超出部分,可以通过这个获取真实的高度)
  • top/left (竖向|横向滚动条减去实际高度|宽度) 可设置滚动的距离 --- 可读写属性

方法:

获取样式:

getComputedStyle / currentStyle(低版本获取方法)

window.getComputedStyle([ELEMENT],[伪类]) [ELEMENT].currentStyle

  // 获取元素样式属性的方法
  function getCss(element, attr) {
    let value = window.getComputedStyle(element)[attr],
      reg = /^\d+(px|rem|em)?$/i;
    if (reg.test(value)) {
      value = parseFloat(value);
    }
    return value;
  } 
  // 结合闭包惰性函数求兼容性的style属性的写法
  function getCss(element,attr){
       if('getComputedStyle' in window){
          getCss = function(){
             return window.getComputedStyle(element)[attr]
          }
       }else{
          getCss = function(){
             return element.currentStyle[attr]
          }
       }
       return getCss(element,attr)
  }
  // 设置元素样式属性
  function setCss(element, attr, value) {
    if (attr === "opacity") {
      element['style']['opacity'] = value;
      element['style']['filter'] = `alpha(opacity=${value*100})`;
      return;
    }
    let reg = /^(width|height|margin|padding)?(top|left|bottom|right)?$/i;
    if (reg.test(attr)) {
      if (!isNaN(value)) {
        value += 'px';
      }
    }
    element['style'][attr] = value;
  }

经典面试题

水平垂直居中;
// 1. 定位 负margin
// 2. 定位 transform 水平位移
// 3. 定位absolute 设置四个方向都为0,margin:auto  兼容性不太好
// 4. 父元素设置 flex
// 5. JS计算 一屏幕的宽度减去盒子的宽度/2
let winW = document.documentElement.clientWidth || document.body.clientWidth;
box.style.left = (winW - 300) / 2 + "px";
box.style.top = (winH - 300) / 2 + "px";
/*
* offset: 获取当前元素距离BODY左/上便宜(不论父参照物是谁)
* @params  curEle:current element 当前操作的元素
* @return [object] 包含上/左偏移的信息
*/
function offset(curEle){
  let par = curEle.offsetParent,
      left = curEle.offsetLeft,
      top =  curEle.offsetTop,
      // 存在父参照物,而且还没有找到BODY
      while(par && par.tagName !=='BODY'){
         // 在原有偏移的基础上累加,父参照物的边框、父参照物的偏移
         if(!/MSIE 8\.0/).test(navigator.userAgent){
           // IE8中偏移自己算了边框,不需要加边框的值
               left += par.clientLeft;
               top += par.clientTop;
         }
         left += par.offsetLeft;
         top += par.offsetTop;
         // 继续获取上级参照物
         par = par.offsetParent;
      }
  return {top:top,left:left}
}

获取真正样式的方法 —— getComputedStyle(currentStyle)

getComputedStyle 获取所有经过计算机计算过的样式

  • 只要元素在页面中呈现出来,那么所有的样式都是经过浏览器计算的
  • 没见过和设置的样式都计算了
  • 在 IE6 ~ 8 不兼容,需要给予 currentStyle 来获取
// 第一个参数是操作的元素,第二个是伪类::befoure/::after
let styleObj = window.getComputedStyle([element], null);
//window.getComputedStyle(document.documentElement)
// IE6~8
let styleObj = [element].currentStyle;

HTML 盒模型

传统的盒模型

实际宽度和实际高度等于 内容宽度+padding+border, 想要固定宽度通常需要手动计算内部宽度值,很不方便

CSS3 新的盒子模型提供了一个盒子模型属性

box-sizing: content-box(传统盒子模型) | border-box;(新盒子模型)

设置了 border-box 后,盒子的宽度会始终保持在固定大小, 里面的 content 宽度会通过 padding 和 border 动态计算

flex 弹性盒子布局

多列布局

相关文章
|
3月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
2月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
2月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
72 5
|
2月前
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
3月前
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
|
3月前
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
69 6
|
3月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
XML DOM 浏览器差异
|
2月前
|
JavaScript 前端开发
深入理解Node.js中的异步编程模型
【10月更文挑战第39天】在Node.js的世界里,异步编程是核心所在,它如同自然界的水流,悄无声息却又无处不在。本文将带你探索Node.js中异步编程的概念、实践以及如何优雅地处理它,让你的代码像大自然的流水一样顺畅和高效。
|
3月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
103 4
|
3月前
|
Web App开发 JavaScript 前端开发
深入理解Node.js事件循环和异步编程模型
【10月更文挑战第9天】在JavaScript和Node.js中,事件循环和异步编程是实现高性能并发处理的基石。本文通过浅显易懂的语言和实际代码示例,带你一探究竟,了解事件循环的工作原理及其对Node.js异步编程的影响。从基础概念到实际应用,我们将一步步解锁Node.js背后的魔法,让你的后端开发技能更上一层楼!

热门文章

最新文章