事件流指的是事件完整执行中的流动路径
分为捕获和冒泡两个阶段
四川》成都》武侯区》目标-----捕获阶段
武侯区》成都》四川-----冒泡阶段
** 实际工作中以冒泡为主**
事件冒泡概念:当以个元素触发事件后,会依次向上调用所有父级元素的同名事件
而事件捕获是依次从父级向下调用
DOM,addEverntlistener(事件类型,事件处理函数,是否使用捕获函数)
//第三个参数传入true代表捕获阶段触发,false代表冒泡阶段触发
//一般默认false
因为默认有冒泡模式的存在,容易导致事件影响到父级元素
事件对象.stopPropagation()
addEverntlistener方式必须使用:
removeEventListener(事件类型,事件处理函数,[获取捕获或者冒泡阶段])
//匿名函数不能解绑
同时给多个元素注册事件,以往是通过for循环
通过委托减少注册次数,利用事件冒泡的特点
原理:给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素身上,从而触发父元素的事件
实现:事件对象.target.tagName可以获得真正触发事件的元素
<ul>
<li>第1个孩子li>
<li>第2个孩子li>
<li>第3个孩子li>
<li>第4个孩子li>
<li>第5个孩子li>
<p>我不会变色p>
ul>
<script>
//点击某个li,该li元素变为红色
const ul = document.querySelector('ul')
ul.addEventListener('click', function (e) {
if (e.target.tagName === 'LI') {
e.target.style.color = 'red'
}
})
script>
某些情况需要阻止默认行为的发生,比如阻止链接的跳转,表单域跳转
e.preventDefault()
<form action="http://www.baidu.com">
<input type="submit" value="提交">form>
<script>
const form = document.querySelector('form')
form.addEventListener('click',function(e){
e.preventDefault()
})
script>
//页面加载事件
window.addEventListener('load',function(){//执行的操作})
通过 addEventListener
监听 scroll
事件,可作用于 window
(全局滚动)或具体元素(如带滚动条的容器):
<script>
// 监听全局页面滚动
window.addEventListener('scroll', function() {
console.log('页面滚动了');
});
// 监听某个元素的滚动(如带滚动条的div)
var container = document.getElementById('scrollContainer');
container.addEventListener('scroll', function() {
console.log('容器滚动了');
});
script>
属性/方法 | 说明 |
---|---|
window.scrollY |
页面纵向滚动的距离(像素) |
window.scrollX |
页面横向滚动的距离(像素) |
element.scrollTop |
元素内容纵向滚动的距离(适用于容器) |
element.scrollLeft |
元素内容横向滚动的距离(适用于容器) |
document.documentElement.scrollHeight |
整个文档的总高度(包括滚动区域) |
window.innerHeight |
浏览器视口的高度 |
<style>
.nav {
position: fixed;
top: 0;
width: 100%;
height: 60px;
background: transparent;
transition: background 0.3s;
}
.nav.scrolled {
background: white;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
style>
<nav class="nav">导航栏nav>
<script>
var nav = document.querySelector('.nav');
window.addEventListener('scroll', function() {
// 当滚动距离超过50px时,添加scrolled类
if (window.scrollY > 50) {
nav.classList.add('scrolled');
} else {
nav.classList.remove('scrolled');
}
});
script>
<style>
.back-to-top {
position: fixed;
bottom: 30px;
right: 30px;
padding: 10px 15px;
background: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
display: none; /* 默认隐藏 */
}
style>
<button class="back-to-top">回到顶部button>
<script>
var backToTopBtn = document.querySelector('.back-to-top');
// 监听滚动,控制按钮显示/隐藏
window.addEventListener('scroll', function() {
if (window.scrollY > 300) {
backToTopBtn.style.display = 'block';
} else {
backToTopBtn.style.display = 'none';
}
});
// 点击按钮回到顶部
backToTopBtn.addEventListener('click', function() {
window.scrollTo({
top: 0,
behavior: 'smooth' // 平滑滚动
});
});
script>
window.addEventListener('resize'.function () {
//执行的代码
})
//检测屏幕宽度
window.addEventListener('resize',function(){
let w = document.documentElement.clientWidth
console.log(w)
})