滚动事件
写法
// 滚动事件
window.addEventListener('scroll', function () {
// 执行操作
})
<script>
// 滚动事件
window.addEventListener('scroll', function () {
// 执行操作
console.log(123);
})
</script>
</body>
加载事件
加载外部资源
事件名:load 监听页面资源加载完毕
语法
//加载外部资源(如图片、外联CSS和JavaScript等)加载完毕时触发的事件
window.addEventListener('load',function(){
// 加载页面资源,外部资源,样式后再执行
})
//当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载
document.addEventListener('DOMContentLoaded',function(){
//执行的操作
})
元素大小和位置
获取宽高
获取元素的内容总宽高(不包含滚动条)返回值不带单位
scrollWidth和scrollHeight 包括内容和间距
获取位置
获取元素内容往左、往上滚出去看不到的距离 scrollLeft和scrollTop
开发
开发中,我们经常检测页面滚动的距离,比如页面滚动100像素,就可以显示一个元素,或者固定一个元素
document.documentElement HTML 文档返回对象为HTML元素 可以读取,也可以修改(赋值)
window.addEventListener('scroll', function () {
// 获得滚动的高度
let h = document.documentElement.scrollTop
// 判断小火箭出现h的大小
if (h > 1500) {
// 改变样式属性
actGotop.style.display = 'block'
} else {
actGotop.style.display = 'none'
}
actGotop.addEventListener('click', function () {
document.documentElement.scrollTop = 0
})
})
offset家族
元素大小
获取元素的自身宽高 包含元素自身设置的宽高、padding、border
offsetWidth和offsetHeight
元素位置
获取元素距离自己定位父级元素的左、上距离
offsetLeft和offsetTop 注意是只读属性
client家族
获取元素的可见部分宽高(不包含边框,滚动条等)
clientWidth和clientHeight
获取左边框和上边框宽度
clientLeft和clientTop 注意是只读属性
轮播图案例
// 养成好习惯,等页面加载完毕之后再执行代码
window.addEventListener('load', function() {
// 开始业务处理
// 1 获取必要的元素
// 1.1 整个轮播图:因为后期要实现鼠标进入到离开时定时器的停止和重启
let main = document.querySelector('.main')
// 1.2 获取标记,后期要为标记添加鼠标进入到功能:切换图片,同时还要切换样式
let indicators = document.querySelectorAll('.indicator li')
// 1.3 获取所有图片,因为要让图片进行显示,本质就是样式的设置
let slides = document.querySelectorAll('.slides li')
// 1.4. 获取图片描述结构,到时候为这个结构赋值内容
let desc = document.querySelector('.extra h3')
// 1.5 获取上一张和下一张按钮
let next = document.querySelector('.extra .next')
let prev = document.querySelector('.extra .prev')
// 图片轮播效果的代码
function fengZhuang(i) {
// 2.2 切换标记的样式
// 2.2.1 先清除当前indicator中有active样式的li元素的active样式
document.querySelector('.indicator .active').classList.remove('active')
// 2.2.2 为当前被单击的标记元素添加active样式
indicators[i].classList.add('active')
// 2.3 让对应索引位置的图片显示
// 2.3.1:先清除当前slides中有active样式的li元素的active样式
document.querySelector('.slides .active').classList.remove('active')
// 2.3.2 找到对应的图片来添加active样式
slides[i].classList.add('active')
// 3.设置图片的描述信息
desc.innerHTML = `第${i + 1}张图的描述信息`
}
// 2.单击下方的标记能够实现图片轮播
// 伪数组不能直接操作,我们先遍历,获取伪数组中的每一个dom元素
for (let i = 0; i < indicators.length; i++) {
// 2.1 为每一个标记绑定单击事件
indicators[i].addEventListener('click', function() {
fengZhuang(i)
// 4.让全局索引 + 1
index = i
})
}
// 3.下一张
next.addEventListener('click', function() {
// 下一张
index++
// 为了避免索引越界,也为了循环轮播,当越界的时候应该重新从0开始
if (index > slides.length - 1) {
index = 0
}
fengZhuang(index)
})
// 4.上一张
prev.addEventListener('click', function() {
// 上一张
index--
// 为了避免索引越界,也为了循环轮播,当越界的时候应该重新从最后一张开始
if (index == -1) {
index = slides.length - 1
}
fengZhuang(index)
})
// 5.自动轮播:本质 是就是每隔一段时间,解决触发某个标记的click事件
let timerId = null
let index = 0 // 描述当前标记的索引值
// 创建定时器
function start() {
timerId = setInterval(function() {
// index++
// // 为了避免索引越界,也为了循环轮播,当越界的时候应该重新从0开始
// if (index > slides.length - 1) {
// index = 0
// }
// indicators[index].click()
// 下面这句代码相当于通过代码的方式触发next的click事件
next.click()
}, 1000)
}
start()
// 6.为整个轮播图添加鼠标进入事件,停止定时器
// 定时器不能暂停,只能停止-清除
main.addEventListener('mouseenter', function() {
// 清除定时器
clearInterval(timerId)
})
// 7.为整个轮播图添加鼠标离开事件,在事件处理函数中要重启定时器
// 重启定时器的本质就是重新创建(调用)一个定时器
main.addEventListener('mouseleave', function() {
start()
})
})