懶加載預加載問題

1、懶加載 占位圖、預覽圖 按需加載
1)原理
1>不加載全部圖片
2>首先顯示在頁面中的圖,首先進行加載
3>當屏幕發(fā)生滾動的時候,判斷圖片是否進入用戶視野,來決定圖片是否加載

2)編寫步驟
    1>首先,不要將圖片地址放到src屬性中,而是放到其它屬性(data-original)中
    2>頁面加載完成后,根據(jù)scrollTop判斷圖片是否在用戶的視野內(nèi),如果在,則將data-original屬性中的值取出存放到src屬性中
    3>在滾動事件中重復判斷圖片是否進入視野,如果進入,則將data-original屬性中的值取出存放到src屬性中

3)插件
    $("img").lazyload();
    注意:圖片需要提前設置高度

2、預加載 通常用于游戲

1)原理:
    提前加載圖片,當用戶需要查看時可直接從本地緩存中渲染
2)圖片存儲的形式
    1>圖片存于數(shù)組
    2>圖片存于對象   推薦
3)封裝:
    1>傳參:傳遞一個對象,數(shù)據(jù)都變?yōu)樵搶ο蟮膶傩?    2>回調(diào)函數(shù)
    3>時刻做判斷處理

3、懶加載與預加載的基本概念。

1)概念:
    懶加載也叫延遲加載:JS圖片延遲加載,延遲加載圖片或符合某些條件時才加載某些圖片。
    預加載:提前加載圖片,當用戶需要查看時可直接從本地緩存中渲染。

2)區(qū)別:
    兩種技術的本質(zhì):兩者的行為是相反的,一個是提前加載,一個是遲緩甚至不加載。懶加載對服務器前端有一定的緩解壓力作用,預加載則會增加服務器前端壓力。

3)懶加載的意義及實現(xiàn)方式有:
    意義: 
        懶加載的主要目的是作為服務器前端的優(yōu)化,減少請求數(shù)或延遲請求數(shù)。
    實現(xiàn)方式: 
        1.第一種是純粹的延遲加載,使用setTimeOut或setInterval進行加載延遲.
        2.第二種是條件加載,符合某些條件,或觸發(fā)了某些事件才開始異步下載。
        3.第三種是可視區(qū)加載,即僅加載用戶可以看到的區(qū)域,這個主要由監(jiān)控滾動條來實現(xiàn),一般會在距用戶看到某圖片前一定距離遍開始加載,這樣能保證用戶拉下時正好能看到圖片。

4)預加載的意義及實現(xiàn)方式有:
    意義:
        預加載可以說是犧牲服務器前端性能,換取更好的用戶體驗,這樣可以使用戶的操作得到最快的反映。
    實現(xiàn)方式: 
        實現(xiàn)預載的方法非常多,可以用CSS(background)、JS(Image)、HTML(<img />)都可以。常用的是new Image();設置其src來實現(xiàn)預載,再使用onload方法回調(diào)預載完成事件。只要瀏覽器把圖片下載到本地,同樣的src就會使用緩存,這是最基本也是最實用的預載方法。當Image下載完圖片頭后,會得到寬和高,因此可以在預載前得到圖片的大小(方法是用記時器輪循寬高變化)。

1.簡單封裝一個預加載 懶加載盡量用插件
function preload(obj){

var data = obj.data;
var doneFn = obj.doneFn;
var progressFn = obj.progressFn;

var allCount = 0;
for(var key in data){
    allCount++;
}

//創(chuàng)建一個空對象,用于存放加載好的圖片對象
var imgsObj = {};

//遍歷對象
for(var key in data){

    var value = data[key]; //獲取圖片的src
    //創(chuàng)建img對象
    var img = new Image();
    img.src = value;

    // imgsObj.key = img; 這里不可以這樣寫,因為這樣會使對象里面所有的屬性名都為key會相互覆蓋
    imgsObj[key] = img; //這樣寫,這里的key是個變量,不會產(chǎn)生上述的問題
    var doneCount = 0;
    img.onload = function(){
        doneCount++;

        //計算當前的進度值
        var v = doneCount/allCount*100;
        if (progressFn) {
            progressFn(v);
        };

        if (doneCount == allCount) {
            if (doneFn) {
                doneFn(imgsObj);
            };
        };
    }
}

}

4、ES6模板字符串

1)ES6引入了一種新型的字符串字面量語法,我們稱之為模板字符串(template strings)。除了使用反撇號字符 ` 代替普通字符串的引號 ' 或 " 外,它們看起來與普通字符串并無二致.

2)模板占位符中的代碼可以是任意JavaScript表達式,所以函數(shù)調(diào)用、算數(shù)運算等這些都可以作為占位符使用,你甚至可以在一個模板字符串中嵌套另一個,我稱之為模板套構(template inception)。 

3)如果這兩個值都不是字符串,可以按照常規(guī)將其轉(zhuǎn)換為字符串。例如:如果action是一個對象,將會調(diào)用它的.toString()方法將其轉(zhuǎn)換為字符串值。 

4)如果你需要在模板字符串中書寫反撇號,你必須使用反斜杠將其轉(zhuǎn)義:`\``等價于"`"。 

5)同樣地,如果你需要在模板字符串中引入字符$和{。無論你要實現(xiàn)什么樣的目標,你都需要用反斜杠轉(zhuǎn)義每一個字符:`\$`和`\{`。

6)與普通字符串不同的是,模板字符串可以多行書寫. 

區(qū)別:
offset().top 相對當前視口的相對偏移
position().top 相對父元素的偏移

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、懶加載 1.什么是懶加載? 懶加載也就是延遲加載。當訪問一個頁面的時候,先把img元素或是其他元素的背景圖片路...
    xiaolizhenzhen閱讀 70,628評論 18 160
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,189評論 25 708
  • 1、懶加載1.什么是懶加載?懶加載也就是延遲加載。當訪問一個頁面的時候,先把img元素或是其他元素的背景圖片路徑替...
    Gaochengxin閱讀 407評論 1 2
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 14,168評論 1 92
  • 15日晚間,有網(wǎng)友爆料,稱《太子妃》遭廣電強制下線,理由則是“有傷風化”。 《太子妃》劇照 《太子妃》劇情GIF圖...
    時尚show閱讀 560評論 0 0

友情鏈接更多精彩內(nèi)容