Tôi đang sử dụng hệ thống lưới CSS dựa trên tỷ lệ phần trăm. Tôi có một lưới với 4 cột, mỗi 25% tổng chiều rộng của trang. Tôi xuất thẻ hình ảnh của tôi bên trong mỗi "ô 25%" như sau:Tải trọng lười biếng với hình ảnh "phản hồi" (chiều cao không xác định)
<img src="foo.jpg" style="max-width:100%" />
Khi trình duyệt đổi kích thước, hình ảnh cũng thay đổi kích thước để điền vào 100% của mỗi ô 25%. Trình duyệt chọn một chiều cao, như thể tôi đã đặt "height: auto" (ẩn trong khi bị bỏ qua).
Bây giờ tôi muốn thêm khả năng tải chậm vào điều này. Vấn đề là trước khi hình ảnh được tải, chiều cao của chúng trên trang không xác định. Trình duyệt phải tải xuống hình ảnh & quan sát tỷ lệ khung hình của nó và tính chiều cao cho nó. Trước đó, tất cả các hình ảnh có chiều cao là 1px. Vì mỗi hình ảnh có chiều cao là 1px, tất cả chúng đều được coi là "bên trong khung nhìn" và được tải ngay lập tức.
Hiện nay tôi có một bằng chứng của khái niệm mà trước khi xuất ra các thẻ img, tôi tính toán tỷ lệ hình ảnh khía cạnh trên máy chủ, và đầu ra trong một thuộc tính dữ liệu:
<img src="foo.jpg" style="max-width:100%" data-aspect="1.7742" />
Sau đó, khi sự kiện "tài liệu sẵn sàng", tôi lặp qua mỗi hình ảnh và thiết lập một 'chiều cao' giá trị cố định bằng pixel trước khi tải lười biếng:
$('img').each(function() {
var img = $(this);
var width = img.width();
var ratio = img.data('aspectratio');
var height = width/ratio;
$(this).css('height', height+'px');
});
Điều này dường như được làm việc, theo nghĩa là nó không còn tải tất cả hình ảnh tại cùng một thời gian, nhưng chỉ tải hình ảnh khi tôi cuộn.
Tuy nhiên, có vẻ như nó có thể gây ra sự cố mới, chẳng hạn như hình ảnh bị kéo dài khi người dùng thay đổi kích thước trình duyệt. Tôi sẽ phải chuyển đổi 'chiều cao' trở lại 'tự động' khi một cuộc gọi lại kích hoạt cho tải chậm đã hoàn thành. Điều đó sẽ chăm sóc hình ảnh mà người dùng nhìn thấy - nhưng các hình ảnh dưới màn hình đầu tiên sẽ vẫn có giá trị 'chiều cao' không đúng khi trình duyệt được thay đổi kích thước. Mỗi khi trình duyệt được thay đổi kích cỡ, tôi sẽ phải lặp lại tất cả các hình ảnh trước đây dưới màn hình đầu tiên, đo chiều rộng được cập nhật, đọc tỷ lệ khung hình và cập nhật chiều cao mới, sau đó tải xuống để tải xuống bất kỳ thứ gì hiện ở trên gập lại. Nếu tôi không làm điều này, tải có thể được kích hoạt quá sớm hoặc quá muộn do những hình ảnh có giá trị độ cao sai.
Câu hỏi của tôi là, có cách nào khác để tải hình ảnh lười biếng với chiều cao không xác định, không phải là phương pháp chính xác mà tôi đã mô tả ở đây và nhánh này sẽ có gì? Có bất kỳ nhược điểm nào với phương pháp của tôi, ngoài việc là một nỗi đau cho chương trình?
Hình như bạn đã đóng đinh nó. Trình duyệt chỉ có hai cách để biết kích thước của một hình ảnh: để tải xuống hoặc chỉ định kích thước của nó trong HTML. – Blazemonger
Cảm ơn sự bảo đảm. Tôi cũng đã hình dung ra một số cách tiếp cận mà nó lười tải 4 hình ảnh đầu tiên, sau đó khối cho đến khi chúng được hoàn thành, và sau đó đánh giá lại các vị trí mới của các hình ảnh còn lại. Chỉ có vấn đề là việc ngăn chặn sẽ làm cho mọi việc chậm hơn so với việc không tải chậm ngay từ đầu. –
Ok Tôi vừa mới nhận thức được thủ thuật đệm đáy: http://thisisthat.co.uk/notebook/2013-10-07-lazy-loading-responsive-images http://andmag.se/2012/ 10/responsive-images-lazy-load-và-multiserve-images/ –