Day24-扩展

补充

一 盒模型相关的属性(了解)

属性名说明
clientWidth、clientHeight获取元素的宽高(包含了内边距,不包含边框和外边距)
offsetWidth、offsetHeight获取元素的宽高(包含了内边距、包含了边框)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            width: 100px;
            height: 100px;
            border: 10px red solid;
            padding: 20px;
            margin: 20px;
            /* 怪异模式 */
            /* box-sizing: border-box; */
        }
    </style>
</head>
<body>
    <!-- 
        盒模型
            宽高
            内边距
            边框
            外边距
        盒子模式
            标准模式 总宽 = 宽 + 内边距 + 边框
            怪异模式 总宽 = 宽
     -->

     <div class="box"></div>

     <script>
        let obox = document.querySelector(".box")
        //获取盒子的宽和高
        // console.log(obox.clientWidth);
        // console.log(obox.clientHeight);

        console.log(obox.offsetWidth);
        console.log(obox.offsetHeight);
     </script>
</body>
</html>

二 事件

1 事件的发展史

DOM0和1级,早期这两种事件是浏览器厂商自己来定的,没有统一的标准,每家浏览器标准都不一样。

DOM2级事件,是标准W3C规范。

2 DOM2级事件

    <button id="btn">点我啊</button>
    <script>
        /**
         * 事件的绑定方式
         *  1.标签上帮事件
         *  2.DOM0级事件
         *  3.DOM2级事件
         *      语法:标签.addEventListener(事件类型,事件触发后要调用的函数)
         *      特点:一个标签可以绑定多个同名类型的事件
         *      
        */
        //拿到按钮
        let obtn = document.querySelector("#btn")
        //给标签绑定dom2级事件
        obtn.addEventListener("click",function(){
            alert("我被点击了")
        })

        obtn.addEventListener("click",function(){
            alert("哈哈哈!")
        })
    </script>

可以给标签绑定多个同名事件,标准用法

3 事件流

事件流:指的就是某个事件触发的时候,事件在嵌套的标签中按照特定的顺序来执行

事件流分为 事件冒泡和事件捕获

绑定事件如果你用DOM0级的方式来绑定,目前所有浏览器都只能支持冒泡

但是你用DOM2级的方式来绑定事件,你既可以支持冒泡,也可以支持捕获

1.事件冒泡

目前所有浏览器默认都是冒泡的方式,从内往外进行事件传播,false:默认冒泡

    <div>
        <p>点我啊</p>
    </div>
    <script>
        //获取到body标签
        let obody = document.querySelector("body")
        //获取到div标签
        let odiv = document.querySelector("div")
        //获取到p标签
        let op = document.querySelector("p")

        //给三个标签分别绑上点击事件
        obody.addEventListener("click",function(){
            alert("body标签被点击了")
        },false)

        odiv.addEventListener("click",function(){
            alert("div标签被点击了")
        },false)

        op.addEventListener("click",function(){
            alert("p标签被点击了")
        },false)
    </script>
2.事件捕获

事件捕获:事件的传播方向是从外向内,true代表事件捕获

    <div>
        <p>点我啊</p>
    </div>
    <script>
        //获取到body标签
        let obody = document.querySelector("body")
        //获取到div标签
        let odiv = document.querySelector("div")
        //获取到p标签
        let op = document.querySelector("p")

        //给三个标签分别绑上点击事件
        obody.addEventListener("click",function(){
            alert("body标签被点击了")
        },true)

        odiv.addEventListener("click",function(){
            alert("div标签被点击了")
        },true)

        op.addEventListener("click",function(){
            alert("p标签被点击了")
        },true)
    </script>

image-20221026142755707

总结:如果同时存在两种事件方式,先执行捕获,在执行冒泡

3.Event事件传播对象

只要有事件绑定,就一定会产生一个event对象,这个对象是事件传播对象(事件源对象)

event包含了事件源对象的所有信息

    <button id="btn" type="button" >按钮</button>
    <script>
        /**
         * 只要有事件绑定,就一定会产生event对象(事件传播对象)
         * 我们可以通过event.target获取到事件源对象
        */
        let obtn = document.querySelector("#btn")

        obtn.addEventListener("click",function(event){
            console.log(event.target);
        })
    </script>

4 事件委托

概念:事件委托(事件代理)指的就是借助于冒泡机制以及event对象,将子元素身上的事件交给父元素处理。减少页面代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            border: 1px red solid;
        }
    </style>
</head>
<body>
    <div class="box">
        <button class="zzks">正在考试</button>
        <button class="ctb">错题本</button>
        <button class="scj">收藏夹</button>
        <button class="sxlx">顺序练习</button>
        <button class="fllx">分类练习</button>
    </div>


</body>
</html>

三 事件类型(了解)

页面事件

事件类型说明
load文档就绪事件
scroll页面滚动
unload页面卸载了时候,触发的事件(离开这个页面) onunload
resize当页面的尺寸发生变化时触发
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 文档就绪事件,当html文档被浏览器加载完后,再执行js代码
        window.onload = function(){
            let obtn = document.querySelector("#btn")
            console.log(obtn);
        }
    </script>
</head>
<body>
    <button id="btn" type="button">按钮</button>
</body>
</html>

load事件代表页面结构加载完毕后再执行对应的JS代码。将JS放在head中了

鼠标事件

事件类型说明
onclick单击事件
ondblclick双击事件
onmouseover鼠标移入时触发
onmouseout鼠标移出时触发
onmousemove鼠标移动时
    <style>
        .box{
            width: 200px;
            height: 200px;
            border: 1px red solid;
        }
    </style>
    <div class="box" ></div>
    <script>
        //拿到div
        let obox = document.querySelector(".box")
        //鼠标移入事件
        obox.onmouseover = function(){
            console.log("鼠标移动到div里面了");
        }
        //鼠标移出事件
        obox.onmouseout = function(){
            console.log("鼠标移出div");
        }
    </script>

键盘事件

事件类型说明
onkeydown键盘按下时(按下时会一直触发)
onkeyup键盘按键松开时
onkeypress按住键盘时(按下时会一直触发)

如何得到按的是哪个键?


event.key得到按下键的字母

表单事件

事件类型说明
focusinput获取到焦点的时候
blurinput失去焦点的时候
input输入框内容发生改变时
change值最后发生改变后触发

四 案例

1 关闭广告

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .left{
            width: 150px;
            height: 300px;
            border: 1px black solid;
            position: fixed;
            top: 200px;
            left: 0;
        }

        .bottom{
            width: 200px;
            height: 200px;
            border: 1px black solid;
            position: fixed;
            right: 0;
            bottom: 0;
        }

        .left > button{
            /* 绝对定位相对于有定位的父容器定位 */
            position: absolute;
            bottom: 0;
            width: 100%;
        }

        .bottom > button{
            position: absolute;
            right: 0;
            top: 0;
        }
    </style>
</head>
<body>
    <div class="left">
        <button>关闭</button>
    </div>
    <div class="bottom">
        <button>关闭</button>
    </div>

    <script>
        // let btn1 = document.querySelector(".left > button")
        // btn1.onclick = function(){
        //     /**
        //      * 在事件函数中的this代表事件源对象
        //      * parentElement获取父节点
        //      * display = "none"让标签隐藏
        //     */
        //     this.parentElement.style.display = "none"
        // }

        // let btn2 = document.querySelector(".bottom > button")
        // btn2.onclick = function(){
        //     this.parentElement.style.display = "none"
        // }
        //获取到页面上所有的按钮
        let btnArr = document.querySelectorAll("button")
        btnArr.forEach(btn =>{
            btn.onclick = function(){
                /**
                 * 在事件函数中的this代表事件源对象
                 * parentElement获取父节点
                 * display = "none"让标签隐藏
                */
                this.parentElement.style.display = "none"
            }
        })

    </script>
</body>
</html>

2 选项卡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./css/tab.min.css">
</head>
<body>
    <!-- 选项卡 -->
    <div class="tab">
        <!-- 标题 -->
        <div class="title">
            <button class="selected">标题1</button>
            <button>标题2</button>
        </div>
        <!-- 内容 -->
        <div class="content">
            <div>内容一</div>
            <div>内容二</div>
        </div>
    </div>
    
    <script>
        //拿到标题中所有的按钮
        let obtns = document.querySelectorAll(".tab .title button")
        //拿到内容里面所有的div
        let odivs = document.querySelectorAll(".tab .content >div")
        
        obtns.forEach((btn,index) =>{
            //给按钮绑定点击事件
            btn.onclick = function(){
                for(let i=0;i<obtns.length;i++){
                    //1.移除所有按钮的class="selected"
                    obtns[i].removeAttribute("class")
                    //2.影藏所有的内容div
                    odivs[i].style.display="none"
                }
                //3给被点击的按钮加样式
                this.setAttribute("class","selected")
                //4让按钮对应的div显示出来
                odivs[index].style.display="block"
            }
        })
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值