获取时间差
1. 获取 时间节点A 到 格林威治的毫秒数
2. 获取 时间节点B 到 格林威治的毫秒数
3. 两个时间节点的毫秒数相减, 得到两个时间节点之间相差的毫秒数
因为相减的时候, 我不确定谁大谁小
所以我最好是随便减一个, 取绝对值
4. 通过相差的毫秒数换算出是 多少天多少小时多少分钟多少秒
4-1. 换算天数
总的秒数 / 一天的秒数 得到的就是 多少天(小数)
我们只需要整天数, 不够整天的按照小时算
Math.floor() 取整一下
4-2. 换算小时
总的秒数 % 一天的秒数 剩下的就是不够一天的秒数
用剩下的秒数 / 一小时的秒数 得到的就是 多少小时(小数)
我门只需要整小时数, 不够一个小时的按照分钟取计算
Math.floor() 取整一下
4-3. 换算分钟
总的秒数 % 一小时的秒数 剩下的就是不够一小时的秒数
用剩下的秒数 / 一分钟的秒数 得到的就是多少分钟(小数)
我们只需要整分钟数, 不够一分钟的按照秒钟计算
Math.floor() 取整一下
4-4. 换算秒钟
总的秒数 % 一分钟的秒数 剩下的就是不够一分钟的秒数
// 0. 准备两个时间节点
// 2020 年 5 月 22 号 16 点 50 分 32 秒
var time1 = new Date(‘2020-5-22 16:50:32’)
// 当前的时间节点
var time2 = new Date()
// 计算从现在到明天晚上下课还有多少时间
// 1. 获取 time1 的时间戳
var t1 = time1.getTime()
// 2. 获取 time2 的时间戳
var t2 = time2.getTime()
// 3. 获取两个毫秒数之间的差值(直接计算到秒)
var diff = Math.floor(Math.abs(t1 - t2) / 1000)
// 4. 通过 diff 换算
// 4-1. 换算天
var day = Math.floor( diff / (60 * 60 * 24) )
// 4-2. 换算小时
var hours = Math.floor( diff % (60 * 60 * 24) / (60 * 60) )
// 4-3. 换算分钟
var minutes = Math.floor( diff % (60 * 60) / 60 )
// 4-4. 换算秒钟
var seconds = diff % 60
console.log(day, hours, minutes, seconds)
封装一个计算时间差的函数
1. 准备一个函数, 接收两个参数, 就是两个时间节点
2. 计算两个时间节点之间相差的 天数 小时数 分钟数 秒数
我们计算时间差的思路
2-1. 计算出两个时间节点之间相差的秒数
3. 把计算结果返回
因为我要返回四个数据
我们的一个 return 只能返回一个数据
两种:
放到数组里面 [1, 6, 58, 56]
可以实现效果, 但是对于每一个数据没有指向性的说明
放到对象里面 { day: 1, hours: 6, minutes: 58, seconds: 56 }
可以实现效果, 并且对于每一个数据都有明确的指向性
// 1. 准备一个计算两个时间之间时间差的函数
function timeDiff(time1, time2) {
// 两个参数表示两个时间节点
// 2. 计算两个时间节点之间的差值(天, 小时, 分钟, 秒钟)
// 2-1. 计算两个时间节点之间相差的秒数
var diff = Math.floor(Math.abs(time1.getTime() - time2.getTime()) / 1000)
// 2-2. 通过 diff 换算两个时间节点之间相差的天, 小时, 分钟, 秒钟
var day = Math.floor( diff / (60 * 60 * 24) )
var hours = Math.floor( diff % (60 * 60 * 24) / (60 * 60) )
var minutes = Math.floor( diff % (60 * 60) / 60 )
var seconds = diff % 60
// 3. 返回一个对象, 里面包含所有信息
// 3-1. 创建一个对象
var obj = {}
// 3-2. 向对象里面添加成员
obj.day = day // 把 day 变量的值赋值给了 obj 的 day 成员
obj.hours = hours
obj.minutes = minutes
obj.seconds = seconds
// 3-3. 把这个对象返回
return obj
}
// 使用 timeDiff 函数计算两个时间节点之间的时间差
var time1 = new Date(‘2020-5-22 16:50:33’)
var time2 = new Date()
var res = timeDiff(time1, time2)
console.log(‘距离出去浪还有 ’ + res.day + ’ 天 ’ + res.hours + ’ 小时 ’ + res.minutes + ’ 分钟 ’ + res.seconds + ’ 秒!_’)
// 时间是没有样式的
// 当你把这个数字渲染到页面的 span 标签里面
// 给 spen 标签一个样式
BOM(Browser Object Model) 浏览器对象模型
就是一套操作浏览器的属性和方法
BOM 的核心就是 window(窗口)
我们所有和 BOM 相关的属性和方法都是 window.xxx
window.xxx 可以省略 window. 不写
window 就是 js 里面的全局
我一个页面里面所有的内容都包含在全局内
// 定义了一个全局变量 a 值是 100
var a = 100
console.log(window)
获取浏览器窗口尺寸
在 window 下有两个属性, 表示的是浏览器 可视窗口 的大小
1. window.innerWidth
获取的是浏览器可视窗口的宽度(包含滚动条位置)
2. window.innerHeight
获取的是浏览器可视窗口的高度(包含滚动条位置)
特别说明:
mac 的 safari 浏览器, 滚动条是隐形的
innerWidth 和 innerHeight 就是不包含滚动条的尺寸
console.log(‘浏览器的可视窗口宽度 : ’ + window.innerWidth)
console.log(‘浏览器的可视窗口高度 : ’ + window.innerHeight)
浏览器的弹出层
1. window.alert() 提示框
弹出一个提示框, 只有一个确定按钮
没有返回值
小括号里面就是提示用户的文本内容
2. window.confirm() 询问框
弹出一个询问框, 有确定和取消两个按钮
返回值是一个 布尔值
如果用户点击的是确定, 返回的是 true
如果用户点击的是取消, 返回的是 false
3. window.prompt() 输入框
弹出一个输入框, 有确定和取消两个按钮, 还有一个输入的文本框
返回值: 用户输入的内容
如果用户点击取消, 那么返回 null
如果用户点击确定, 那么返回的就是文本框里面的内容
如果写了内容, 就是写的内容
如果没写内容, 就是空字符串(’’)
三个弹出层的共同特点
当他们弹出来以后, 后面的所有 js 代码都先暂停
知道用户操作为止
会打断代码的继续执行
// 1. 提示框
var res = window.alert(‘hello world’)
console.log(res)
// 2. 询问框
// var res = window.confirm(‘你是不是爱我!’)
// console.log(res)
// 3. 输入框
// var res = window.prompt(‘请输入一段文本’)
// console.log(res)
console.log(‘后续代码’)
浏览器的地址信息
再 window 下有一个成员叫做 location
是一个对象, 里面保存着一些地址栏相关的属性和方法
1. window.location.href 属性
是一个读写的属性
读: 获取当前页面的地址栏信息(中文会默认以编码的形式显示)
写: 设置当前页面的地址栏, 也就是跳转页面(本页面跳转)
window.location.href = ‘你要跳转的地址’
2. window.location.reload() 方法
是一个方法
作用: 重新加载当前页面(刷新)
语法: window.location.reload()
这个代码一旦执行, 就会刷新当前页面
注意: 这个代码千万不能写在一个打开页面就能执行的位置
可以把他写在事件里面, 在你需要的时候执行
// 1. 获取当前地址栏的信息
// var href = window.location.href
// // file:///E:/NZ-2006/DAY09/03_%E4%BB%A3%E7%A0%81/06_%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E5%9C%B0%E5%9D%80%E4%BF%A1%E6%81%AF.html
// console.log('当前地址 : ’ + href)
// 2. 设置当前地址栏地址
// 下面代码一旦执行, 就会跳转到百度首页
// 为了方便看到效果, 加再点击事件里面
// window.location.href = ‘https://www.baidu.com’
// 当我点击 button 按钮的时候会跳转到百度首页
// btn.onclick = handler
// function handler() {
// window.location.href = ‘https://www.baidu.com’
// }
// reload()
// 打开页面就会执行这段代码, 就会重新加载页面
// window.location.reload()
// 把重新加载这个事情放在一个事件里面
// 每次点击按钮的时候就会重新加载页面
btn2.onclick = function () {
window.location.reload()
}
浏览器的历史记录
再 window 下有一个成员叫做 history
里面记录了操作历史记录的属性和方法
1. window.history.back()
返回上一层历史记录
前提: 你要从某一个页面跳转过来
等价于我们浏览器上面的回退按钮
2. window.history.forward()
前进到下一层历史记录
前提: 你要从某一个页面回退回来才有
等价于我们浏览器上面的前进按钮
3. window.history.go()
可以前进, 可以后退, 可以刷新
需要一个参数, 是一个数字
window.history.go(数字)
正整数: 前进
零: 刷新当前页面
负整数: 后退
// 依托再事件里面执行 go(0)
btn.onclick = function () {
// 刷新当前页面
window.history.go(0)
}
浏览器的版本信息(了解)
再 window 下有一个成员叫做 navigator
他里面保存的都是浏览器的版本以及型号的相关信息
1. window.navigator.userAgent 属性
保存的是浏览器的型号及版本信息
2. window.navigator.appVersion 属性
保存的是浏览器的版本信息
3. window.navigator.appName 属性
所有的浏览器都是统一的名称(IE低版本除外)
保存的是 Netscape 这个名字(网景)
4. window.navigator.platform 属性
保存的是该浏览器安装的操作系统
// 1. userAgent
var userAgent = window.navigator.userAgent
console.log(userAgent)
// 2. appVersion
var version = window.navigator.appVersion
console.log(version)
// 3. appName
var name = window.navigator.appName
console.log(name)
// 4. platform
var platform = window.navigator.platform
console.log(platform)
开启一个新的标签页
关闭当前标签页
浏览器标签页操作
开启一个新的标签页, 关闭当前标签页
1. window.open()
作用: 再当前浏览器开启一个新的标签页
语法: window.open(你要再新标签页显示的地址)
2. window.close()
作用: 关闭当前标签页
语法: window.close()
// open()
btn.onclick = function () {
window.open(‘https://www.baidu.com’)
}
// close()
btn2.onclick = function () {
window.close()
}
浏览器的常见事件
由浏览器的行为来触发的事件
1. window.onload 事件
会在浏览器所有资源加载完毕后触发
所有资源(标签, css, js, 图片, 视频, 音频, …)
2. window.onresize 事件
会在浏览器窗口尺寸改变的时候触发
3. window.onscroll 事件
会在浏览器的滚动条滚动的时候触发
// 这个函数会在当前页面所有资源加载完毕后触发
// window.onload = function () {
// // 当这里的代码执行的时候, 页面所有的资源加载完毕了
// console.log(‘所有资源加载完毕’)
// }
// 这个函数会在当前页面窗口尺寸改变的时候触发
// window.onresize = function () {
// // 当这里的代码执行的时候, 浏览器窗口尺寸一定改变了
// // 改变多少不一定, 只要变就触发
// // console.log(‘窗口尺寸改变了’)
// // 随着窗口尺寸的改变, 每次获取当前的窗口尺寸, 打印再控制台
// console.log('浏览器的可视窗口宽度 : ’ + window.innerWidth)
// console.log('浏览器的可视窗口高度 : ’ + window.innerHeight)
// }
// 这个函数会在当前页面的滚动条滚动的时候触发
window.onscroll = function () {
// 当这里的代码执行的时候, 表示浏览器的滚动条移动了
// 方向不管, 滚动多少也不管, 只要动就触发
console.log(‘滚动条滚动了’)
}
浏览器卷去的尺寸
document: 文档
documentElement: 表示的时 html 标签
body: 表示的时 body 标签
scroll: 滚动
top: 上
浏览器卷去的高度
1. document.documentElement.scrollTop 属性
=> 文档 的 html 元素 的 上方滚动距离
=> 有 DOCTYPE 标签的时候能拿到值
2. document.body.scrollTop 属性
=> 文档 的 body 元素 的 上方滚动距离
=> 没有 DOCTYPE 标签的时候能拿到值
有一个兼容写法
document.documentElement.scrollTop || document.body.scrollTop
浏览器卷去的宽度
1. document.documentElement.scrollLeft 属性
=> 有 DOCTYPE 标签的时候能拿到值
2. document.body.scrollLeft 属性
=> 没有 DOCTYPE 标签的时候能拿到值
有一个兼容的写法
document.documentElement.scrollLeft || document.body.scrollLeft
// 浏览器卷去的宽度
// 再浏览器滚动的事件里面获取
window.onscroll = function () {
// 有 DOCTYPE 标签的时候使用这个
// var leftD = document.documentElement.scrollLeft
// console.log(leftD)
// 没有 DOCTYPE 标签的时候使用这个
// var leftD = document.body.scrollLeft
// console.log(leftD)
// 兼容写法
// if (document.documentElement.scrollLeft) {
// var leftD = document.documentElement.scrollLeft
// } else {
// var leftD = document.body.scrollLeft
// }
var leftD = document.documentElement.scrollLeft || document.body.scrollLeft
console.log(leftD)
}
// 浏览器卷去的高度
// 不再页面打开就能执行的位置书写
// 因为只能执行一回
// var topD = document.documentElement.scrollTop
// console.log(topD)
// 需要再浏览器滚动事件里面执行
// 随着浏览器的滚动, 随时获取卷去的高度
// window.onscroll = function () {
// // 由 DOCTYPE 标签的时候, 使用这个
// // var topD = document.documentElement.scrollTop
// // console.log(topD)
// // 没有 DOCTYPE 标签的时候, 使用这个
// // var topD = document.body.scrollTop
// // console.log(topD)
// // 兼容的写法
// var topD = document.documentElement.scrollTop || document.body.scrollTop
// console.log(topD)
// }
* {
margin: 0;
padding: 0;
}
body {
width: 2000px;
height: 2000px;
}
div {
width: 100%;
height: 80px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
background-color: skyblue;
font-size: 40px;
position: fixed;
top: -80px;
left: 0;
transition: top .5s linear;
}
小案例 - 顶部通栏显示隐藏
思路:
有一个 div 盒子
1. 给浏览器绑定一个滚动事件
我们要在滚动事件里面去获取卷去的高度
2. 随时获取卷去的高度
3. 判断卷去的高度(你自己定义个数字, 暂定 300)
卷去的高度超过 300, div 显示, display: flex;
卷去的高度不到 300, div 隐藏, display: none;
技术问题: 怎么操作元素的样式
元素.style.display = ‘none’ 就是把元素的 display 样式设置为 none
元素.style.display = ‘flex’ 就是把元素的 display 样式设置为 flex
// 1. 给浏览器绑定一个滚动事件
// 函数会随着浏览器的滚动而触发
window.onscroll = function () {
// 2. 获取卷去的高度
var topD = document.documentElement.scrollTop || document.body.scrollTop
console.log(topD)
// 3. 判断 topD 是不是大于 300
if (topD > 300) {
// div 该显示了
topNav.style.top = ‘0’
} else {
// div 该隐藏了
topNav.style.top = ‘-80px’
}
}