Đăng bởi: CTG blog
Thứ Hai, tháng 4 04, 2011
[28]
Thủ thuật: Lazyload Jquery làm mượt ảnh và ảnh sẽ load nhanh hơn
Nguồn: appelsiini.net



Giới thiệu: Kéo tới đâu ảnh mới bắt đầu load tới đó, giảm thời gian tải ảnh. Mặc định blog khi load, sẽ load tất cả các ảnh và thành phần có trong blog. Điều này sẽ làm chậm blog nếu web hay blog có nhiều ảnh. Nhưng với lazyload thì chỉ load những ảnh lọt trong tầm mắt người nhìn.

Ngoài ra, còn có thêm hiệu ứng tải ảnh kiểu “Fade in”, khi hiện ảnh trông rất đẹp và chuyên nghiệp.

Lưu ý: Lazyload sẽ được load sau cùng, sau khi đã load hết các mã Java, js, HTML của website hay blog.


CÁCH THỰC HIỆN

1. Đăng nhập Blogger
2. Chọn: Mẫu > Chỉnh sữa HTML

3. Chèn script.

Bước 1: Yêu cầu phải có jQuery. (Có rồi thì bỏ qua)


1. Tải về máy một trong ba phiên bản jQuery sau: 1.3.1 | 1.3.2 | 1.4.3

2. Up lên host cho link direct.

- Gợi ý: Dùng host của google: http://code.google.com/
- Hướng dẫn: Here
- Sau khi up lên host, thì lấy link vừa up.

3. Tìm thẻ <head>

- Thêm vào dưới nó đoạn code sau:
(Nhớ thay jQuery.JS bằng link mới bạn vừa up lên host)

<script src='jQuery.JS' type='text/javascript'/>


* jQuery phải để nằm trên code của bước 2, lazyload mới hoạt động nhé!


Bước 2: Tìm thẻ đóng </head>

- Thêm vào trước nó đoạn code sau:

<!-- Lazy load -->
<script type='text/javascript'>
//<![CDATA[
(function($) {

$.fn.lazyload = function(options) {
var settings = {
threshold    : 0,
failurelimit : 0,
event        : "scroll",
effect       : "show",
container    : window
};

if(options) {
$.extend(settings, options);
}

/* Fire one scroll event per scroll. Not one scroll event per image. */
var elements = this;
if ("scroll" == settings.event) {
$(settings.container).bind("scroll", function(event) {

var counter = 0;
elements.each(function() {
if ($.abovethetop(this, settings) ||
$.leftofbegin(this, settings)) {
/* Nothing. */
} else if (!$.belowthefold(this, settings) &&
!$.rightoffold(this, settings)) {
$(this).trigger("appear");
} else {
if (counter++ > settings.failurelimit) {
return false;
}
}
});
/* Remove image from array so it is not looped next time. */
var temp = $.grep(elements, function(element) {
return !element.loaded;
});
elements = $(temp);
});
}

this.each(function() {
var self = this;

/* Save original only if it is not defined in HTML. */
if (undefined == $(self).attr("original")) {
$(self).attr("original", $(self).attr("src"));     
}

if ("scroll" != settings.event || 
undefined == $(self).attr("src") || 
settings.placeholder == $(self).attr("src") || 
($.abovethetop(self, settings) ||
$.leftofbegin(self, settings) || 
$.belowthefold(self, settings) || 
$.rightoffold(self, settings) )) {

if (settings.placeholder) {
$(self).attr("src", settings.placeholder);      
} else {
$(self).removeAttr("src");
}
self.loaded = false;
} else {
self.loaded = true;
}

/* When appear is triggered load original image. */
$(self).one("appear", function() {
if (!this.loaded) {
$("<img />")
.bind("load", function() {
$(self)
.hide()
.attr("src", $(self).attr("original"))
[settings.effect](settings.effectspeed);
self.loaded = true;
})
.attr("src", $(self).attr("original"));
};
});

/* When wanted event is triggered load original image */
/* by triggering appear.                              */
if ("scroll" != settings.event) {
$(self).bind(settings.event, function(event) {
if (!self.loaded) {
$(self).trigger("appear");
}
});
}
});

/* Force initial check if images should appear. */
$(settings.container).trigger(settings.event);

return this;

};

/* Convenience methods in jQuery namespace.           */
/* Use as  $.belowthefold(element, {threshold : 100, container : window}) */

$.belowthefold = function(element, settings) {
if (settings.container === undefined || settings.container === window) {
var fold = $(window).height() + $(window).scrollTop();
} else {
var fold = $(settings.container).offset().top + $(settings.container).height();
}
return fold <= $(element).offset().top - settings.threshold;
};

$.rightoffold = function(element, settings) {
if (settings.container === undefined || settings.container === window) {
var fold = $(window).width() + $(window).scrollLeft();
} else {
var fold = $(settings.container).offset().left + $(settings.container).width();
}
return fold <= $(element).offset().left - settings.threshold;
};

$.abovethetop = function(element, settings) {
if (settings.container === undefined || settings.container === window) {
var fold = $(window).scrollTop();
} else {
var fold = $(settings.container).offset().top;
}
return fold >= $(element).offset().top + settings.threshold  + $(element).height();
};

$.leftofbegin = function(element, settings) {
if (settings.container === undefined || settings.container === window) {
var fold = $(window).scrollLeft();
} else {
var fold = $(settings.container).offset().left;
}
return fold >= $(element).offset().left + settings.threshold + $(element).width();
};
/* Custom selectors for your convenience.   */
/* Use as $("img:below-the-fold").something() */

$.extend($.expr[':'], {
"below-the-fold" : "$.belowthefold(a, {threshold : 0, container: window})",
"above-the-fold" : "!$.belowthefold(a, {threshold : 0, container: window})",
"right-of-fold"  : "$.rightoffold(a, {threshold : 0, container: window})",
"left-of-fold"   : "!$.rightoffold(a, {threshold : 0, container: window})"
});

})(jQuery);
//]]>
</script>

<script type="text/javascript" charset="utf-8">
$(function() {        

$("img") // img là áp dụng với cả blog. Nếu chỉ muốn áp dụng cho một class nào đó thì thêm class đó vào trước img. Ví dụ: .post img, #content img, .comments img,… 

.lazyload({
placeholder : "LINK_HÌNH", /*Hình thay thế khi ảnh chưa load xong*/
effect: "fadeIn" /* Hiệu ứng mờ khi ảnh xuất hiện. Có thể sử dụng các hiệu ứng khác như: slideUp, slideDown,…*/

});
});
</script>

* Các tính năng thêm. Thêm vào sau dòng: effect: "fadeIn"

threshhold:100 /*Số pixel của ảnh được tải trước*/
container: $("class") /*Dùng cho class scroll được. Thay thành class bạn muốn áp dụng. 
Ví dụ: #container, #scroll, .imagescroll,…*/


Bước 3: Save template. (Lưu mẫu)


Một số mẫu hình thay thế




THE END.

6 nhận xét:

Trả lời
Only Raito nói...
lúc 23:03 4 tháng 12, 2011  

blog cua~ ban rat' hay~ cam' on ban. rat nhieu~ tiep tuc phat huy phan thu~ thuat blog hen ~ lua chon nhunG~ ban that hay va bo~ ich ~ xin loi~ vi` ko go~ chu~ tieng viet ~ vi ban` phim cua~ minh bi hu*

Trả lời
Rua nói...
lúc 06:55 5 tháng 12, 2011  

Hi, cảm ơn bạn, rất vui khi júp được bạn :cuoi

Trả lời
Đing Kiu Truê nói...
lúc 16:06 18 tháng 12, 2011  

Mình làm theo mà không được :(

Trả lời
Rua nói...
lúc 17:05 18 tháng 12, 2011  

Sao lại không được, cái này đơn giản mà.
+ Nếu dùng thêm 2 tính năng bên dưới thì có thể không thấy được hiệu ứng fadeIn.
+ jQuery phải để trên code của lazyload nó mới hoạt động nhé :)
+ Bài chứa nhiều ảnh thì dễ thấy được hiệu ứng hơn.

Trả lời
Đing Kiu Truê nói...
lúc 23:07 19 tháng 12, 2011  

Mình làm được rồi
Cảm ơn bạn nhiều lắm :mahong

Trả lời
kaka nói...
lúc 10:42 17 tháng 5, 2012  

mnhf cũng đã làm đc, quan trọng là jQuery phải để trên code của lazyload nó mới hoạt động chứ ko phải đặt sau luôn thẻ head

xem thử blog của mình nhé http://khongphaixoan.blogspot.com

Lên đầu trang
Xuống cuối trang