web API 第五天(+第六天补充 加载事件,三大家族)

172 阅读3分钟

滚动事件和加载事件

一、滚动事件

本质:当页面进行滚动时触发的事件

作用:很多网页需要检测用户把页面滚动到某个区域后做处理

事件名:scroll

1649750480556

注意:如果要监听某个元素内部滚动直接给元素加事件即可

<script>
       	window.addEventListener(`scroll`,function(){
            console.log(`滚了`);
        }) 

        let div = document.querySelector(`div`)
        div.addEventListener(`scroll`,function(){
            console.log(`div滚`);
        })
</script>

补充知识:我想知道当前页面滚动多少距离?

<script>
        window.addEventListener(`scroll`,function(){
            //获取当前页面滚动距离
            console.log(document.documentElement.scrollTop);
        })
</script>

滚动距离:document.documentElement.scrollTop

滚动固定案例(滚动到某个距离 某个标签固定顶部)

<script>
      let nav = document.querySelector(`nav`)
      let head = document.querySelector(`header`)

      window.addEventListener(`scroll`,function(){
        let scrollTop = document.documentElement.scrollTop

        if(scrollTop>=250){
            nav.classList.add(`fixed`)
            head.style.marginBottom = 150+`px`
        }else{
            nav.classList.remove(`fixed`)
            head.style.marginBottom = 0

        }
      })
</script>

火箭回到顶部案例

<script>
        let rab = document.querySelector(`.actGotop`)

        window.addEventListener(`scroll`,function(){
		let scrollTop = document.documentElement.scrollTop				
                if(scrollTop>=1000){
                rab.style.display = `block`
            }else{
                rab.style.display = `none`
            }
        })

        rab.addEventListener(`click`,function(){
            document.documentElement.scrollTop = 0 
        })
</script>
代码进阶(点击火箭移动上去,不是直接跳转)
<script>
        let rab = document.querySelector(`.actGotop`)

        
        window.addEventListener(`scroll`,function(){
            let scrollTop = document.documentElement.scrollTop
            if(scrollTop>=1000){
                rab.style.display = `block`
            }else{
                rab.style.display = `none`
            }
            
        })
        
        rab.addEventListener(`click`,function(){
            let height =  document.documentElement.scrollTop
            setInterval(function(){ 
                if(height>0){
                    height = height-50
                    document.documentElement.scrollTop=height
                }
            },1)
        })
</script>

思路重点:定时器

二、加载事件 (面试)

​ 本质:加载外部资源(如图片,外联CSS和JS等)加载完毕时触发的事件

​ 作用:有时候需要等待页面资源全部处理完再做一些事情

load事件:等所有资源加载完毕后才触发的操作

1649900198168

<body>
    <h1>大标题</h1>
    <img
      src="https://dss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/33867296_1452769018_259_194.jpg"
      alt=""
    />
    <!-- load 作用 希望在H1上输出图片高度 -->
    <script>
        //如果不加load 图片内容还没生成就输出高度 为0
        window.addEventListener(`load`,function(){
            //等图片完全加载 内容返回 才触发
            const img = document.querySelector(`img`)
            
            //获取图片标签高度
            document.querySelector(`h1`).innerHTML=img.height
        })
    </script>
</body>

DOMContentLoaded事件:标签触发事件触发,不需要等内容加载

1649903578920

<script>
        //以前写JS 习惯写在head标签中 是JS先执行 DOM还没开始加载
        //所以要添加 等待标签加载完毕 才去获取Dom元素 不然h1不会改变
        document.addEventListener(`DOMContentLoaded`,function(){
            const h1 = document.querySelector(`h1`)
            h1.innerText = `可以修改吗`
        })
    </script>
</head>
<body>
    <h1>大标题</h1>
    <img
      src="https://dss0.bdstatic.com/-0U0bnSm1A5BphGlnYG/tam-ogel/33867296_1452769018_259_194.jpg"
      alt=""
    /> 
</body>

注意点

​ 1.当HTML文档完全加载解析后,这个事件就触发,无需等待样式表、等内容完全加载。

​ 2.老代码会把script写在head中,这个时候先执行JS,DOM元素都还没加载,会找不到DOM元素。

​ 3.现在建议都把代码卸载body底部,这样dom标签加载了,才去获取。

​ 4.两者区别点要记住,面试要用!

元素大小和位置

一、scroll家族

​ 作用:当我们想要页面滚动,然后需要用其滚动距离做设置时。

1.获取宽高

​ 本质:获取元素总宽高,返回数字不带单位

​ 语法:scrollWidth和scrollHeight

​ 细节:

​ 1.scrollWidth 不包含滚动条 边框啥的会把内容挤进去

​ 2.scrollHeight 等于容器可以滚动的大小

​ 3.两者都是获取可以滚动区间内容(容器)的宽高!!!

​ 4.PC滚动条占17px 移动端滚动条不占大小

2.获取位置

​ 语法:scrollLeft和scrollTop

​ 细节:

​ 1.页面滚动 使用window.add("scroll")事件

​ 2.页面获取滚动距离(位置)document.dE.scrollTOP

​ 3.元素使用本质相同(区别在于获取的是元素内的滚动)

1649905230680

<script>
        const scrollDom = document.querySelector(`.scroll-dom`)

        /* 
        scrollWidth 不包含滚动条 边框啥的会把内容挤进去
        scrollHeight 等于容器可以滚动的大小
        PC端滚动条 占17PX大小 移动端滚动条 不占大小
        */
        scrollDom.addEventListener(`scroll`,function(){
            // console.log(scrollDom.scrollWidth);
            // console.log(scrollDom.scrollHeight);

            // 获取滚动距离
            console.log(scrollDom.scrollLeft);
        })
</script>

二、offset家族

​ 作用:以前做过滚动固定案例,是自己算滚动多少时,就开始设置。offset可以得到元素在页面自身的宽高/位置,就不用自己算。

1.获取宽高

​ 本质:获取元素自身宽高、包含元素设置的宽高、padding、边框

​ 语法:offsetWidth和offsetHeight

2.获取位置

​ 本质:获取元素距离自身定位的父元素左,上的距离

​ 语法:offsetTop和offsetLeft

细节:如果没有给父元素定位,参照页面左上角

1649905174808

<body>
    <div class="offset"></div>
    <script>
        let offset = document.querySelector(`.offset`)
        //包含滚动条大小输出300  scroll不包含输出283
        console.log(offset.offsetWidth);
        console.log(offset.offsetHeight);

        //如果没有定位父元素,获取的参照物是页面左上角
        //有父元素 参照父元素
        console.log(offset.offsetLeft);
        console.log(offset.offsetTop);
    </script>
</body>

总结

​ 1.两个获取宽高,包含滚动条

​ 2.两个获取位置,有父元素定位 获取参照父元素距离 不能找超过父元素

三.client家族

1.获取宽高

​ 本质:获取元素的可见内容部分宽高(不包含边框,滚动条等)

​ 语法:clientWidth和clientHeight

​ 细节:区别与scroll是,只能看到可见部分,滚动多少的宽高不获取。

2.获取位置

​ 本质:获取元素内容外边左边框,上边框距离

​ 语法:clientLeft和clientTop

​ 细节:只有左和上

1649906234230

最后总结:

1649906520807

综合案例

1649936107838

<script>
      let lis = document.querySelectorAll(`.indicator li`)
      let big = document.querySelectorAll(`.slides li`)

      console.log(lis);
      for (let index = 0; index < lis.length; index++) {
        lis[index].addEventListener(`click`,function(){

          /* for (let index = 0; index < lis.length; index++) {
            lis[index].classList.remove(`active`)
          } */
          document.querySelector(`.indicator .active`).classList.remove(`active`)
          this.classList.add(`active`)

          document.querySelector(`.slides .active`).classList.remove(`active`)
          big[index].classList.add(`active`)

          document.querySelector(`h3`).innerText = `第${index+1}张图的描述信息`
        }) 
      }
</script>

解题思路:

​ 1.观察HTML+CSS结构,发现有一个active类时,才有相应样式

​ 2.用JS排他思想实现

​ 3.其实轮播图都不用自己写,网上有现成的框架插件swiper插件

总结:对于轮播图来说,案例主要理解的是排他思想的使用,真实开发场景使用不会手动写轮播图;插件的使用就像查字典,根据需求插入CSS和JS等,再根据需求在插件网站上寻找和使用