Day21:三大系列总结

133 阅读6分钟

元素的偏移值

作用

动态获取元素的位置和大小

属性

offsetTop

offsetLeft

offsetWidth

offsetHeight

offsetParent

和style的区别

offset

可以得到任意样式中的样式值

得到的数值没有单位

offsetWidth宽度包含边框和内边距

offsetWidth是一个只读属性,只能获取不能设置

style

只能得到行内样式中设置的样式

得到的是带有单位的字符串

宽度不包含边框和边距

宽度是可读写属性,可以设置也可以获取

总结

想要获取元素的大小和位置,offset更方便(主要用于获取

想要修改元素的属性,使用style更方便(主要用于设置

1.元素可视区client

概念

client:客户端,通过它的相关属性,可以动态获取元素边框大小、元素大小等属性

可视区域包含内边距

element.clientTop表示一个元素的顶部边框的宽度,以像素表示。
element.clientLeft表示一个元素的左边框的宽度,以像素表示。
element.clientHeight在页面上返回内容的可视高度(高度包含内边距(padding),不包含边框(border),外边距(margin)和滚动条)
element.clientWidth在页面上返回内容的可视宽度(宽度包含内边距(padding),不包含边框(border),外边距(margin)和滚动条)

2.元素滚动scroll

概念

scroll

滚动的意思,通过它的相关属性可以动态获取元素的大小,滚动的距离

element.scrollHeight返回整个元素的高度(包括内边距,不包括外边距和边框)
element.scrollLeft返回元素内容水平滚动的像素值
element.scrollTop返回元素内容垂直滚动的像素值
element.scrollWidth返回元素的整个宽度(包括内边距,不包括外边距和边框)

监听页面文档滚动

pageXOffset 和 pageYOffset 属性返回文档在窗口左上角水平和垂直方向滚动的像素。

pageXOffset 设置或返回当前页面相对于窗口显示区左上角的 X 位置。pageYOffset 设置或返回当前页面相对于窗口显示区左上角的 Y 位置。

pageXOffset 和 pageYOffset 属性相等于 scrollX 和 scrollY 属性。

这些属性是只读的。

针对window对象进行监听,可以获取页面文档的滚动

pageXOffset设置或返回当前页面相对于窗口显示区左上角的 X 位置。
pageYOffset设置或返回当前页面相对于窗口显示区左上角的 Y 位置。

3.三大系列总结

offset

经常用于获取元素的位置(offsetTop offsetLeft)

client

经常用于获取元素的大小(clientHeight clientWidth,包含内边距,不含边框)

scroll

经常用于获取滚动的距离(scrollTop垂直滚动 scrollLeft水平滚动)

监听文档滚动,改绝对定位为固定定位案例

// 获取slider-bar的offset值 - banner的offset值
const slider = document.querySelector('.slider-bar')
const banner = document.querySelector('.banner')
const goBack = document.querySelector('.goBack')
const sliderTop = slider.offsetTop
const bannerTop = banner.offsetTop
const mainTop   = document.querySelector('.main').offsetTop

// 计算差值,将来用于设置slider固定定位top的偏移值
const fixedTopValue = sliderTop - bannerTop
console.log(fixedTopValue) // 130

// 监听文档滚动
window.addEventListener('scroll',function(){
    console.log(window.pageYOffset)
    // 滚动到一定距离的时候
    if(scrollY >= bannerTop){
        // 变成固定定位
        slider.style.position = 'fixed'
        slider.style.top = fixedTopValue + 'px'
    }else{
        slider.style.position = 'absolute'
        slider.style.top = '300px'
    }
    // 当滚动到一定区域,goBack就显示
    if(scrollY >= mainTop){
        goBack.style.display = 'block'
    }else{
        goBack.style.display = 'none'
    }
})

4.异常

异常

程序出现了不正常的情况(除0异常,数组索引越界,语法错误)程序一般会自己停掉

处理异常的方式

1.抛出(甩锅

throw关键字,可以手动抛出异常信息

程序会将抛出的信息打印到控制台上,并且停掉程序,并且后续代码也无法执行

本质是没有解决问题,只是抛出了问题

const a = 20
if(a>10){
  throw 'a大于10'
}
console.log(a)

2.处理(接盘

try 语句允许我们定义在执行时进行错误测试的代码块。

catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。

JavaScript 语句 trycatch 是成对出现的。

try …… catch 处理异常,处理后程序仍能继续运行,可以提高程序的健壮性

 /* try {
    ...    //异常的抛出,一般会把可能会出现问题的代码放这里。也可以做异常的手动抛出
} catch(e) {
    ...    //一般写异常的捕获与处理的代码。
} finally {
    ...    //结束处理,不管有没有异常,都必须执行的代码放在这里(记录日志等操作)
} */
var txt="";
function message(){
	try {
		adddlert("Welcome guest!");
	}
	catch(err) {
		txt="本页有一个错误。\n\n";
		txt+="错误描述:" + err.message + "\n\n";
		txt+="点击确定继续。\n\n";
		alert(txt);
	}
	alert(111)
}
function myFunction() {
  const input = document.querySelector('#demo')
  const p01   = document.querySelector('#p01')
  const num = input.value

  try {
    if (num == '') throw '值是空的' 
    if (num < 5) throw  '太小'
    if (num > 10) throw '太大'
    if (num >= 5 && num <= 10) throw '正确'
  } catch (error) {
    p01.innerHTML = `输入的值:${error}`
  } finally {
    input.value = '' 
  }
}

5.promise

概念

本身就是一个对象(类似正则),对象拥有属性和方法。它有两个属性和一个方法

// 创建promise属性
// 必须要传一个函数作为参数
// 在函数里面,一般有两个形参,
const p1 = new Promise((relove,rejeck)=>{})

// 打印p1可以看出,它有两个属性一个方法
console.log(p1)

状态属性是PromiseState——默认pending状态

结果属性名是PromiseResult——默认undefined结果(因为里面没有数据

创建

new方法 必须要传一个函数

在函数里面,一般有两个形参

它有两个属性一个方法

修改

修改promise状态属性

调用resolve()方法,当前promise状态会从pending转成[[PromiseState]] : "fulfilled" 实现状态

调用reject()方法,当前promise状态会从pending转成[[PromiseState]] : "rejected" 拒绝状态

修改Promise结果属性

调用resolve()方法传递参数,它会将传递的参数保存在结果属性中[[PromiseResult]]: "success"

promise状态不可逆

(resolve,reject)=>{resolve(),reject()}

不是先成功后失败,而是成功状态fulfilled

方法

then方法

接收两个函数作为参数

第一个参数是promise执行成功后的回调函数

第二个参数是promise执行失败后的回调函数

两个函数只能有一个被执行

通常情况下,then方法中更多的是只有一个函数,这个函数只有在成功的时候才会调用

回调函数

不是立马就被调用的函数,而是根据执行结果的情况,执行完后回头调用的函数

注意

回调函数能被执行的前提是——promise状态必须发生改变

要么是resolve,要么是reject,不能是pending状态

链式编程

调用完then后,返回值是一个promise对象,并且默认是pending状态

then返回值是一个promise对象,则可以继续调用then方法,从而实现链式编程

链式编程能够执行下去的前提,第一个promise的状态必须发生改变,不能是pending状态

数据传递

将当前then方法中的数据带到下一个then,有三种方式

resolve(1)

return value * 2;

Promise.resolve('resolve');或者Promise.reject('reject');

三大系列总结.png