>  기사  >  웹 프론트엔드  >  js 지연 로딩 아이디어 및 첫 번째 화면 지연 로딩 설명

js 지연 로딩 아이디어 및 첫 번째 화면 지연 로딩 설명

巴扎黑
巴扎黑원래의
2017-07-24 14:31:521873검색

기능: 페이지 열기 속도 보장(홈 페이지가 3초 이내에 열리지 않으면 데드 페이지로 간주)

원리:

  1), 첫 화면 콘텐츠의 그림 : 먼저 해당 기본 이미지가 차지하는 영역을 제공합니다(기본 이미지는 매우 작아야 하며 일반적으로 5kb 내에서 유지될 수 있음). 첫 번째 화면 콘텐츠가 로드된 후(또는 지연 시간이 제공될 수 있음) 로드를 시작합니다.

 2) 다른 화면의 사진: 기본 사진도 자리 표시자로 사용됩니다. 스크롤 막대가 해당 영역으로 스크롤되면 실제 사진 로드가 시작됩니다.

확장: 비동기 데이터 로드 중 처음 두 화면의 데이터만 로드되어 바인딩됩니다. 페이지가 해당 영역으로 스크롤되면 데이터 바인딩 및 렌더링 데이터가 다시 요청됩니다. 자세한 내용은 아래 사진을 참고하세요

 

첫 화면의 지연 로딩 코드는 다음과 같습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{
            padding:0;
            margin:0;
            font-size:14px;
        }
        #banner{
            margin:10px auto;
            width:300px;
            height:150px;
            border:1px solid green;
            background:url('img/default.gif') no-repeat center center;/*给当前的区域加一个默认图占位,告诉用户此处的图片正在加载中*/}
        #banner img{
            display:none;/*在开始的时候IMG的SRC属性没有地址,这样的话在IE浏览器中会显示一张碎图,不美观,所以我们让其默认是隐藏的,当真实的图片加载完成后在显示*/width:100%;
            height:100%;
        }</style>
</head>
<body>
    <div id=&#39;banner&#39;>
        <!--trueImg是当前标签的自定义属性,存储的是真实图片的地址-->
        <img src="" alt="" trueImg="img/jd.jpg">
    </div>
    <script>var banner = document.getElementById('banner'),imgFir = banner.getElementsByTagName('img')[0]
        window.setTimeout(function(){// imgFir.src = imgFir.getAttribute('trueImg');// imgFir.style.display = "block"//以上处理还是不完整的:如果我们获取的真实图片的地址是错误的,赋值给IMG的SRC属性的时候,不仅控制台会报错,而且页面中还会出现碎图//获取图片的地址,验证地址的有效性,是有效的才赋值,不是有效的是不进行处理的// var oImg = document.createElement('img')var oImg = new Image;//创建一个临时的IMG标签oImg.src = imgFir.getAttribute('trueImg');
            oImg.onload = function(){//当图片能够正常加载imgFir.src = this.src;
                imgFir.style.display = "block";
                oImg = nullconsole.log('加载完成')
            }
            console.log('正在加载中...')
        },500)</script>
</body>
</html>
여러 화면에서 단일 이미지의 지연 로딩

구체적인 코드는 다음과 같습니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{
            padding:0;
            margin:0;
            font-size:14px;
        }
        #banner{
            margin:10px auto;
            width:300px;
            height:150px;
            border:1px solid green;
            background:url('img/default.gif') no-repeat center center;/*给当前的区域加一个默认图占位,告诉用户此处的图片正在加载中*/}
        #banner img{
            display:none;/*在开始的时候IMG的SRC属性没有地址,这样的话在IE浏览器中会显示一张碎图,不美观,所以我们让其默认是隐藏的,当真实的图片加载完成后在显示*/width:100%;
            height:100%;
        }</style>
</head>
<body>
    <div id=&#39;banner&#39;>
        <!--trueImg是当前标签的自定义属性,存储的是真实图片的地址-->
        <img src="" alt="" trueImg="img/jd.jpg">
    </div>
    <script>var banner = document.getElementById('banner'),imgFir = banner.getElementsByTagName('img')[0]

        window.onscroll = function(){if(banner.isLoad){return;
            }var A = banner.offsetHeight+utils.offset(banner).top;var B = utils.win("clientHeight") + utils.win("scrollTop");if(A<B){//当条件成立,我们加载真实的图片,第一次加载完成后,我们在让页面滚动的过程中A<B一直成立,又重新执行下面的操作,导致了重复给一个容器中的图片进行加载var oImg = new Image;
                oImg.src = imgFir.getAttribute('trueImg');
                oImg.onload = function(){
                    imgFir.src = this.src;
                    imgFir.style.display = 'block';
                    oImg = null;
                    
                }
                banner.isLoad = true;//设置一个自定义属性告诉浏览器我已经把图片加载完了(不管是否正常的加载,只要处理过一次以后都不需要处理了)}
        }</script>
</body>
</html>

위 내용은 js 지연 로딩 아이디어 및 첫 번째 화면 지연 로딩 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.