盒子模型:

  el.offsetWidth:本身宽度+边框线+左右内边距;
  el.offsetHeight:本身高度+边框线+上下内边距;

 <style>
        * {
            margin: 0;
            padding: 0;
        }

        .box1 {
            width: 400px;
            height: 300px;
            background-color: #ccc;
            padding: 20px;
            border: 10px solid #f00;
            margin: 30px;
        }

        .box2 {
            width: 300px;
            height: 200px;
            border: 10px solid green;
            overflow: scroll;
        }
    </style>
    <div class="box1">box1</div>
    <div class="box2">
        <p>段落1</p>
        <p>段落2</p>
        <p>段落3</p>
        <p>段落4</p>
        <p>段落5</p>
        <p>段落6</p>
        <p>段落7</p>
        <p>段落8</p>
        <p>段落9</p>
        <p>段落10</p>
        <p>段落11</p>
        <p>段落12</p>
        <p>段落13</p>
        <p>段落14</p>
        <p>段落15</p>
        <p>段落16</p>
        <p>段落17</p>
        <p>段落18</p>
        <p>段落19</p>
        <p>段落20</p>
        <p>段落21</p>
        <p>段落22</p>
        <p>段落23</p>
        <p>段落24</p>
        <p>段落25</p>
        <p>段落26</p>
        <p>段落27</p>
        <p>段落28</p>
        <p>段落29</p>
        <p>段落30</p>

    </div>
    <div class="box3">box3</div>
    <script>
        let box1 = document.querySelector('.box1');
        
       console.log(box1.offsetWidth);
       console.log(box1.offsetHeight);
       console.log(box1.clientWidth);
       console.log(box1.clientHeight);

       let box2 = document.querySelector('.box2');
       console.log(box2.scrollWidth);
       console.log(box2.scrollTop);
       box2.onscroll = function(){
            console.log(box2.scrollTop);
       }
    </script>

获取窗口宽高:

<script>
        console.log(window.innerHeight||document.body.clientHeight||document.documentElement.clientHeight);
        console.log(window.innerWidth||document.body.clientWidth||document.documentElement.clientWidth);
    </script>

获取窗口的滚动距离:

    <style>
        .content {
            height: 2000px;
            background-color: #ccc;
        }

        .box1 {
            width: 400px;
            height: 300px;
            background-color: #ccc;
            padding: 20px;
            border: 10px solid #f00;
            margin: 30px;
        }
    </style>
    <div class="content"></div>
    <div class="box1">box1</div>
    <script>
        // console.log(window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop);
        window.onscroll = function(){
            console.log(window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop);
        }
    </script>

标签的尺寸大小和偏移量:

 1.box1.getBoundingClientRect()获取到的偏移量相对于窗口来的,不会加上滚动距离offsetTop和offsetLeft获取到的偏移量是相对于页面内容来的

 2.如果对应标签的某个祖先有定位,那么offsetTop和offsetLeft获取到的偏移量是相对于有定位属性的祖先来的。

  <style>
        * {
            margin: 0;
            padding: 0;
        }

        .content {
            height: 800px;
            background-color: #ccc;
        }

        .box1 {
            width: 400px;
            height: 300px;
            background-color: #ccc;
            padding: 20px;
            border: 10px solid #f00;
            /* margin: 30px; */
        }

        .box2 {
            width: 300px;
            height: 200px;
            border: 10px solid green;
            overflow: scroll;
        }

        .box1-parent {
            padding: 100px;
            /* margin: 20px; */
            background-color: pink;
            position: relative;
        }

        .box1-grandparent {
            margin: 50px;
            position: relative;
            padding: 100px;
            background-color: green;
        }
    </style>
    <div class="content">content</div>
    <!-- <div class="box1">box1</div> -->

    <div class="box1-grandparent">
        <div class="box1-parent">
            <div class="box1">box1</div>
        </div>
    </div>
    <div class="box2">
        <p>段落1</p>
        <p>段落2</p>
        <p>段落3</p>
        <p>段落4</p>
        <p>段落5</p>
        <p>段落6</p>
        <p>段落7</p>
        <p>段落8</p>
        <p>段落9</p>
        <p>段落10</p>
        <p>段落11</p>
        <p>段落12</p>
        <p>段落13</p>
        <p>段落14</p>
        <p>段落15</p>
        <p>段落16</p>
        <p>段落17</p>
        <p>段落18</p>
        <p>段落19</p>
        <p>段落20</p>
        <p>段落21</p>
        <p>段落22</p>
        <p>段落23</p>
        <p>段落24</p>
        <p>段落25</p>
        <p>段落26</p>
        <p>段落27</p>
        <p>段落28</p>
        <p>段落29</p>
        <p>段落30</p>

    </div>
    <div class="box3">box3</div>
    <div class="content">content</div>

    <script>
        let box1 = document.querySelector('.box1');
        console.log(box1.getBoundingClientRect());
        console.log(box1.getBoundingClientRect().x);
        console.log('getBoundingClientRect: ',box1.getBoundingClientRect().y);

        console.log('offsetTop:',box1.offsetTop);
        console.log(box1.offsetLeft);
      
        // 父亲和爷爷都有定位
        console.log(box1.offsetParent);//box1的父亲
        console.log(box1.offsetParent.offsetParent);//box1的爷爷
        console.log(box1.offsetParent.offsetParent.offsetParent);//body
        console.log(box1.offsetParent.offsetParent.offsetParent.offsetParent);//null
        // console.log(box1.offsetParent.offsetParent.offsetParent.offsetParent.offsetParent);//null


    </script>

让页面滚动到指定位置:

 <style>
        * {
            margin: 0;
            padding: 0;
        }

        .content {
            height: 1000px;
            background-color: #ccc;
        }

        .box {
            width: 300px;
            height: 200px;
            background-color: pink;
        }
    </style>
    <div class="content">content1</div>
    <div class="box">box</div>
    <div class="content">content2</div>
    <script>
        // window.scroll(x,y);
        // window.scroll(0,200);
        // window.scroll(0,400);
        // window.scrollTo(0,400);

        // window.scrollBy(0,400);

        let box = document.querySelector('.box');
        box.onclick = function(){
            // window.scroll(0,200);//相对整个页面内容来的
            window.scrollBy(0,200);//相对当前位置来的
        }
        // 默认值为true:box上边与窗口上边持平,false:box下边与窗口下边持平
        box.scrollIntoView(false);
    </script>

事件的绑定:

  语法:addEvent(el,eventName,eventFn)  给对应标签绑定事件

            el: 事件源(标签)

            eventName: 事件名称

            eventFn:事件处理函数

<script>
        function box2(){
            alert('点了box2一下')
        }
        var box3 = document.querySelector('.box3');
        /* box3.onclick = function(){
            console.log('点了box3一下');
        }
        //移除事件
        box3.onclick = null; */
        // box3.onclick = function(){
        //     console.log('点了box3一下1111111111');
        // }
        // box3.onclick = function(){
        //     console.log('点了box3一下2222222222');
        // }
        // box3.onclick();//手动触发点击事件
        // console.dir(box3);

        
        // box3.addEventListener(事件,事件处理函数);
        /* box3.addEventListener('click',function(){
            console.log('点了box3一下');
        })
        box3.removeEventListener('click',function(){
            console.log('点了box3一下');
        }); */
        // box3.addEventListener('click',fn)
        // box3.removeEventListener('click',fn);
        /* function fn(){
            console.log('点了box3一下');
        } */
        // fn();

        /* box3.addEventListener('click',function(){
            console.log('点了box3一下11111111111');
        })
        box3.addEventListener('click',function(){
            console.log('点了box3一下22222222222');
        }) */
        // box3.attachEvent(on事件,事件处理函数);
        /* box3.attachEvent('onclick',fn);
        box3.detachEvent('onclick',fn);
        function fn(){
            console.log('点了box3一下');
        } */
      
        function addEvent(el,eventName,eventFn){
            // el.oneventName = eventFn;
            // el['on'+eventName] = eventFn;
            if(el.addEventListener){
                el.addEventListener(eventName,eventFn);
            }else if(el.attachEvent){
                el.attachEvent("on"+eventName,eventFn);
            }else{
                el['on'+eventName] = eventFn;
            }
        }
        addEvent(box3,'click',function(){console.log('点了box3一下');});
        // 事件移除的封装
        function removeEvent(el,eventName,eventFn){
            if(el.removeEventListener){
                el.removeEventListener(eventName,eventFn);
            }else if(el.detachEvent){
                el.detachEvent("on"+eventName,eventFn);
            }else{
                el['on'+eventName] = null;
            }
        }

        // let obj1 = {};
        // let obj2 = {};
        // console.log(obj1==obj2);//false
    </script>

事件对象:

 pageX\pageY:获取到的是鼠标点击的位置(相对于整个页面内容来的)

            clientX、clientY:获取到的是鼠标点击的位置(相对于窗口来的)

            offsetX、offsetY:获取到的是鼠标点击的位置(相对于自身来的)

  <style>
        *{
            margin: 0;
            padding: 0;
        }
        .son{
            width: 200px;
            height: 100px;
            background-color: #f00;
        }
        .parent{
            width: 300px;
            height: 200px;
            background-color: green;
        }
        .grand-parent{
            width: 400px;
            height: 300px;
            background-color: blue;
        }
        .content{
            height: 1000px;
            background-color: #ccc;
        }
    </style>
    <div class="content">content</div>
    <div class="grand-parent">
        <div class="parent">
            <div class="son">son1</div>
            <div class="son">son2</div>
        </div>
    </div>
    <script>
       
        let parent = document.querySelector('.parent');
        parent.addEventListener("click",function(ev){
            console.log('ev:',ev);
            let e = ev||event;
            console.log(e);
            console.log("点了一下parent",event);
            /* console.log(event.pageX);
            console.log(event.pageY); */
            /* console.log(event.clientX);
            console.log(event.clientY); */
            console.log(event.offsetX);
            console.log(event.offsetY);
            console.log(event.target);
        });
    </script>

事件三阶段:

 事件三阶段:先捕获  后目标  再冒泡

 eventPhase  1(捕获)  2(目标)  3(冒泡)

  <style>
        *{
            margin: 0;
            padding: 0;
        }
        .son{
            width: 200px;
            height: 100px;
            background-color: #f00;
        }
        .parent{
            width: 300px;
            height: 200px;
            background-color: green;
        }
        .grand-parent{
            width: 400px;
            height: 300px;
            background-color: blue;
        }
    </style>
    <div class="grand-parent">
        <div class="parent">
            <div class="son">son</div>
        </div>
    </div>
   
    <script>
        let son = document.querySelector('.son');
        let parent = document.querySelector('.parent');
        let grand_parent = document.querySelector('.grand-parent');
        son.addEventListener("click",function(){
            console.log('son',event.eventPhase);
        });
        parent.addEventListener("click",function(){
            console.log('parent',event.eventPhase);
        },true);
        grand_parent.addEventListener("click",function(){
            console.log('grand_parent',event.eventPhase);
        },true);
    </script>

事件委托:

 事件委托:事件代理

当多个标签需要绑定相同事件的时候,就可以把事件委托给某个共同的祖先

事件委托的原理就是利用了事件冒泡

    <script>
        /* let allLi = document.querySelectorAll('li');
        allLi.forEach(li=>{
            li.addEventListener('click',function(){
                console.log('点了一下li',this);
            })
        }) */
        let ul = document.querySelector('ul');
        ul.addEventListener("click",function(){
            console.log("点击了ul",event.target);
        });
    </script>

阻止浏览器默认事件:

<script>
        let a = document.querySelector('a');
        a.addEventListener('click',function(){
            // event.preventDefault();
            event.preventDefault?event.preventDefault():event.returnValue = false;
            console.log("点了一下a");
        })

        // 鼠标右键事件
        window.oncontextmenu = function(){
            event.preventDefault?event.preventDefault():event.returnValue = false;
            console.log("鼠标右键点了一下");
        }
    </script>

阻止事件冒泡:

 <style>
        *{
            margin: 0;
            padding: 0;
        }
        .son{
            width: 200px;
            height: 100px;
            background-color: #f00;
        }
        .parent{
            width: 300px;
            height: 200px;
            background-color: green;
        }
        .grand-parent{
            width: 400px;
            height: 300px;
            background-color: blue;
        }
    </style>
    <div class="grand-parent">
        <div class="parent">
            <div class="son">son</div>
        </div>
    </div>
   
    <script>
        let son = document.querySelector('.son');
        let parent = document.querySelector('.parent');
        let grand_parent = document.querySelector('.grand-parent');
        son.addEventListener("click",function(){
            console.log('son',event.eventPhase);
            // 阻止事件冒泡
            // event.stopPropagation();
            event.stopPropagation?event.stopPropagation():event.cancelable = true;
        });
        parent.addEventListener("click",function(){
            console.log('parent',event.eventPhase);
        });
        grand_parent.addEventListener("click",function(){
            console.log('grand_parent',event.eventPhase);
        });
    </script>

鼠标单击和双击事件:

 <div class="box1">box1</div>
    <script>
        let box1 = document.querySelector('.box1');
        let tid  = null;
        box1.addEventListener('click',function(){
            if(tid){//如果300ms内点击了两次,点击第二次的时候,tid就有值了,就清除定时器,不去执行单击事件的逻辑代码
                clearTimeout(tid);
                tid  = null;
                return ;
            }
            tid = setTimeout(() => {
                console.log("单击事件的逻辑代码");
                tid  = null;
            }, 300);
        });
        // 300ms以内点了两次
        box1.addEventListener('dblclick',function(){
            console.log("双击事件的逻辑代码");
        });
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值