Web APIs第三天
DOM节点操作 重绘与回流
1. DOM节点
- DOM节点: DOM树里每一个内容都称之为节点
1. 节点类型:
- 元素节点 • 所有的标签 比如 body、 div • html 是根节点
- 属性节点 • 所有的属性 比如 href
- 文本节点 • 所有的文本
- 重点记住元素节点, 可以更好的让我们理清标签元素之间的关系
1. 查找节点
1.查找父节点:
- parentNode 属性, 返回最近一级的父节点 找不到返回为null
1 | <div class="box"> |
- 关闭二维码案例:
1 | <div class="box"> |
- 关闭多个二维码案例
1 | <div class="box1"> |
2. 查找子节点
- childNodes: 获得所有子节点、包括文本节点(空格、换行)、注释节点等
- children[重点]: 仅获得所有元素节点, 返回的还是一个伪数组
1 | // 1. 查找子节点 children 伪元素 |
3. 兄弟关系查找
1. 下一个兄弟节点
- nextElementSibling 属性
1 | let num1 = document.querySelector('.btn') |
2. 上一个兄弟节点
- previousElementSibling 属性
1 | // 2 查找上一个节点 |
2. 增加节点
1. 创建节点
- 即创造出一个新的网页元素,再添加到网页内,一般先创建节点,然后插入节点
1 | let num2 = document.createElement('li') |
2. 追加节点
- 要想在界面看到, 还得插入到某个父元素中
1. 插入到父元素的最后一个子元素:
1 | let num1 = document.querySelector('ul') |
2. 插入到父元素中某个子元素的前面:
1 | num1.insertBefore(num2, num1.children[0]) |
3. 学成在线案例渲染
1 | let data = [ |
3. 克隆节点
- cloneNode会克隆出一个跟原标签一样的元素,括号内传入布尔值
- 若为true,则代表克隆时会包含后代节点一起克隆
- 若为false,则代表克隆时不包含后代节点, 默认为false
1 | let num1 = document.querySelector('ul') |
4. 删除节点
- 若一个节点在页面中已不需要时,可以删除它
- 在 JavaScript 原生DOM操作中,要删除元素必须通过父元素删除
- 如不存在父子关系则删除不成功
- 删除节点和隐藏节点(display:none) 有区别的: 隐藏节点还是存在的,但是删除,则从html中删除节点
1 | let num3 = document.querySelector('button') |
3. 时间对象
- 时间对象:用来表示时间的对象, 作用:可以得到当前系统时间
1. 实例化
- 在代码中发现了 new 关键字时,一般将这个操作称为实例化
- 创建一个时间对象并获取时间
1 | // 小括号为空 可获得当前时间 |
2. 时间对象方法
- 因为时间对象返回的数据我们不能直接使用,所以需要转换为实际开发中常用的格式
方法 | 作用 | 说明 |
---|---|---|
getFullYear() | 获得年份 | 获取四位年份 |
getMonth() | 获得月份 | 取值为0~11 |
getDate() | 获得月份中的每一天 | 不同月份取值也不同 |
getDay() | 获取星期 | 取值为0~6 |
getHours() | 获取小时 | 取值为0~23 |
getMinutes() | 获取分钟 | 取值为0~59 |
getSeconds() | 获取秒 | 取值为0~59 |
1 | // 年月日 |
页面显示时间:
1 | // 1. 显示时间案例 |
3. 时间戳
- 时间戳: 是指1970年1月1日0时0分0秒起至现在的毫秒数, 它是一种特殊的计量时间的方式
- 时间对象里面的方法转换实际所用
- 重点记住 +new Date() 因为可以返回当前时间戳或者指定的时间戳
1. 三种方式获取时间戳:
1 | // 无需实例化 |
2. 毕业倒计时效果
1 | fn() |
4. 重绘和回流
浏览器是如何进行界面渲染的:
- 解析(Parser)HTML,生成DOM树(DOM Tree)
- 同时解析(Parser) CSS,生成样式规则 (Style Rules)
- 根据DOM树和样式规则,生成渲染树(Render Tree)
- 进行布局 Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)
- 进行绘制 Painting(重绘): 根据计算和获取的信息进行整个页面的绘制
- Display: 展示在页面上
1. 回流(重排)
- 当 Render Tree 中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档的过 程称为 回流
2. 重绘
- 由于节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局时(比如:color、background-color、 outline等), 称为重绘
3. 重绘不一定引起回流, 而回流一定会引起重绘
4. 重绘和回流(重排) 会导致回流的操作:
- 页面的首次刷新
- 浏览器的窗口大小发生改变
- 元素的大小或位置发生改变
- 改变字体的大小
- 内容的变化(如:input框的输入,图片的大小)
- 激活css伪类(如::hover)
- 脚本操作DOM(添加或者删除可见的DOM元素)
- 简单理解影响到布局了,就会有回流
1 | let s = document.body.style |
5. 发布微博案例
1 | let data = [ |
本节单词:
- parentNode
- children
- nextElementSibling
- previousElementSibling
- createElement
- appendChild
- insertBefore
- cloneNode
- removeChild
- new Date
- getTime
- now
- FullYear
- Month
- Day
- Hours
- Minutes
- Seconds
- trim
- toLocaleString
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小城故事!
评论