簡體   English   中英

使用base64預加載圖像

[英]Preloading Images using base64

我為我的用戶制作了一個“拖放”文件上傳工具。 我在13個PMG圖像中創建了一個上傳進度條,並使用jQuery對其進行了動畫處理。 如果用戶只是同時刪除一個或兩個文件,那么這種方法很有效。 但我注意到,如果用戶丟棄10個文件,瀏覽器會對每個圖像發出請求(130個請求)。 有時瀏覽器從緩存中獲取這些圖像,但有時不會。 所以,我的解決方案是預加載這樣的圖像:

function preload()
{ 
    // create object
    imageObj = new Image();

    // set image list
    images = new Array();
    images[0]="img/ProgressBarContent.png";
    images[1]="img/ProgressbarEndEffect.png";
    images[2]="img/0.png";
    images[3]="img/1.png";
    images[4]="img/2.png";
    images[5]="img/3.png";
    images[6]="img/4.png";
    images[7]="img/5.png";
    images[8]="img/6.png";
    images[9]="img/7.png";
    images[10]="img/8.png";
    images[11]="img/9.png";
    images[12]="img/percentIcon.png";
    images[13]="img/ProgressBar.png";

    // start preloading
    for(var i = 0; i < images.length; i++) 
    {
        imageObj.src=images[i];

        if(i == (images.length-1))
        {
        //preloading done, give a visual feedback and droping functionality can be activated 
        hideLoadingOverlay();
        }     
     }
 }

但這沒有任何區別。
所以我想我可以讓PHP腳本讀取我需要的圖像,將它們編碼為base64並將它們輸出為JavaScript數組,如下所示:

$file= base64_encode( file_get_contents ( 'img/0.png') );
echo 'images["img/0.png"] = "data:image/png;base64,'.$file.'";';

這樣我也可以將圖像直接“硬編碼”到我的HTML中,對吧?
我認為在JavaScript中我可以這樣做:

$(".selector").attr("src", images['filename']);

這是一個好的解決方案嗎? 還是有“正確”/更好的方式?

謝謝!

編輯:如果舊瀏覽器不支持這個並不重要。 這些腳本用於管理區域,僅供我認識的人使用。 (他們都有現代瀏覽器。)

更好的想法可能是確保您的Web服務器為您的映像發出適當的緩存標頭,一旦您這樣做,瀏覽器將只請求它們一次並從緩存中拉出后續請求。 如果您對配置緩存設置沒有任何幫助,請隨意使用您使用的Web服務器對此答案進行評論,我將編輯我的答案。

此外,您可以在使用javascript加載頁面時預加載所有圖像,以確保瀏覽器在需要顯示時緩存它們,如下所示:

var imageObj = new Image();
var images = new Array();
images[0]="image1.jpg"
images[1]="image2.jpg"
images[2]="image3.jpg"
images[3]="image4.jpg"

for(var i=0; i < images.length; i++) {
    imageObj.src=images[i];
}

編輯,在apache2中設置緩存

您可以使用.htaccess文件在每個目錄/每個文件的基礎上配置這些設置,您可以在此處詳細了解。 基本上,您要做的是在文檔根目錄中創建.htaccess文件,並輸入如下內容:

# cache images for 10 days
<FilesMatch "\.(ico|jpg|jpeg|png|gif)$">
  Header unset Pragma
  FileETag None
  Header unset ETag
  Header set Cache-Control "max-age=864000, public, must-revalidate"
  Header unset Last-Modified
</FilesMatch>

IE不支持data URI方案(如果是,則是最近添加的)。

我已經解決了這樣一個事實:瀏覽器並不總是從緩存中獲取圖像,因為它應該是。 仔細檢查您是否在某些調用中沒有使用URI的變體,然后檢查發送的標頭是否合適,並給出最大年齡至少為一小時(如果不是更多)。

對於這種用途來說,使用pngslim或類似的方法也可以使用pngslim或者類似的方法來削減所有要發送的字節。

最好的方法是創建一個精靈,所以如果圖像是10x10並且動畫中有10幀,你將創建一個10x100的精靈。

然后你創建一個類,每個類偏移背景10像素。 不是為每個幀加載單獨的圖像,而是偏移相同的圖像以創建動畫。

在我們的情況下,CSS將如下所示:

.sprite {
    background: url('/images/sprite.png');
    display: block;
    width: 10px;
    height: 10px;
}
.sprite.frame1 {
    background-position: 0 -10px;
}
.sprite.frame2 {
    background-position: 0 -20px;
}
...

js看起來像這樣:

for (i=0;i!=11;i++) {
    document.getElementById("MyElement").className = "sprite frame" + i;
}

你得到了照片。 即使屏幕上有100個動畫,圖像也只會加載一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM