zoukankan      html  css  js  c++  java
  • 前端散记

    前端知识散记

    宏任务与微任务

    在理解这个的时候我们需要知道任务可以分为同步任务、异步任务

    而在异步任务中又被划分为宏任务、微任务

    在程序执行时,执行顺序可以简单的理解为 同步任务>微任务>宏任务

    宏任务的代表:

    1、新的程序或子程序函数被直接执行

    2、事件的回调函数

    3、setTimeout()、setInterval()

    微任务的代表:

    1、Promise .then() .cath() .finally()

    2、 MutationObserver

    3、 Object.observe

    下面举个列子,不同任务之间的执行顺序

    <body>
    
        <script>
            console.log('同步任务1');
            setTimeout(() => {
                console.log('宏任务1');
            }, 0)
            Promise.resolve().then(() => {
                console.log("微任务1");
            })
            console.log("同步任务2");
            Promise.resolve().then(() => {
                console.log("微任务2");
            })
            setTimeout(function() {
                console.log("宏任务2");
            }, 0)
            Promise.resolve().then(() => {
                console.log("微任务3");
            })
        </script>
    </body>
    

    image-20210629204831568

    图片懒加载

    图片懒加载也是前端优化性能手段的一种方法

    有两种写法

    一、利用页面高度和图片顶部距页面高度对比,加载图片

    步骤:

    1、拿到浏览器窗口的高度 window.innerHeight

    2、 拿到图片距离浏览器顶部的高度 getBoundingClientRect().top

    3、如果图片顶部高度小于浏览器的高度,则让图片加载出来

    4、使用自定义属性data-*,去处理

    代码:

    <body>
      <img data-src=""> 
      <img data-src=""> 
      <img data-src=""> 
      
      <script>
      var images=document.querySelectorAll('img')
      //设置监听
      window.addEvenTlistener('scroll',(e)=>{
         images.forEach(image=>{
         const imageTop=image.getBoundingClientRect().top
         if(imageTop<window.innerHeight){
            const data_src=image.getAttribute('data-src')
            image.setAttribute('src',data_src)
         }
         })
      })
      
      <script>
    </body>
    

    简单的理解就是去替换掉了 data-src 让浏览器能够找得到资源图片

    二、用浏览器自带的构造方法: IntersectionObserver

    代码:

    <body>
      <img data-src=""> 
      <img data-src=""> 
      <img data-src=""> 
    
    
    <script>
     let images = document.querySelectorAll('img')
     const callback = entries => {
                console.log(1);
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        const image = entry.target
                        const data_src = image.getAttribute('data-src')
                        image.setAttribute('src', data_src)
                        observer.unobserve(image)
                        console.log('触发');
                    }
                })
            }
             const observer = new IntersectionObserver(callback)
    
            images.forEach(image => {
                observer.observe(image)
            })
    </script>
    
    
    </body>
    

    这里需要注意,IntersectionObserver中有两个回调函数,这里只写出一个,callback。

    在本次案列中target属性指向的是img元素

    上面的isIntersecting为true的时候代表着已经观察到了图片

    IntersectionObserver的callback会被触发两次,

    observer 定义的一个实列,观察动作

    observer.observe(image):这个是属于观察状态

    observer.unobserve(image):这个是属于取消观察状态,当图片被看到后,就取消观察状态,这样回调函数就不会被触发

    常见的倒计时效果

    计算机的存储时间是以毫秒为基本单位的

    一天=24小时

    一小时=60分钟

    一分钟=60秒

    一秒=1000毫秒

    做一个倒计时时间肯定是预期时间减去当前时间

    代码部分:

    <body>
    <section>
            <p>下面是一些倒计时效果</p>
            <span class="daySpan"></span>
            <span class="hourSpan"></span>
            <span class="minuteSpan"></span>
            <span class="secondSpan"></span>
        </section>
        <script>
         const daySpan = document.querySelector('.daySpan')
            const hourSpan = document.querySelector('.hourSpan')
            const minuteSpan = document.querySelector('.minuteSpan')
            const secondSpan = document.querySelector('.secondSpan')
            deadline=new Date('2021-8-1 00:00') //设定一个预期时间
            function down() {
                const now = new Date()  //这里获取当前时间
                timer = deadline - now   //倒计时拿到的时间,总毫秒数
                let day, hour, minute, second //这些都是时间戳
                if (timer < 0) {
                    return 0
                }
    
                second = Math.floor(timer / 1000 % 60)
                minute = Math.floor(timer / 1000 / 60 % 60)
                hour = Math.floor(timer / 1000 / 60 / 60 % 24)
                day = Math.floor(timer / 1000 / 60 / 60 / 24)
    
                daySpan.innerHTML = day + '天'
                hourSpan.innerHTML = hour + '时'
                minuteSpan.innerHTML = minute + '分'
                secondSpan.innerHTML = second + '秒'
    
                setTimeout(down, 1000)
            }
            down()
        </script>
    </body>
    
  • 相关阅读:
    流媒体技术原理及播放方式(浅显易懂)
    实时音视频技术难点及解决方案
    流媒体技术简介
    DSP广告系统架构及关键技术解析(转)
    大型网站架构 图片服务器分离
    大话铁道部12306订票系统云架构
    技术揭秘12306改造(一):尖峰日PV值297亿下可每秒出票1032张
    12306火车票预定系统的需求分析
    PowerDesigner16.5 使用遇到的问题
    Ubuntu不输入密码执行sudo命令方法介绍
  • 原文地址:https://www.cnblogs.com/AFBF/p/14959380.html
Copyright © 2011-2022 走看看