JavaScript 学习笔记 —— BOM(二)

230 阅读7分钟

笔记内容为 JavaScript基础语法-dom-bom-js-es6新语法-jQuery-数据可视化echarts黑马pink老师前端入门基础视频教学 教学课程的整理

元素偏移量 offset 系列

offset 概述

  • offset 翻译过来就是偏移量,我们使用 offset 系列相关属性可以 动态的 得到该元素的位置(偏移)、大小等。
    • 获得元素距离带有定位父元素的位置
    • 获得元素自身的大小(宽度高度)
    • 注意:返回的数值都不带单位

offset 系列常用属性

offset 系列属性作用
element.offsetParent返回作为该元素带有定位的父级元素,如果父级都没有定位则返回 body
element.offsetTop返回元素 相对 带有定位父元素 上方 的偏移
element.offsetLeft返回元素 相对 带有定位父元素 左边框 的偏移
element.offsetWidth返回自身包括 padding、边框、内容区的宽度,返回数值不带单位
element.offsetHeight返回自身包括 padding、边框、内容区的高度,返回数值不带单位

offset 与 style 区别

  • offset
    • 可以得到任意样式表中的样式值
    • offset 系列获得的数值是没有单位
    • offsetWidth 包含 padding + border + width
    • offsetWidth 等属性是只读属性,只能获取不能赋值
    • 所以,我们想要获取元素大小位置,用 offset 更合适
  • style
    • 只能得到行内样式表中的样式值
    • style.width 获得的是带有单位的字符串
    • style.width 获得不包含 paddingborder 的值
    • style.width 是可读写属性,可以获取也可以赋值
    • 所以,我们想要给元素改值,用 style 更合适

元素可视区 client 系列

  • client 翻译过来就是客户端,我们使用 client 系列的相关属性来获取元素可视区的相关信息。通过 client 系列的相关属性可以动态的得到该元素的边框大小、元素大小等,
client 系列属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回自身包括 padding、内容区的宽度,不含边框,返回数值不带单位
element.clientHeight返回自身包括 padding、内容区的高度,不含边框,返回数值不带单位

image.png

flexible.js

立即执行函数

  • 立即执行函数,不需要调用,立马就能够自己执行的函数
  • 写法:第二个小括号可以看做是调用函数
    1. (function(){})()
    2. (function(){}())
  • 可以传参
(function(a, b) {
    console.log(a + b);
    var num = 10;
})(1, 2);

(function sum(a, b) {
    console.log(a + b);
    var num = 10;
})(2, 3);
  • 立即执行函数最大的作用就是 独立创建了一个作用域,里面所有的变量都是局部变量,不会有命名冲突的情况

flexible.js 源码解析截图

image.png

pageshow

  • 下面三种情况都会刷新页面都会触发 load 事件
    1. a 标签的超链接
    2. F5 或者刷新按钮(强制刷新)
    3. 前进后退按钮
  • 但是 火狐 中,有个特点,有个“往返缓存”,这个缓存中不仅保存着页面数据,还保存了 DOM 和 JavaScript 的状态,实际上是将整个页面都保存在了内存里
  • 所以此时后退按钮不能刷新页面
  • 此时可以使用 pageshow 事件来触发。这个事件在页面显示时触发,无论页面是否来自缓存。在重新加载页面中,pageshow 会在 load 事件触发后,根据事件中的 persisted 来判断是否是缓存中的页面触发的 pageshow 事件,注意这个事件给 window 添加

元素滚动 scroll 系列

  • scroll 翻译过来就是滚动的,我们使用 scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等
scroll 系列属性作用
element.scrollTop返回被卷去的上侧距离,返回数值不带单位
element.scrollLeft返回被卷去的左侧距离,返回数值不带单位
element.scrollWidth返回自身实际的宽度,不含边框,返回数值不带单位
element.scrollHeight返回自身实际的高度,不含边框,返回数值不带单位

image.png

页面被卷去的头部

  • 如果浏览器的高(或宽)度不足以显示整个页面时,会自动出现滚动条
  • 当滚动条向下滚动时,页面上面被隐藏掉的高度,我们就称为页面被卷去的头部
  • 滚动条在滚动时会触发 onscroll 事件
  • 页面被卷去的头部,可以通过 window.pageYOffset 获得,如果是被卷去的左侧则通过 window.pageXOffset 获得
  • 注意:元素被卷去的头部是 element.scrollTop,如果是页面被卷去的头部则是window.pageYOffset

三大系列总结

三大系列作用
element.offsetWidth返回自身包括 padding、边框、内容区的宽度,返回数值不带单位
element.clientWidth返回自身包括 padding、内容区的宽度,不含边框,返回数值不带单位
element.scrollWidth返回自身实际的宽度,不含边框,返回数值不带单位

image.png

主要用法

  • offset 系列经常用于获得元素的位置:offsetLeftoffsetTop
  • client 经常用于获取元素大小:clientWidthclientHeight
  • scroll 经常用于获取滚动距离:scrollTopscrollLeft
  • 注意页面滚动的距离通过 window.pageXOffset 获得

移动端特效

移动端(touch)触屏事件

  • 移动端浏览器兼容性较好,我们不需要考虑以前 JS 的兼容性问题,可以放心的使用原生 JS 书写效果,但是移动端也有自己独特的地方,比如 触屏事件touch(也称触摸事件),Android 和 IOS 都有
  • touch 对象代表一个触摸点,触摸点可能是一根手指,也可能是一根触摸笔
  • 触屏事件可响应用户手指(或触控笔)对屏幕或者触控板操作

常见的触屏事件

触屏 touch 事件说明
touchstart手指触摸到一个 DOM 元素时触发
touchmove手指在一个 DOM 上滑动时触发
touchend手指从一个 DOM 元素上移开时触发

触摸事件对象(TouchEvent)

  • TouchEvent 是一类描述手指在触摸平面(触摸屏、触摸板)的状态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等
触摸列表说明
touches正在触摸屏幕的所有手指的一个列表
targetTouches正在触摸当前 DOM 元素上的手指的一个列表
changedTouches手指状态发生了改变的列表,从无到有,从有到无变化

classList 属性

  • classList 属性是 HTML5 新增的一个属性,返回元素的类名。但是 ie10 以上版本才支持。
  • 该属性用于在元素中添加、移除以及切换 CSS 类,有以下方法:
  1. 添加类

    • element.classList.add('类名')
    focus.classList.add('current')
    
  2. 移除类

    • element.classList.remove('类名')
  3. 切换类

    • element.classList.toggle('类名')

click 延时解决方案

  • 移动端 click 事件会有 300ms 的延时,原因是移动端屏幕双击会缩放(double tap to zoom)页面

解决方案

  1. 禁用缩放
    • 浏览器禁用默认的双击缩放行为并且去掉 300ms 的点击延时
    <meta name="vuewport" content="user-scalable=no">
    
  2. 利用 touch 事件自己封装这个事件解决 300ms 延迟,原理如下:
    1. 当我们手指触摸屏幕,记录当前触摸事件
    2. 当我们手指离开屏幕,用离开的时间减去触摸的时间
    3. 如果时间小于 150ms,并且没有滑动过屏幕,那么我们就定义为点击

image.png 3. 使用插件 - fastclick 插件解决 300ms 延迟

本地存储

  • sessionStorage 和 localStorage | --- | sessionStorage | localStorage | | --- | --- | --- | | 容量 | 约 5M | 约 20M | | 生命周期 | 关闭浏览器窗口就清空 | 永久有效,除非手动删除,否则关闭页面也会存在 | | 共享 | 在同一个窗口(页面)下数据可以共享 | 可以多窗口(页面)共享(同一浏览器可以共享) | | 形式 | 键值对 | 键值对 | | 存储数据 | sessionStorage.setItem(key, value) | localStorage.setItem(key, value) | | 获取数据 | sessionStorage.getItem(key) | localStorage.getItem(key) | | 删除数据 | sessionStorage.removeItem(key) | localStorage.removeItem(key) | | 删除所有数据 | sessionStorage.clear() | localStorage.clear() |