• 前端-js基础语法-DOM


    DOM的事件操作 

    一、JavaScript的组成

    JavaScript基础分为三个部分:

    • ECMAScript:JavaScript的语法标准。包括变量、表达式、运算符、函数、if语句、for语句等。

    • DOM:文档对象模型,操作网页上的元素的API。比如让盒子移动、变色、轮播图等。

    • BOM:浏览器对象模型,操作浏览器部分功能的API。比如让浏览器自动滚动。

    二、事件

    JS是以事件驱动为核心的一门语言。

    事件的三要素

    事件的三要素:事件源、事件、事件驱动程序

    比如,我用手去按开关,灯亮了。这件事情里,事件源是:手。事件是:按开关。事件驱动程序是:灯的开和关。

    再比如,网页上弹出一个广告,我点击右上角的X,广告就关闭了。这件事情里,事件源是:X。事件是:onclick。事件驱动程序是:广告关闭了。

    于是我们可以总结出:谁引发的后续事件,谁就是事件源。

    总结如下:

    • 事件源:引发后续事件的html标签。

    • 事件:js已经定义好了(见下图)。

    • 事件驱动程序:对样式和html的操作。也就是DOM。

    代码书写步骤如下:(重要)

    • (1)获取事件源:document.getElementById(“box”); //类似与ios语言的 UIButton *adBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    • (2)绑定事件: 事件源box.事件onclick = function(){ 事件驱动程序 };

    • (3)书写事件驱动程序:关于DOM的操作

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Document</title>
     6     <style type="text/css">
     7         #active{
     8             background-color: greenyellow;
     9             width: 100px;
    10             height:100px;
    11         }
    12     </style>
    13 </head>
    14 <body>
    15     <div id='active'></div>
    16     <script type="text/javascript">
    17         // 获取dom
    18         var odiv = document.getElementById('active');
    19         //绑定事件
    20         var isgreen = true;  //本次目的是点击变色且变宽然后隐藏掉,再单击变回来,故需要一个判断条件
    21         odiv.onclick = function(){
    22             // 驱动程序放在匿名函数里面,执行操作,要实现的效果
    23             // 所有的带-的,改变标签的样式在js里都用驼峰体写,如background-color就为backgroundColor
    24             if (isgreen) {
    25                 odiv.style.backgroundColor = 'red';
    26                 odiv.style.width = '200px';
    27                 odiv.style.display = 'none';
    28                 isgreen = false;    //记得变量有提升 var isgreen;
    29             }else {
    30                 odiv.style.backgroundColor = 'greenyellow';
    31                 isgreen = true;
    32             }
    33         };
    34     </script>
    35 </body>
    36 </html>
    代码演练

    常见事件如下:

    1、获取事件源的方式(DOM节点的获取)

    获取事件源的常见方式如下:

    1 var div1 = document.getElementById("box1");      //方式一:通过id获取单个标签
    2  
    3 var arr1 = document.getElementsByTagName("div1");     //方式二:通过 标签名 获得 标签数组,所以有s
    4  
    5 var arr2 = document.getElementsByClassName("hehe");  //方式三:通过 类名 获得 标签数组,所以有s

    2、绑定事件的方式

      1、匿名函数
      2、普通函数 用的是函数名fun
      3、行内模式 用的是fun(),且对象想改变属性,不能用this

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Document</title>
     6 
     7 </head>
     8 <body>
     9     <div id="first" class="active"></div>
    10     <script type="text/javascript">
    11         // DOM  Document Object Model  文档对象模型 所有的doc事件方法都在里面
    12         document.write(window)  //[object Window]
    13         console.log(window) //Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
    14 
    15         // 文档
    16         document.write(document) //[object HTMLDocument]
    17         console.dir(document)  // #document
    18 
    19         // html
    20         document.write(document.documentElement)  //[object HTMLHtmlElement]
    21         console.log(document.documentElement) // 获取怎么html文件里的所有内容显示所有的标签,通过这个操作所有的标签
    22 
    23 
    24         //body 获取body标签的内容
    25         document.write(document.body)
    26         console.log(document.body)
    27 
    28         // dom 操作三步走:
    29         // 1、获取事件对象(就是想操作的对象)
    30         // 2、绑定事件(怎么干,点击鼠标,鼠标悬浮,创建标签等等),所有的事件方法,js都已定义好,只需按需调用
    31         // 3、事件驱动程序(执行的操作,如改变对象的颜色,字体等等)
    32 
    33         //获取dom三种方式:
    34         var odiv = document.getElementById('first');  //  通过id获取单个标签
    35         var odiv1 = document.getElementsByClassName('active'); // 通过 类名 获得 标签数组,所以有s(相同的类可以被多个标签引用,所以是数组,如需具体到某一个加上索引即可)
    36         var odiv2 = document.getElementsByTagName('div');//通过 标签名 获得 标签数组,所以有s
    37 
    38 
    39         // 绑定dom三种方式:
    40         // 1、匿名函数
    41         // 2、普通函数    用的是函数名fun
    42         // 3、行内模式    用的是fun(),且对象想改变属性,不能用this
    43 
    44         // 1、通过匿名函数绑定,最常用
    45         odiv.onclick = function(){
    46             // 驱动程序
    47         }
    48 
    49         // 2、通过先定义普通函数,先写好逻辑,再绑定
    50         function add(obj){
    51             obj.style.backgroundColor = 'red';
    52         }
    53         odiv.onmouseover = add;  // 绑定的是函数名,而不是add(),因为add()是函数执行的结果
    54     </script>
    55 
    56      <!-- 3、行内绑定:注意对象自己改变自己的属性还是需要通过document来 -->
    57     <div id="box3" onclick="fun()"></div>
    58     <script type="text/javascript">
    59         function fun(){
    60             box3.style.backgroundColor = 'green';
    61             //
    62             document.getElementById('box3').style.backgroundColor = 'green';
    63         }
    64     </script>
    65 </body>
    66 </html>
    获取dom及绑定dom三种方法
      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>Document</title>
      6     <style type="text/css">
      7         #active{
      8             background-color: greenyellow;
      9             width: 100px;
     10             height:100px;
     11         }
     12         .box{
     13                 background-color: red;
     14                 width: 100px;
     15                 height: 100px;
     16             }
     17             .box1{
     18                 width: 200px;
     19                 height: 200px;
     20                 background-color: yellow;
     21             }
     22             .active{
     23                 background-color: red;
     24             }
     25     </style>
     26 </head>
     27 <body>
     28     <div id='active'></div>
     29     <!-- 通过id获取对象:返回单一对象 -->
     30     <script type="text/javascript">
     31         // 获取dom
     32         var odiv = document.getElementById('active');
     33         //绑定事件
     34         var isgreen = true;  //本次目的是点击变色且变宽然后隐藏掉,再单击变回来,故需要一个判断条件
     35         odiv.onclick = function(){
     36             // 驱动程序放在匿名函数里面,执行操作,要实现的效果
     37             // 所有的带-的,改变标签的样式在js里都用驼峰体写,如background-color就为backgroundColor
     38             if (isgreen) {
     39                 odiv.style.backgroundColor = 'red';
     40                 odiv.style.width = '200px';
     41                 // odiv.style.display = 'none';
     42                 isgreen = false;    //记得变量有提升 var isgreen;
     43             }else {
     44                 odiv.style.backgroundColor = 'greenyellow';
     45                 odiv.style.width = '100px';
     46                 isgreen = true;
     47             }
     48         };
     49     </script>
     50 
     51 
     52 
     53     <!-- 通过类获取对象:返回数组 -->
     54     <div class="box"></div>
     55 
     56     <div class="box1" id="box1">girl</div>
     57 
     58     <script type="text/javascript">
     59         var isNow = true;
     60         var odiv = document.getElementById('box1'); //指定事件对象
     61         // 熟练了可以不指定事件对象直接写
     62         // js里的this和面向对象的self一样,表示对象自己,即事件对象
     63         // 下面三种方式都表示指定对象
     64         document.getElementById('box1').onclick = function(){  //绑定事件
     65             console.log(document.getElementById('box1'));
     66             console.log(odiv);
     67             console.log(this);
     68 
     69             if (isNow) {
     70                 // className为类名,this.className表示对象自己的类名,即为标签指定的类名
     71                 // odiv.className = odiv.className + 'active';
     72                 // 后声明的类优先级要高active是后声明的
     73                 this.className = this.className + ' active';
     74                 isNow = false;
     75             }else {
     76                 //再次点击还原
     77                 this.className = 'box1';
     78                 isNow = true;
     79             }
     80         };
     81     </script>
     82 
     83     <!-- 通过标签获取对象,返回数组 -->
     84     <script type="text/javascript">
     85 
     86             function $(obj){
     87                 // 封装查找事件对象通用函数
     88                 return document.getElementsByTagName(obj)[0]
     89             };
     90 
     91             // 通过标签找对象
     92             var obutton = document.getElementsByTagName('button')[0];
     93             // 应用上封装函数则如下
     94             var obutton = $('button');
     95 
     96             // 改变标签内部的一些属性如 id 、class、title、style
     97             // img( src alt) a(href)  input(type name value placeholder)  from(action method)
     98             // 直接访问document.getElementsByTagName('img')[0].src等等
     99 
    100             $('img').src = '../install/html/mi_picture/logo16366.gif';
    101             $('img').alt = 'dada';
    102             $('a').href = 'http://www.baidu.com';
    103 
    104             console.log($('div').innerText)
    105             // 结果: 更改  隐藏     happy一下
    106 
    107 
    108             console.log($('div').innerHTML)
    109             // <button class="python">更改</button>
    110             // <button class="python">隐藏</button>
    111             // <input type="text" placeholder="love ">
    112             // <img src="../install/html/mi_picture/logo16366.gif" alt="dada">
    113             // <a href="http://www.baidu.com">happy一下</a>
    114 
    115             innerText 获取的是文本,添加的也是文本
    116             innerHTML 获取的是所有的文本加标签,添加标签及文本
    117         </script>
    118 
    119 </body>
    120 </html>
    获取dom三种方式详细演练

     Dom对于值得操作

    / 改变标签内部的一些属性如 id 、class、title、style
    // img( src alt) a(href) input(type name value placeholder) from(action method)
    // 直接访问document.getElementsByTagName('img')[0].src等等
    // innerText 获取的是文本,添加的也是文本,更改得标签内所有得内容
    // innerHTML 获取的是所有的文本加标签,添加标签及文本,可向标签中直接插入一个标签,如‘<a href= 'http://www.lang.com'>百度一下</a>’

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Document</title>
     6 </head>
     7 <body>
     8     <div>
     9         <img src="" alt="">
    10         <button>隐藏</button>
    11         <input type=""  placeholder="happy一下" value="">
    12         <a href="">奋斗的岁月</a>
    13     </div>
    14 
    15 
    16     <script type="text/javascript">
    17             // 改变标签内部的一些属性如 id 、class、title、style
    18             // img( src alt) a(href)  input(type name value placeholder)  from(action method)
    19             // 直接访问document.getElementsByTagName('img')[0].src等等
    20             // innerText 获取的是文本,添加的也是文本
    21             // innerHTML 获取的是所有的文本加标签,添加标签及文本
    22             function $(obj){
    23                 return document.getElementsByTagName(obj)[0];
    24             };
    25 
    26             //直接操作属性
    27             $('img').src = '../install/html/mi_picture/logo16366.gif';
    28             $('img').alt = 'dada';
    29             $('a').href = 'http://www.baidu.com';
    30 
    31             // 答应innerText 与innerHTML的区别
    32             console.log($('div').innerText)
    33             // 结果:   隐藏     happy一下  奋斗的岁月
    34 
    35             console.log($('div').innerHTML)
    36             // 结果:
    37             // <button class="python">更改</button>
    38             // <button class="python">隐藏</button>
    39             // <input type="text" placeholder="love ">
    40             // <img src="../install/html/mi_picture/logo16366.gif" alt="dada">
    41             // <a href="http://www.baidu.com">happy一下</a>
    42     </script>
    43 </body>
    44 </html>

     innerHTML添加文本:
    1
    <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 <div> 9 <button>提交</button> 10 </div> 11 <script type="text/javascript"> 12 var oDiv = document.getElementsByTagName('div')[0] 13 var oBun = document.getElementsByTagName('button')[0] 14 oBun.onclick = function(){ 15 // 第一种向标签中插入内容 16 oDiv.innerHTML = '<h1>我的青年时代</h1>' 17 // 模板字符串ecm6中,反引号,插入变量名 ${name}这样内容可以变化 18 var name = 'wen'; 19 var age = '30'; 20 oDiv.innerHTML = `<ul> 21 <li>${name}</li> 22 <li>${age}</li> 23 </ul>` 24 25 }; 26 27 </script> 28 </body> 29 </html>

    案例1:点击按钮,关闭图片,再点击,显示图片,同时按钮得文字也跟着改变【这个小例子可扩展为导航栏上面的广告,点击X 关闭广告】

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Document</title>
     6 </head>
     7 <body>
     8     <div>
     9         <img src="" alt="">
    10         <button>隐藏</button>
    11     </div>
    12     <script type="text/javascript">
    13             // 需求:点击按钮,隐藏图片,,再点击,显示图片且按钮文字形成提示
    14             // 这个小例子可扩展为导航栏上面的广告,点击X 关闭广告
    15             var obuttons = $('button');   //获取对象,第一个按钮
    16             var oimg = $('img')
    17             var isShow = true;
    18             obuttons.onclick = function(){
    19                 if (isShow) {
    20                     oimg.style.display = 'none';
    21                     obuttons.innerText = '显示';  //按钮文字默认为隐藏
    22                     isShow = false;  // 改变条件
    23                 }else {
    24                     oimg.style.display = 'block';
    25                     obuttons.innerText = '隐藏';
    26                     isShow = true;
    27                 }
    28             };
    29     </script>
    30 </body>
    31 </html>
    通过按钮操作图片得显示和隐藏

     阻止默认事件发生:

    常见的有a标签的自动转超链接及submit按键自动提交表单信息,故在js中如有操作需提前阻止默认事件发生,执行我们自己写的逻辑。

    阻止a标签的默认事件小技巧:<a href=javascript:void(0);>
    另一种方法:event.preventDefault()   

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>京东广告栏</title>
     6     <style type="text/css">
     7         *{
     8             margin: 0;
     9             padding: 0;
    10         }
    11 
    12         .top_banner{
    13             width: 100%;
    14             background-color: rgb(230,15,82);
    15         }
    16 
    17         .container{
    18             width: 1190px;   /*京东的中间盒子*/
    19             margin: 0 auto;  /*盒子居中*/
    20             position: relative;
    21         }
    22 
    23         .top_banner .container .banner{
    24             display: block;
    25             width: 100%;
    26             height: 80px;
    27             background: url(http://img11.360buyimg.com/da/jfs/t23038/322/2050889343/74857/ef45186e/5b7276c9Na1fe6db5.jpg) no-repeat center 0;
    28                 /*设置背景图,不平铺,居中显示*/
    29         }
    30 
    31         .top_banner .container .close{
    32             /*display: block;*/
    33             position: absolute;
    34             /*定位的标签就脱离标准文档流,可以设置宽高了*/
    35             right: 0;
    36             top:0;
    37             /*上面这两个一定要加,不然就会在父块的内容后面,想浮起来左上角对其,就必须加*/
    38             width: 20px;
    39             height: 20px;
    40             color: white;
    41             text-align: center;
    42             line-height: 20px;
    43             text-decoration: none;
    44 
    45         }
    46 
    47         .hide{
    48             display: none;   /*隐藏可以在原类的属性上加上此类即可,一个标签有多个权重相同的类,从上到下,后面的覆盖前面的*/
    49         }
    50 
    51 
    52     </style>
    53 </head>
    54 <body>
    55     <div class='top_banner' id="top_banner">
    56         <div class="container">
    57             <a href="#" class="banner" id="banner"></a>
    58             <a href="http://www.baidu.com" class="close" id="closeBanner">X</a>
    59         </div>
    60     </div>
    61     <script type="text/javascript">
    62         // 需求:当点击x的时候,隐藏广告栏,且不进行跳转等动作
    63         var oClose = document.getElementById('closeBanner')  // 获取事件对象
    64         oClose.onclick = function(event){
    65             event.preventDefault();  // 阻止当前标签的默认事件,非常重要!!!!
    66             document.getElementById('top_banner').className += ' hide';  // 字符串拼接
    67             // 注意‘ hide’里hide前需要加一个空格,不然加到标签中和其它的类字符串写在一起了会失效
    68 
    69             // 点击x后,跳转到其它动作了如其它网页,这是不对的,需求阻止这个自动事件
    70             document.getElementById('top_banner').style.display = 'none';
    71         }
    72     </script>
    73 </body>
    74 </html>
    电商广告栏关闭案例

     DOM(Document Object Model)中各节点事件对象的分布:

    // DOM  文档对象模型 所有的dom事件方法都在里面
      document.write(window) //[object Window]
      console.log(window) //Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}

    // 文档
      document.write(document) //[object HTMLDocument]
      console.dir(document) // #document

    // html
      document.write(document.documentElement) //[object HTMLHtmlElement]
      console.log(document.documentElement) // 获取html文件里的所有内容显示所有的标签,通过这个操作所有的标签,除了一行没有<!doctype html>表示dom文档;


    //body 获取body标签的内容
      document.write(document.body)
      console.log(document.body)

    入口函数

    理论基础:js的加载是和html同步加载的

    window窗口包括:bom + dom

    window加载顺序: html加载完成,生成dom树
          即先文档加载dom,再图片加载,都加载完成表示窗口加载完成;

    场景:

      为了统一将js放在一起,div放在一起,结构分明,这就导致js可能放在div前面。

    作用:

      解决元素在定义之前使用,即script在div写,不加的话因从上到下执行找不到而报错。同时保证整个页面所有元素即标签加载完毕后再执行js内容。

    使用方法:

    将使用元素的代码放在onload里面
        <script>
          window.onload = function(){
              后面的function就是回调函数

              js代码……
          }
        </script>

    缺点:
    1、覆盖现象,如果文档中不小心写了多个windwow.onload,后面的会覆盖前面的。

    2、window.onload必须等窗口加载完成后才能执行里面的方法,如果网上差,图片等需要很久才能加载完成的原因,导致需要一直等待图片加载完成才能执行window.onload的代码,体验会非常差,解决方案就是加载dom即加载html里的所有标签,图片不管,这样体验就很好了,框架里都是这样做的。
        document.onload = function(){
            所有操作对象的操作都放在这里,就不会发生找不到对象的error了,就不会因js放在对象前面而无法执行,返回undefined
        }

      

    BOM对象【浏览器】

    实例:锚点值的跳转

    知识:window.location可以简写成location。location相当于浏览器地址栏,可以将url解析成独立的片段。

    location对象的属性 https://blog.csdn.net/luofeng457/article/details/70214101

    • href:跳转

    • hash 返回url中#后面的内容,包含#

    • host 主机名,包括端口

    • hostname 主机名

    • pathname url中的路径部分

    • protocol 协议 一般是http、https

    • search 查询字符串

    •  1 <!DOCTYPE html>
       2 <html lang="en">
       3 <head>
       4     <meta charset="UTF-8">
       5     <title>锚点值跳转</title>
       6 </head>
       7 <body>
       8     <!-- history  hash -->
       9     <a href="#/login">登录</a>
      10     <a href="#/register">注册</a>
      11     <div id="app"></div>
      12 
      13     <script>
      14          //锚点值的跳转,bom中的location事件
      15 
      16         window.onhashchange = function () {
      17             console.log(location.hash);
      18             var oDiv = document.getElementById('app');
      19             switch (location.hash) {
      20                 case '#/login':
      21                     //未来要与后端进行的交互的代码
      22                     oDiv.innerHTML = '<h2>我是登录页面</h2>'
      23                     break;
      24                 case '#/register':
      25                     oDiv.innerHTML = '<h2>我是注册页面</h2>'
      26                     break;
      27                 default:
      28                     oDiv.innerHTML = '<p>人生苦短,我学python</p>'
      29                     break;
      30             }
      31         };
      32     </script>
      33 </body>
      34 </html>
      锚点值跳转

    实例:固定导航栏及滚动监听

    知识:固定定位+ dom中的盒子位置获取方法 offsettop,scrollTop

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title></title>
      6     <style type="text/css">
      7         *{
      8             padding: 0;
      9             margin: 0;
     10         }
     11         ul{
     12             list-style: none;
     13         }
     14         a{
     15             text-decoration: none;
     16         }
     17         input{
     18             border: 0;
     19             outline: none;
     20         }
     21         body{
     22             /*padding-top: 80px;*/
     23         }
     24         .header{
     25             width: 100%;
     26             height: 70px;
     27             background-color: black;
     28             /*display: none;*/
     29         }
     30         .w{
     31             width: 1210px;
     32             overflow: hidden;
     33             margin: 0 auto;
     34         }
     35         .header ul li{
     36             float: left;
     37             width: 242px;
     38             height: 70px;
     39             line-height: 70px;
     40             text-align: center;
     41             background-color: blue;
     42 
     43         }
     44         .header ul li a{
     45             display: block;
     46             width: 242px;
     47             height: 70px;
     48             color: #fff;
     49         }
     50 
     51         /*固定导航栏*/
     52         .header-fix{
     53             width: 100%;
     54             height: 80px;
     55             background-color: white;
     56             box-shadow: 0 0 5px #888;
     57             display: none;
     58             position: fixed;
     59             top: 0;
     60             left: 0;
     61             z-index: 99999;
     62             /*margin-bottom: 10px;*/
     63         }
     64         .header-fix .logo{
     65             float: left;
     66             width: 117px;
     67             height: 57px;
     68             padding-top: 23px;
     69         }
     70         .header-fix .fm{
     71             float: left;
     72             width: 700px;
     73             height: 80px;
     74             margin-left: 100px;
     75         }
     76         .fm input[type='text']{
     77             float: left;
     78             width: 578px;
     79             height: 50px;
     80             border-top: 1px solid #999;
     81             border-left: 1px solid #999;
     82             border-bottom: 1px solid #999;
     83             margin-top: 15px;
     84             padding-left: 20px;
     85             font-size: 20px;
     86         }
     87         .fm input[type='submit']{
     88             float: left;
     89             width: 100px;
     90             height: 52px;
     91             background-color: #38f;
     92             position: relative;
     93             top: 15px;
     94             color: #fff;
     95             line-height: 52px;
     96             font-size: 18px;
     97         }
     98         .box1{
     99             width: 100%;
    100             height: 200px;
    101             background-color: red;
    102         }
    103         .box2{
    104             width: 100%;
    105             height: 300px;
    106             background-color: green;
    107         }
    108 
    109     </style>
    110 </head>
    111 <body style="height: 2000px">
    112     <div class="header">
    113         <div class="w">
    114             <ul>
    115                 <li><a href="#">网站导航</a></li>
    116                 <li><a href="#">网站导航</a></li>
    117                 <li><a href="#">网站导航</a></li>
    118                 <li><a href="#">网站导航</a></li>
    119                 <li><a href="#">网站导航</a></li>
    120             </ul>
    121         </div>
    122     </div>
    123     <div class="header-fix">
    124         <div class="w">
    125             <div class="logo">
    126                 <img src="./logo_top.png" alt="">
    127             </div>
    128             <form class="fm">
    129                 <input type="text" name="">
    130                 <input type="submit" name="" value="百度一下">
    131             </form>
    132         </div>
    133     </div>
    134     <div class="box1"></div>
    135     <div class="box2"></div>
    136     <a href="javscript:void(0);">百度</a>
    137 
    138     <!-- e.preventDefault(); -->
    139 
    140     <script type="text/javascript">
    141         window.onload = function(){
    142             var box2Height = document.getElementsByClassName('box2')[0];
    143             var fixBox = document.getElementsByClassName('header-fix')[0];
    144             var headerBox = document.getElementsByClassName('header')[0];
    145 
    146             window.onscroll = function(){
    147                 console.log(box2Height.offsetTop);
    148                 if (document.documentElement.scrollTop >=box2Height.offsetTop) {
    149                     fixBox.style.display = 'block';
    150                     document.body.style.paddingTop = '80'+ 'px';
    151                     headerBox.style.display = 'none';
    152                 }else{
    153                     fixBox.style.display = 'none';
    154                     document.body.style.paddingTop = '0'+ 'px';
    155                     headerBox.style.display = 'block';
    156                 }
    157             }
    158         }
    159     </script>
    160 
    161 </body>
    162 </html>
    js实现滚动监听

    client、offset、scroll系列:盒子的位置信息

    client:计算对象自己盒模型的宽高

    var obj = document.getElementsByTagName('div')[0]

    obj.clientTop:  盒子边框的高度 即border

    obj.clientWidth/Height : 可视宽度/高度  即  内容+padding  不算border

    offset : 计算嵌套中的盒子到body,到父辈盒子的距离【偏移】

    offsetWidth/Height:盒模型的宽高,即 内容+padding+border

    offsetTop/Left:【滚动监听的目标盒子到父辈或到窗口顶部的参考点】

      如果父辈没有定位:子盒子不管定位否,都是子盒子外边框到body的距离;

      如果父辈定位了,子辈定位了,就是到父辈的距离,以父辈作为参考,子盒子的外边框到父盒子的内边框的距离;

    scroll:鼠标滑轮从上到下,从左到右,卷起的距离,动态的数据

    window.onscroll(function(){}) : onscroll是动态监听滚动距离事件名,window是对象,计算谁就算谁

    scrollTop:到父盒子的距离,不包含border,即 内容+padding,可视高度

    scrollLeft/Width/Height:内容+padding

      

    回到顶部

  • 相关阅读:
    [SoapUI] UrlEncode编码/UrlDecode解码网站
    [Token] 从index.jsp中获取Token
    [Groovy]获取当前活动的Environment,获取response中节点的name和节点的value
    [Cookie] Clear Cookie
    [Groovy] Groovy API
    [Schema] I have updated my XML Schema for my service but SoapUI still generates/validates according to the old schema.
    [SoapUI] SoapUI可以做到些什么?功能有多强大?
    [Training Video
    [JSON] Validating/Asserting JSON response with Jsonlurper
    华中农业大学第四届程序设计大赛网络同步赛 I
  • 原文地址:https://www.cnblogs.com/sunxiuwen/p/9482741.html
Copyright © 2020-2023  润新知