Web前端------JS三大家族总结

JS三大家族

JS的三大家族主要是Offset、Scroll、Client,通过对三大家族不同属性的灵活使用,我们可以模拟出很多炫酷的JS动画,增强界面的视觉感染力!让静态页面活起来!

Client家族属性介绍
  • clientWidth 获取网页可视区域宽度(两种用法)
  • clientHeight 获取网页可视区域高度(两种用法)
    调用者不同,意义不同:
    盒子调用: 指盒子本身。
    body/html调用: 可视区域大小。
  • clientX 鼠标距离可视区域左侧距离(event调用)
    clientY 鼠标距离可视区域上侧距离(event调用)
  • clientTop/clientLeft 盒子的border宽高
三大家族区别
  • Width和height
    clientWidth = width + padding
    clientHeight = height + padding
    offsetWidth = width + padding + border
    offsetHeight = height + padding + border
    scrollWidth = 内容宽度(不包含border)
    scrollHeight = 内容高度(不包含border)
  • top和left
    1. offsetTop/offsetLeft :
      调用者:任意元素。(盒子为主)
      嘛作用:距离父系盒子中带有定位的距离。
    2. scrollTop/scrollLeft:(盒子也可以调用,必须有滚动条)
      调用者:document.body.scrollTop/.....(window)
      嘛作用:浏览器无法显示的部分(被卷去的部分)。
    3. clientY/clientX:(clientTop/clientLeft 值的是border)
      调用者:event.clientX(event)
      嘛作用:鼠标距离浏览器可视区域的距离(左、上)。
      区别图示所示:


      三大家族区别.png
另外一个版本的三大家族区别
  • offset家族
    offsetHeight: 元素高,height+border+padding
    offsetWidth: 元素宽,width+border+padding
    offsetTop: 上边距离带有定位的父盒子的距离(重要)
    offsetLeft: 左边距离带有定位的父盒子的距离(重要)
    offsetParent: 最近的带有定位的父盒子

  • scroll家族
    scrollHeight: 内容高,不含border
    scrollWidth: 内容宽,不含border
    scrollTop: document.documentELement.scrollTop || document.body.scrollTop; (重要)window.pageXOffset;
    浏览器页面被卷去的头部
    元素调用.必须具有滚动条的盒子调用。盒子本身遮挡住的子盒子内容。
    子盒子被遮挡住的头部
    scrollLeft: document.documentELement.scrollLeft: || document.body.scrollLeft: ; (重要)window.pageYOffset;
    浏览器页面被卷去的左侧
    元素调用.必须具有滚动条的盒子调用。盒子本身遮挡住的子盒子内容。
    子盒子被遮挡住的左侧

  • client家族
    clientHeight: 元素高,height+padding;
    window.innerHeight; document.body.clientHeight 可视区域的高
    clientWidth: 元素宽,width+padding;
    window.innerWidth; document.documentElementWidth; 可视区域的宽
    clientTop: 元素的上border宽
    clientLeft: 元素的左border宽
    clientY 调用者:event.clientY(event)(重要)
    作用:鼠标距离浏览器可视区域的距离,上
    clientX 调用者:event.clientX(event)(重要)
    作用:鼠标距离浏览器可视区域的距离,左

client家族特殊用法:检查浏览器宽高(可视区域)兼容性写法
 //获取屏幕可视区域的宽高
    function client(){
        if(window.innerHeight !== undefined){
            return {
                "width": window.innerWidth,
                "height": window.innerHeight
            }
        }else if(document.compatMode === "CSS1Compat"){
            return {
                "width": document.documentElement.clientWidth,
                "height": document.documentElement.clientHeight
            }
        }else{
            return {
                "width": document.body.clientWidth,
                "height": document.body.clientHeight
            }
        }
    }
Onresize事件

只要浏览器的大小改变,哪怕1像素,都会触动这个事件。调用方式:

window.onresize = function () {
        //document.title = client().width + "    "+ client().height;
    }

案例:根据浏览器可视区域大小,给定背景色

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<script src="jquery1.0.0.1.js"></script>
    <script>
        //需求:浏览器每次更改大小,判断是否符合某一标准然后给背景上色。
        //  // >960红色,大于640小于960蓝色,小于640绿色。
        //步骤:
        //1.老三步
        //2.判断。
        //3.上色

        //1.老三步
        window.onresize = fn;
        //页面加载的时候直接执行一次函数,确定浏览器可视区域的宽,给背景上色
        fn();

        //封装成函数,然后指定的时候去调用和绑定函数名
        function fn() {
            //2.判断。
            //3.上色
            if(client().width>960){
                document.body.style.backgroundColor = "red";
            }else if(client().width>640){
                document.body.style.backgroundColor = "blue";
            }else{
                document.body.style.backgroundColor = "green";
            }
        }



    </script>
</body>
</html>
检测屏幕宽高
window.screen.width

分辨率是屏幕图像的精密度,指显示器所能显示的像素有多少。我们的电脑一般:横向1280个像素点,纵向960个像素点。示例:

 window.onresize = function () {
        document.title = window.screen.width + "    "+ window.screen.height;
    }
事件冒泡

事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发。这一过程被称为事件冒泡;这个事件从原始元素开始一直冒泡到DOM树的最上层。(BUG)(本来应该一人做事一人当,结果,我做错了事情,你去告诉我妈)
什么是冒泡:子元素事件被触动,父盒子的同样的事件也会被触动。取消冒泡就是取消这种机制。

  • 阻止冒泡
    W3C的方法:(火狐、谷歌、IE11)
    event.stopPropagation()
    IE10以下则是使用:event.cancelBubble = true
    兼容性写法:
var event = event || window.event;
 if(event && event.stopPropagation){
            event.stopPropagation();
  }else{
            event.cancelBubble = true;
  }
事件捕获

事件捕获和事件冒泡的机制相反
事件捕获是先从顶级父控件开始响应方法,最终才调用触发事件的子控件的响应事件

addEventListenner(参数1,参数2,参数3)

调用者是:事件源。 参数1:事件去掉on 参数2 :调用的函数

参数3:可有可无。没有默认false.false情况下,支持冒泡。True支持捕获。

image.png

事件冒泡与事件捕获测试小demo

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box1 {
            width: 500px;
            height: 500px;
            background-color: pink;
        }
        .box2 {
            width: 300px;
            height: 300px;
            background-color: yellow;
        }
        .box3 {
            width: 100px;
            height: 100px;
            background-color: blue;
        }


    </style>
</head>
<body>

<div class="box1" id="box1">
    <div class="box2">
        <div class="box3"></div>
    </div>
</div>

<script>

    var box1 = document.getElementById("box1");
    var box2 = box1.children[0];
    var box3 = box2.children[0];

//    冒泡和捕获
//    box1.onclick = function () {
//        alert("我是box1");
//    }
//
//    box2.onclick = function () {
//        alert("我是box2");
//    }
//
//    box3.onclick = function () {
//        alert("我是box3");
//    }
//
//    document.onclick = function () {
//        alert("我是document");
//    }


//    box1.addEventListener("click", function () {
//        alert("我是box1");
//    },true);
//
//    box2.addEventListener("click", function () {
//        alert("我是box2");
//    },true);
//
//    box3.addEventListener("click", function () {
//        alert("我是box3");
//    },true);
//
//    document.addEventListener("click", function () {
//        alert("我是document");
//    },true);


</script>

</body>
</html>

案例:隐藏模态框

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        body,html {
            height: 100%;
            padding: 0;
            margin: 0;
        }
        .mask {
            width: 100%;
            height: 100%;
            position: fixed;
            top: 0;
            left: 0;
            display: none;
            background: rgba(0, 0, 0, 0.6);
        }
        .login {
            width: 400px;
            height: 300px;
            cursor: pointer;
            background-color: #fff;
            margin: 200px auto;
        }
    </style>
</head>
<body>
    <div class="mask">
        <div class="login" id="login"></div>
    </div>
    <a href="#">注册</a>
    <a href="#">登陆</a>
    <script src="jquery1.0.0.1.js"></script>
    <script>
        //需求:点击登录按钮,显示模态框。点击出去login以外的所有盒子隐藏模态框。
        //步骤:
        //1.给登录绑定事件
        //2.给document绑定事件,因为可以冒泡,只要判断,点击的不是login,那么隐藏模态框


        //1.给登录绑定事件
        var mask = document.getElementsByClassName("mask")[0];
        var a = document.getElementsByTagName("a")[1];

        a.onclick = function (event) {
            //显示模态框
            show(mask);

            //阻止冒泡
            event = event || window.event;
            if(event && event.stopPropagation){
                event.stopPropagation();
            }else{
                event.cancelBubble = true;
            }

        }

        //2.给document绑定事件,因为可以冒泡,只要判断,点击的不是login,那么隐藏模态框
        document.onclick = function (event) {
            //获取点击按钮后传递过来的值。
            event = event || window.event;

            //兼容获取事件触动时,被传递过来的对象
//            var aaa = event.target || event.srcElement;
            var aaa = event.target?event.target:event.srcElement;

            console.log(event.target);

            //判断目标值的ID是否等于login,如果等于不隐藏盒子,否则隐藏盒子。
            if(aaa.id !== "login"){
                mask.style.display = "none";
            }
        }


    </script>

</body>
</html>
事件委托

事件委托是冒泡的一个应用,普通的事件绑定,没有办法为新创建的元素绑定响应的事件,所以就出现了事件委托,将事件绑定到父级元素,根据标签名称等因素,为子控件添加对应的事件响应。具体示例如下:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        li {
            height: 30px;
            line-height: 30px;
            margin: 3px 0;
            background-color: red;
            cursor: pointer;
        }
    </style>
</head>
<body>
<button>创建4个移民li</button>
<ul>
    <li>我是土著li</li>
    <a href="#">我是土著li</a>
    <li>我是土著li</li>
    <li>我是土著li</li>
    <a href="#">我是土著li</a>
    <li>我是土著li</li>
</ul>
<script>

    var liArr = document.getElementsByTagName("li");
    var ul = document.getElementsByTagName("ul")[0];
    var btn = document.getElementsByTagName("button")[0];

//    for(var i=0;i<liArr.length;i++){
//        liArr[i].onclick = function () {
//            alert("我是土著li");
//        }
//    }

    btn.onclick = function () {
        for(var i=1;i<=4;i++){
            var newLi = document.createElement("li");
            var newA = document.createElement("a");
            newLi.innerHTML = "我是移民li";
            newA.innerHTML = "我是移民a";
            newA.href = "#";
            ul.appendChild(newLi);
            ul.appendChild(newA);
        }
    }


    //普通的时间绑定,没有办法为新创建的元素绑定事件。所以我们要使用冒泡的特性,事件委托!
    //事件委托
    ul.onclick = function (event) {
        //获取事件触动的时候传递过来的值
        event = event || window.event;
        var aaa = event.target?event.target:event.srcElement;
        //判断标签名,如果是li标签弹窗
        if(aaa.tagName === "LI"){
            alert("我是li");
        }
    }



</script>

</body>
</html>

欢迎关注我的个人微信公众号,免费送计算机各种最新视频资源!你想象不到的精彩!


0.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容

  • offset家族三大家族和一个事件对象三大家族(offset/scroll/client)事件对象/event ...
    Yuann阅读 936评论 0 5
  • 一、三大系列:offset家族、scroll家族、client 1、offset 1.1.简介 offset家族就...
    magic_pill阅读 840评论 0 4
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,467评论 1 11
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 3,452评论 1 19
  • 遇见这群人大概是在两三年前,初识未有深刻印象。 和他们的交集缘于另一位神经病,这位同学有点儿可爱,有点儿认...
    月亮yu六便士阅读 294评论 0 0