一、Bom的基本概述
1.1 Bom的概述
- Bom是浏览器对象模型,提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window。
- BOM由一系列相关的对象构成,并且每个对象都提供了许多方法与属性
- BOM缺乏标准,JS语法的标准化组织是ECMA,DOM标准化组织是W3C,BOM最初是Nerscape浏览器标准的一部分。
DOM | BOM |
---|
文档对象模型 | 浏览器对象模型 |
把文档当作一个对象来看待 | 把浏览器当作一个对象来看 |
顶级对象是document | 顶级对象是window |
主要学习的是操作页面元素 | 主要学习的是浏览器窗口交互的一些对象 |
是W3C标准规范 | 是浏览器厂商在各自浏览器上定义的,兼容性较差 |
1.2 Bom的构成

1.2.1 window对象
window对象的基本概念
window常见的事件
窗口加载事件
window.addEventListener('load', function() {
var btn = document.querySelector('button');
btn.addEventListener('click', function() {
alert('点击我');
})
})
window.addEventListener('load', function() {
alert(22);
})
document.addEventListener('DOMContentLoaded', function() {
alert(33);
})
调整窗口大小事件
window.addEventListener('load', function() {
var div = document.querySelector('div');
window.addEventListener('resize', function() {
console.log(window.innerWidth);
console.log('变化了');
if (window.innerWidth <= 800) {
div.style.display = 'none';
} else {
div.style.display = 'block';
}
})
})
定时器
- window.setTimeout(调用函数,[延迟的毫秒数]);也叫回调函数:该定时器在到期后执行调用函数,window可以省略,这个调用函数可以直接写函数,或者写函数名或者采取字符串 函数名() 三种形式 最后一种不推荐。延迟的毫秒数可以省略,默认为0,单位为毫秒。因为定时器可能有很多,所以我们经常给定时器赋值一个标识符。
function callback() {
console.log('爆炸了');
}
var timer1 = setTimeout(callback, 3000);
- 停止setTimeout()定时器:window.clearTimeout(timeoutID)
btn.addEventListener('click', function() {
clearTimeout(timer);
})
- window.setInterval(回调函数,[间隔毫秒数]);定时器
setInterval(function() {
console.log('继续输出');
}, 1000);
- 清除定时器:clearInterval( ){ }
stop.addEventListener('click', function() {
clearInterval(timer);
})
this指向问题
- 一般情况下this的最终指向的是那个调用它的对象
- 全局作用域或者普通函数中this指向全局对象window( 注意定时器里面的this指向window)
- 方法调用中谁调用this,this就指向谁
- 构造函数中this指向构造函数的实例
js执行队列
- JS是单线程:同一个时间只能够做一件事,所有的任务需要排队执行,前一个任务结束后才执行下一个任务。
- 同步和异步:HTML5中提出,允许JS脚本创建多个线程,于是js种出现了同步和异步。JS执行机制先执行执行栈中的同步任务,异步任务放入任务队列中,当执行栈中所有的同步任务执行完毕时,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈种执行。
由于主线程不断地重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环。
同步 | 异步 |
---|
程序的执行顺序与其排列顺序一致 | 程序执行顺序与排列顺序无关 |
同步任务都在主线程上执行,形成一个执行栈 | JS的异步任务是通过回调函数实现的,一般有三种类型:普通事件(click、resize)、资源加载(load、error)、定时器(setInterval、setTimeout) |
1.2.2 location对象
location对象的基本概念
- window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL,因为这个属性返回的是一个对象,所以我们将这个属性也成为location对象。
URL:统一资源定位符
- 格式:protocol://host[:port]/path/[?query]#fragment
- 概念:是互联网上标准资源的地址,每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
- 各部分组成的解析说明
组成 | 说明 |
---|
protocol | 通信协议 常用http,ftp,maito |
host | 主机(域名)www.itheima.com |
port | 端口号 可选 省略时使用方案的默认端口 如http的默认端口为80 |
path | 路径 由零或多个’/'符号分隔开的字符串,一般用来表示主机上的一个目录或文件地址 |
query | 参数 以键值对的形式 通过&符号分隔开 |
fragment | 片段 #后面内容常见于链接锚点 |
location对象的属性
属性 | 说明 |
---|
location.href | 获取或者设置整个url |
location.host | 返回主机域名 |
location.port | 返回端口号 |
location.pathname | 返回路径 |
location.search | 返回参数 |
location.hash | 返回片段 #后面内容 |
location对象的方法
location对象方法 | 返回值 |
---|
location.assign() | 跟href一样,可以跳转页面(也称为重定向页面) |
location.replace() | 替换当前页面,因为不记录历史,所以不能后退页面 |
location.reload() | 重新加载页面,相当于刷新按钮或者F5 如果参数为true强制刷新ctrl+F5 |
1.2.3 navigation对象
- 概念:navigator对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值
- 下面前端代码可以判断用户那个终端打开页面,实现跳转
if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowse|JUC|Fennec|WOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))){
window.location.href = "";
} else {
window.location.href= "";
}
1.2.4 history对象
- 概念:window对象给我们提供了一个history对象,与浏览器历史记录进行交互,该对象包括用户再浏览器窗口种访问过的URL。
2.常见对象方法及其作用
history对象方法 | 作用 |
---|
back() | 可以后退功能 |
forward() | 前进功能 |
go(参数) | 前进后退功能 参数为1前进一个页面,为-1后退一个页面 |
二、PC端网页特效
2.1 元素偏移量offset系列
2.1.1 offset基本概念和常用属性
- offset的概念:就是偏移量的意思,使用offset系列相关属性可以动态的得到元素的位置、大小等。获得的元素距离带有定位父元素的位置,获得元素自身大小,且返回值均不带单位。
- 常用属性
offset系列属性 | 作用 |
---|
element.offsetParent | 返回作为该元素带有定位的父级元素 如果父级元素都没有定位,则返回body |
element.offsetTop | 返回元素相对带有定位的父级元素上方的偏移 |
element.offsetLeft | 返回元素相对带有定位的父级元素左边框的偏移 |
element.offsetWidth | 返回自身包括padding、边框、内容区的宽度,返回数值不带单位 |
element.offsetHeight | 返回自身包括padding、边框、内容区的宽度,返回数值不带单位 |
2.1.2 offset和style区别
offset | style |
---|
可以得到任意样式表中的样式值 | 只能得到行内样式表中的样式值 |
offset系列获得的数值是没有单位的 | style.width获得的是带有单位的字符串 |
offsetWidth包含padding+border+width | style.width获得不包含padding和border的值 |
offsetWidth等属性是只读属性,不能赋值 | style.width是可读写属性,可以获取也可以赋值 |
想要获取元素大小位置时用offset更合适 | 想要给元素更改属性值时用style |
2.2 元素的可视区client系列
- 概念:client就是客户端的意思,使用client系列相关属性来获取元素的可视区的相关信息,通过client系列的相关属性可以动态的得到该元素的边框大小、元素大小等。
- 常用属性
client系列元素 | 作用 |
---|
element.clientTop | 返回元素上边框的大小 |
element.clientLeft | 返回元素左边框的大小 |
element.clientWidth | 返回自身包括padding、内容区的宽度,不含边框(border),返回数值不带单位 |
element.clientHeight | 返回自身包括padding、内容区的高度,不含边框(border),返回数值不带单位 |

扩展知识:立即执行函数
- 立即执行函数的作用:创建了一个独立的执行区域,避免了命名冲突问题
- 语法格式
function fn() {
}
fn();
(function(形参) {
})(实参)
(function(形参){
}(实参));
2.3 Scroll系列
2.3.1 scroll的常用属性
- scroll的概念:scroll就是滚动的意思,我们使用scroll系列的相关属性可以动态的得到该元素的大小、滚动距离等。
-
scroll系列属性 | 作用 |
---|
element.scrollTop | 返回被卷去的上侧距离,不带单位 |
element.scrollLeft | f返回被卷去的左侧距离,不带单位 |
element.scrollWidth | 返回自身实际宽度,不含边框,不带单位 |
element.scrollHeight | 返回自身实际高度,不含边框,不带单位 |

2.4 总结
2.4.1 三大系列的大小对比
三大系列大小对比 | 作用 |
---|
element.offsetWidth | 返回自身包括padding、边框、内容区的宽度,返回数值不带单位 |
element.clientWidth | 返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位 |
element.scrollWidth | 返回自身实际宽度,不含边框,返回数值不带单位 |
扩展知识:mouseenter和mouseover的区别
- 当鼠标移动到元素上时会触发mouseenter事件
- 类似mouseover但是它们之间有区别:mouseover鼠标经过自身盒子会触发,经过子盒子还会触发(事件冒泡),但是mouseenter只会经过自身盒子触发
- mouseleave搭配mouseenter使用,也不会有事件冒泡
动画函数的封装