0
点赞
收藏
分享

微信扫一扫

DOM- 网页特效篇

茗越 2022-05-02 阅读 66

文章目录

滚动事件和加载事件

目标:掌握新的事件,做更强交互

一、滚动事件和加载事件

1.1 滚动事件

  • 当页面进行滚动时触发的事件
  • 为什么要学?
    • 很多网页需要检测用户把页面滚动到某个区域后做一些处理,比如固定导航栏,比如返回顶部
  • 事件名:scroll
  • 监听整个页面滚动:
    // 页面滚动事件
    window.addEventListener('scroll', function(){
    	// 执行的操作
    })
    
    • 给window 或document 添加scroll 事件
  • 监听某个元素的内部滚动直接给某个元素加即可

1.2 加载事件

  • 加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件

  • 为什么要学?

    • 有些时候需要等页面资源全部处理完了做一些事情
    • 老代码喜欢把script 写在head 中,这时候直接找dom元素找不到
  • 事件名:load

  • 监听页面所有资源加载完毕:

    • 给window 添加 load 事件
    // 页面加载事件
    window.addEventListener('load', function(){
    	// 执行的操作
    })
    
  • 注意:不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定 load 事件

  • 当初始的HTML文档被完全加载和解析完成之后,DOMContentLoaded事件被触发,而无需等待样式表、图像等完全加载

  • 事件名:DOMContentLoaded

  • 监听页面DOM加载完毕:

    • 给document 添加DOMContentLoaded事件
    document.addEventListener('DOMContentLoaded', function() {
    	// 执行的操作
    })
    

1.3 小结

1.页面滚动事件如何添加?

  • scroll
  • 监听整个页面滚动给window 或document 加
    2.加载事件有哪两个?如何添加?
  • load 事件
    • 监听整个页面资源给window 加
  • DOMContentLoaded
    • 给document 加,当初始的HTML文档被完全加载和解析完成
    • 之后,DOMContentLoaded事件被触发,而无需等待样式
    • 表、图像等完全加载

元素大小和位置

  • 目标:掌握元素大小和位置的获取方法,为后续网页特效打基础

2.1 scroll家族

  • 使用场景:
    我们想要页面滚动一段距离,比如100px,就让某些元素
    显示隐藏,那我们怎么知道,页面滚动了 100 像素呢?
    就可以使用scroll 来检测页面滚动的距离~~~

在这里插入图片描述

  • 获取宽高:
    • 获取元素的 内容 总宽高(不包含滚动条)返回值不带单位
    • scrollWidth和scrollHeight
  • 获取位置:
    • 获取元素内容往左、往上滚出去看不到的距离
    • scrollLeft和scrollTop
    • 这两个属性是可以 修改
    div.addEventListener('scroll', function(){
    	console.log(this.scrollTop)
    }
    
  • 开发中,我们经常检测页面滚动的距离,比如页面滚动 100 像素,就可以显示一个元素,或者固定一个元素
// 页面滚动事件
window.addEventListener('scroll', function() {
	// document.documentElement.scrollTop 获得当前页面被卷去的头部
	let num = document.documentElement.scrollTop
	console.log(num)
}

注意事项
document.documentElement HTML 文档返回对象为HTML元素

小结

1.scrollWidth和scrollHeight是得到元素什么的宽高?

  • 内容
  • 不包含滚动条

2.被卷去的头部或者左侧用那个属性?是否可以读取和修改?

  • scrollTop/ scrollLeft
  • 可以读取,也可以修改(赋值)

3.检测页面滚动的头部距离(被卷去的头部)用那个属性?

  • document.documentElement.scrollTop
// 页面滚动事件
window.addEventListener('scroll', function() {
	// document.documentElement.scrollTop 获得当前页面被 卷去的头部
	let num = document.documentElement.scrollTop
	console.log(num)
})

案例:页面滚动显示返回顶部按钮
需求:当页面滚动 500像素,就显示返回顶部按钮,否则隐藏,同时点击按钮,则返回顶部
分析:
①:用到页面滚动事件
②:检测页面滚动大于等于 100 像素,则显示按钮
③:点击按钮,则让页面的scrollTop重置为 0
在这里插入图片描述

2.2 offset家族

  • 使用场景:
    前面案例滚动多少距离,都是我们自己算的,最好是页面滚动到某个元素,就可以做某些事。简单说,就是通过js的方式,得到元素在页面中的位置。这样我们可以做,页面滚动到这个位置,就可以返回顶部的小盒子显示…
    在这里插入图片描述

  • 获取宽高:

    • 获取元素的自身宽高、包含元素自身设置的宽高、padding、border
    • offsetWidth和offsetHeight
  • 获取位置:

    • 获取元素距离自己 定位父级 元素的左、上距离
    • offsetLeft和offsetTop 注意是只读属性

小结

1.offsetWidth 和 offsetHeight 是得到元素什么的宽高?

  • 内容+ padding + border

2.offsetTop 和 offsetLeft 得到位置以谁为准?

  • 带有定位的父级
  • 如果都没有则以文档左上角为准

案例:仿京东固定导航栏案例
需求:当页面滚动到秒杀模块,导航栏自动滑入,否则滑出
分析:
①:用到页面滚动事件
②:检测页面滚动大于等于秒杀模块的位置则滑入,否则滑出
在这里插入图片描述

案例:电梯导航案例
需求:点击可以页面调到指定效果
分析:
①:点击当前小导航,当前添加 active,其余移除 active
②:得到对应内容的 offsetTop 值
③:让页面的 scrollTop 走到对应内容的 offsetTop

2.3 client家族

  • 获取宽高:

    • 获取元素的可见部分宽高(不包含边框,滚动条等)
    • clientWidth和clientHeight
  • 获取位置:

    • 获取左边框和上边框宽度
    • clientLeft和clientTop 注意是只读属性 clientWidth
  • 会在窗口尺寸改变的时候触发事件:

    • resize
window.addEventListener('resize', function() {
	// 执行的代码
}
  • 检测屏幕宽度:
window.addEventListener('resize', function() {
	let w = document.documentElement.clientWidth;
	console.log(w);
})

小结

1.offset 家族

  • 获取元素自身大小:包括自身设置的宽高、padding、border
  • 获取元素距离定位父级的左和上距离 只读属性

2.client 家族

  • 获取元素可见区域的大小
  • 获取元素左、上边框距离 只读属性

3.scroll 家族

  • 获取元素内容的总大小
  • 获取元素向左向上滚出去看不见的距离 可读写属性

综合案例

轮播图案例
分析:

需求①:小图标鼠标经过事件
鼠标经过小图片,当前高亮,其余兄弟变淡 添加类

需求②:大图片跟随变化
对应的大图片跟着显示,如果想要过渡效果,可以使用opacity效果,可以利用CSS淡入淡出的效果,还是添加类

需求③:右侧按钮播放效果
点击右侧按钮,可以自动播放下一张图片
需要一个变化量 index 不断自增
然后播放下一张图片
如果到了最后一张,必须要还原为第 1 张图片
教你一招:索引号=索引号%数组长度(放到播放前面)

需求④:解决一个BUG
点击右侧按钮可以实现播放下一张,但是鼠标经过前面的,播放就会乱序
解决方案: 让变化量(索引号)重新赋值为当前鼠标经过的索引号

需求⑤:左侧按钮播放效果
点击左侧按钮,可以自动播放上一张图片
需要一个变化量 index 不断自减
然后播放上一张图片
如果到了第一张,必须要从最后一张播放
教你一招:索引号= (数组长度+索引号)% 数组长度

需求⑥:
因为左侧按钮和右侧按钮里面有大量相同的操作,可以抽取封装一个函数common

需求⑦:开启定时器
其实定时器自动播放,就相当于点击了右侧按钮,此时只需要,right.click()

需求⑧:
鼠标经过停止定时器(清除定时器)
鼠标离开开启定时器(开启定时器)

举报

相关推荐

0 条评论