lazy loading טעינה איטית
לפעמים רוצים שדף יעלה מהר בטעינה ראשונית, אפשר לגרום לדף לעלות יותר מהר אם לא נטען את התמונות בהעלאה אלא רק אחר כך במיוחד אם יש תמונות בדף שלא מוצגות בטעינה הראשונית אלא רק אחרי לחיצה והם על display:none. כי למרות שהם לא מוצגות הם מאטות את טעינת הדף
השיטה אומרת ככה בטעינה הראשונית לא להשים ב src של התמונה את הקישור האמיתי אלא בשדה נוסף שנקרא לו data-src
דוגמא :
<img src="blank.gif" class="lazy" data-src="/images/full-size.jpg" width="240" height="152">
ולאחר טעינת הדף להחליף את הקישור בקישור האמיתי.
/* lazyload.js (c) Lorenzo Giuliani
* MIT License (http://www.opensource.org/licenses/mit-license.html)
*
* expects a list of:
* `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">`
*/
!function(window){
var $q = function(q, res){
if (document.querySelectorAll) {
res = document.querySelectorAll(q);
} else {
var d=document
, a=d.styleSheets[0] || d.createStyleSheet();
a.addRule(q,'f:b');
for(var l=d.all,b=0,c=[],f=l.length;b<f;b++)
l[b].currentStyle.f && c.push(l[b]);
a.removeRule(0);
res = c;
}
return res;
}
, addEventListener = function(evt, fn){
window.addEventListener
? this.addEventListener(evt, fn, false)
: (window.attachEvent)
? this.attachEvent('on' + evt, fn)
: this['on' + evt] = fn;
}
, _has = function(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
;
function loadImage (el, fn) {
var img = new Image()
, src = el.getAttribute('data-src');
img.onload = function() {
if (!! el.parent)
el.parent.replaceChild(img, el)
else
el.src = src;
fn? fn() : null;
}
img.src = src;
}
function elementInViewport(el) {
var rect = el.getBoundingClientRect()
return (
rect.top >= 0
&& rect.left >= 0
&& rect.top <= (window.innerHeight || document.documentElement.clientHeight)
)
}
var images = new Array()
, query = $q('img.lazy')
, processScroll = function(){
for (var i = 0; i < images.length; i++) {
if (elementInViewport(images[i])) {
loadImage(images[i], function () {
images.splice(i, i);
});
}
};
}
;
// Array.prototype.slice.call is not callable under our lovely IE8
for (var i = 0; i < query.length; i++) {
images.push(query[i]);
};
processScroll();
addEventListener('scroll',processScroll);
}(this);
יש סקריפטים בשביל זה :
http://www.appelsiini.net/projects/lazyload
הסבר :
https://css-tricks.com/snippets/javascript/lazy-loading-images/
פלאגין של וורדפרס שעושה את זה :
https://wordpress.org/plugins/lazy-load/
שאלה שהרבה פעמים חוזרת על עצמה….
האם כאשר נשים אלמנט ב display:none זה ישפר את מהירות טעינת האתר?
תשובה : לא. עדיין התמונה תיטען, אולי זה יעזור ברינדור אבל זה זניח.
כאשר הדפדפן מקבל תשובה מהשרת, ישנם בגדול 3 מנועים שנכנסים לפעולה. כל מנוע כזה הוא רכיב בדפדפן שאחראי על עיבוד חלק מסויים מהמסמך שמגיע מהשרת.
מנוע הHTML מפרסס את הHTML שבמסמך ובונה את הDOM. לאחר מכן נכנס מנוע הJS לפעולה ומפרסס את קוד הJS שבמסמך. בסוף נכנס מנוע הCSS, מפרסס את קוד CSS שבמסמך, ומרנדר אותו על המסך. במילים אחרות, מנוע הCSS עובר על כל הגדרות הCSS שקיימות במסמך, משייך כל הגדרה לאלמנט המתאים במסמך, ועושה עוד דברים אחרים. בסוף התהליך המנוע מחשב איפה למקם כל אלמנט על המסך ומצייר אותו במיקום הנבחר (מרנדר).
חשוב לציין שהתהליך שתיארתי למעלה הוא להמחשה בלבד ולא כולל את כל הפרטים. התהליך והסדר שבו הדברים קורים משתנה בין דפדפן לדפדפן ותלוי במימוש של כל מנוע ומנוע.
עכשיו בוא ניקח את השאלה שלך וניישם על דוגמא קיצונית: נעשה display: none; על אלמנט הbody, כך שלמעשה אנחנו נסתיר את גוף המסמך.
מה שיקרה זה שדפדפן יטען את כל התוכן מהשרת באופן רגיל (לא חסכנו כלום בטעינה) ויעשה את אותה העבודה לעיבוד הבקשה (כל המנועים יעבדו רגיל), הוא אפילו יצייר את כל האלמנטים שבתוך הbody, שזה בעצם המסמך עצמו (!), ואז בסוף יגיעו להגדרה של display ויסתיר את המסמך, כך שנראה דף ריק.
כלומר לפי הדוגמא הזאת לא חסכנו בכלום.
שוב, ייתכן שזה לא מדוייק ושהדפדפנים עושים אופטימיזציה כזאת או אחרת בשביל להיות יותר יעילים, (למשל רואים את ההגדרה של display וחוסכים רינדור של האלמנט, במקרה שלנו – כל המסמך) אבל אין לנו דרך ממש לדעת את זה ובכל מקרה גם אם היה לנו, לא כדאי לכתוב קוד שמותאם למימוש ספציפי.
לכן, לסיום: זה לא הדרך ליעל מהירות טעינת דף או מהירות הצגת הדף ע״י הדפדפן. השיפור שתקבל, אם בכלל, הוא זניח. אם אתה מחפש לעשות אוטימיזציה לדפים שלך, חפש במקום אחר (אופטימיזציה בשרת, קאשינג וכו)
ניתן לבדוק את מהירות טעינת האתר ע"י כלי של גוגל
https://developers.google.com/speed/pagespeed/insights/
מכניסים את האתר הוא עושה אנליזה נותן ציון, ואומר גם מה צריך לתקן כלי מאוד מומלץ.