2009-02-03 18 views
5

trong một CSS như thế này:trì hoãn việc tải một hình ảnh nền css nhất định

... 
#big-menu { 
    background: #fff url(../images/big-menu.jpg) no-repeat; 
} 
#some-menu { 
    background: #fff url(../images/some-menu.jpg) no-repeat; 
} 
#some-other-menu { 
    background: #fff url(../images/some-other-menu.jpg) no-repeat; 
} 
... 

là có một cách để trì hoãn việc tải hình nền #big-menu 's, để nó tải sau khi mọi thứ khác, bao gồm tất cả các hình ảnh trong HTML và mọi nền CSS khác (số some-menusome-other-menu).

Lý do là, big-menu.jpg có kích thước rất lớn và tôi muốn nó được tải cuối cùng. Sau khi tất cả, nó chỉ phục vụ như một mắt kẹo, và có những hình nền khác có sử dụng tốt hơn thế. (chẳng hạn như các nút được sử dụng trong các nút)

Thứ tự đặt nó trong CSS hoặc sự xuất hiện của đánh dấu (#big-menu) trong HTML có liên quan gì đến những gì được tải trước không? hoặc là có một cách đáng tin cậy hơn để kiểm soát nó? javascript (jQuery ưa thích) là tốt.

+0

Xin chào andy! – alex

Trả lời

8

Thứ tự trong css không kiểm soát tài nguyên nào được tải trước, nhưng ảnh hưởng đến kiểu hiện có đang bị ghi đè hoặc kế thừa.

Thử sự kiện tải xuống JavaScript. Sự kiện chỉ thực hiện sau khi trang tải xong.

function loadBG(){ 
    document.getElementById("big-menu").style.backgroundImage="url(../images/big-menu.jpg)"; 
} 
window.onload=loadBG(); 
+0

tất cả hình ảnh và tất cả các hình nền khác đã tải xong khi chức năng này được gọi? sự kiện onload, AFAIK, được kích hoạt khi HTML, không phải hình ảnh, tải xong. – andyk

+1

Sự kiện onload được kích hoạt khi tất cả tài nguyên trên trang đã hoàn thành mã hóa, bao gồm hình ảnh và iframe và tệp css và tệp javascript. –

+0

@Pim cảm ơn vì đã làm rõ. – andyk

0

Kiểm soát khi tải hình ảnh trong CSS là không thực sự có thể. Bạn có thể thử đặt nó ở dưới cùng của StyleSheet nhưng tôi nghi ngờ bạn sẽ thấy một sự cải tiến.

2

Tôi không nghĩ rằng vị trí trong bảng tính sẽ ảnh hưởng đến nó, vì thứ tự của các yếu tố mà chúng được áp dụng sẽ quyết định hình ảnh nào sẽ được tải trước.

Bạn có thể sử dụng jQuery để tải những hình ảnh theo thứ tự đúng, mặc dù

$('firstElement').addClass('some-menu'); 
$('secondElement').addClass('some-other-menu'); 
$('lastElement').addClass('big-menu'); 

EDIT: Được rồi, vậy thì có lẽ thay vì thêm một lớp, một giải pháp tốt hơn sẽ có thêm nền trong thời gian chạy.

$('firstElement').css("background-image", "some-menu.jpg"); 
$('secondElement').css("background-image", "some-other-menu.jpg"); 
$('lastElement').css("background-image", "big-menu.jpg"); 
+0

Hình ảnh được tham chiếu trong một biểu định kiểu sẽ đi qua dây ngay cả khi chúng không được sử dụng trong bố cục thực tế. Việc thêm một lớp sẽ đơn giản trì hoãn khi chúng được hiển thị. –

4

Điều này có thể không phải là một giải pháp hoàn hảo (vì nó là một css-nền và không phải là một hình ảnh), nhưng YUI Image loader cung cấp một cách tốt để lười biếng-tải hình ảnh.

Tạo một nhóm

var imgGroup = new YAHOO.util.ImageLoader.group(window, 'load', 2); 

Sau khi tài liệu đã được nạp, hình ảnh sẽ được tải 2 giây sau nó. Xem Yahoo! Shine hoặc examples để giới thiệu.

+0

Cũng thấy liên kết này cho một jQuery tương đương: http://www.appelsiini.net/projects/lazyload –

4

Một giải pháp khác là chia nhỏ nội dung của bạn trên các tên miền khác nhau, trình duyệt sẽ chỉ yêu cầu hai nội dung vào thời gian sau đó đợi một nội dung được tải trước khi bắt đầu tiếp theo. Bạn có thể quan sát điều này với FirebugYSlow, do đó, đặt một số nội dung trên images.example.com và images1.example.com và xem điều đó có tác động không

+0

câu trả lời hay. Tôi đã nghĩ về điều đó, nhưng nó có vẻ khá cồng kềnh và không chính xác khả thi ngay bây giờ, vì tôi chỉ cần trì hoãn một hình ảnh đó và tôi không có quyền truy cập vào các tên miền phụ. Tuy nhiên, +1 :) – andyk

+1

Đáng chú ý cho năm 2013 rằng hầu hết các trình duyệt hiện đại đều tải nhiều tài sản hơn cùng một lúc. – Ally

0

Thứ tự tải xuống không thể kiểm soát được bằng css. Tuy nhiên bạn có thể sử dụng javascript để đạt được điều này.

Mặc dù không liên quan trực tiếp đến câu hỏi có thể trước khi thực hiện điều đó, bạn nên chọn hình ảnh bằng cách sử dụng smush.nó hoặc chương trình hình ảnh yêu thích của bạn tôi thấy rằng jpegs trông rất tốt khi được lưu ở chất lượng 85%. Thử nghiệm và đừng quên thiết lập máy chủ web của bạn để lưu trữ hình ảnh trong thời gian dài và sau đó vấn đề sẽ chỉ là lần đầu tiên người dùng của bạn truy cập trang web.

0

Bí quyết Javascript của Jason đã giúp tôi giải quyết vấn đề này. Tuy nhiên, tôi phải sửa lại cú pháp một chút:

function loadBG(){ 
    document.getElementById("big-menu").style.backgroundImage="url(../images/big-menu.jpg)"; 
} 
window.onload=loadBG(); 
+1

Tôi đã chỉnh sửa câu trả lời của mình để chứa cú pháp đã sửa của bạn. – gmeben