با سلام و احترام خدمت شما خوانندگان فرهیخته؛ با قسمت دوم از مبحث Lazy Loading در خدمت شما هستم. می توانید قسمت اول را در این لینک بخوانید. در این قسمت از مقاله شما را با 5 روش مختلف از لود تنبل آشنا می کنیم. این 5 روش پرطرفدار ترین روش های حال حاضر برای پیاده سازی لود تنبل می باشند.
آقای والش اسکریپت اختصاصی خودشان را برای لود تنبل (Lazy Loading) پیشنهاد داده اند. این روش به این شکل است که ویژگی src مربوط به یک عکس در متن HTML با ویژگی data-src جایگزین می شود:
<img data-src="image.jpg" alt="test image">
در فایل های CSS عنصر مورد نظر با ویژگی data-src مخفی است و زمانی که بارگذاری شد توسط افکت انتقال نرم CSS نمایان می شود.
img { opacity: 1; transition: opacity 0.3s; } img[data-src] { opacity: 0; }
حالا جاوا اسکریپت ویژگی src را به هر کدام از عناصر دارای تگ img اضافه می کند و مقدار آن را برابر با مقدار data-src قرار می دهد. سپس زمانی که تصویر بارگذاری شد، جاوا اسکریپت ویژگی data-src را از تمامی تصاویر حذف می کند.
[].forEach.call(document.querySelectorAll('img[data-src]'), function(img) { img.setAttribute('src', img.getAttribute('data-src')); img.onload = function() { img.removeAttribute('data-src'); }; });
آقای والش روش دیگری را برای زمانی که جاوا اسکریپت از کار می افتد نیز پیشنهاد داده اند؛ می توانید در مورد این روش بیشتر در وبلاگ دیوید والش بخوانید.
نکته ی مثبت این روش: اجرای آن بسیار ساده است.
نکته ی منفی این روش: از قابلیت بارگذاری در هنگام اسکرول پشتیبانی نمی کند؛ به عبارت دیگر مرورگر تمامی تصاویر را، فارغ از اینکه کاربر به قسمت خاصی از صفحه اسکرول کرده باشد یا خیر، بارگذاری می کند.
فرق این روش با حالت عادی چیست؟
فرق این روش با حالت عادی چیست؟
تفاوت آنجا است که وب سایت تا بارگذاری تمام تصاویر منتظر نمی ماند و چشم انداز اولیه سریع تر به کاربر نمایش داده می شود (چشم انداز اولیه چیست؟) اما دیگر شاهد کاهش پنهای باند مصرفی نخواهیم بود چرا که تمامی تصاویر، مستقل از اسکرول کردن کاربر، بارگذاری خواهند شد.
پایه ی روش خانم آزبورن بر اساس پیشرفت تدریجی است.
دلیل نام گذاری این روش به چه صورت بوده است؟ چرا "پیشرفت"؟
به این دلیل که در این روش استفاده از جاوا اسکریپت برای بارگذاری تصاویر به جای حالت عادی (HTML و CSS)، یک پیشرفت محسوب می شود.
چرا "تدریجی" و مرحله ای؟
به این دلیل که اگر از روشی برای بارگذاری تصاویر استفاده کنیم که وابسته به جاوا اسکریپت باشد، با از کار افتادن جاوا اسکریپت یا نقص اسکریپت به هر دلیل ممکن است هیچ تصویری در سایت شما بارگذاری نشود!
اما این روش طوری عمل میکند تا در صورت از کار افتادن جاوا اسکریپت، باز هم تصاویر به مخاطب نمایش داده شود. ساختار ساده از پیاده سازی این روش را می توانید در این لینک ببینید و برای نگاه به ساختار پیچیده تر این روش به این لینک سر بزنید.
اسکریپت خالصِ این روش در حالت ساده به این شرح است (پروژه ی کامل در لینک بالا):
<script> registerListener('load', setLazy); registerListener('load', lazyLoad); registerListener('scroll', lazyLoad); var lazy = []; function setLazy(){ lazy = document.getElementsByClassName('lazy'); console.log('Found ' + lazy.length + ' lazy images'); } function lazyLoad(){ for(var i=0; i<lazy.length; i++){ if(isInViewport(lazy[i])){ if (lazy[i].getAttribute('data-src')){ lazy[i].src = lazy[i].getAttribute('data-src'); lazy[i].removeAttribute('data-src'); } } } cleanLazy(); } function cleanLazy(){ lazy = Array.prototype.filter.call(lazy, function(l){ return l.getAttribute('data-src');}); } function isInViewport(el){ var rect = el.getBoundingClientRect(); return ( rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) ); } function registerListener(event, func) { if (window.addEventListener) { window.addEventListener(event, func) } else { window.attachEvent('on' + event, func) } } </script>
نکات مثبت این روش:
برای استفاده ی سریع و بدون دردسر از این تکنیک می توانید این پلاگین را بعد از لود کردن جی کوئری در سورس کد خود، لود کنید.
این پلاگین دو نسخه دارد؛ نسخه ی اول یا jquery.lazyloadxt.js که مخصوص اجرای تکنیک لود تنبل یا Lazy Loading برای تصاویر است و نسخه ی دوم یا jquery.lazyloadxt.extra.js که مخصوص لود تنبل برای فیلم ها، iframe ها و تمام عناصری است که ویژگی src دارند. نمونه ی بارگذاری در سورس کد:
<script src="jquery.js"></script> <script src="jquery.lazyloadxt.js"></script>
اگر پلاگین را به حال خود رها کنید به صورت اتوماتیک شروع به کار می کند اما اگر نیاز دارید در قسمتی از کد خود آن را به صورت دستی اجرا کنید می توانید مانند کد زیر عمل کنید:
$(elements).lazyLoadXT();
اگر از جی کوئری استفاده نمی کنید باید بدانید این پلاگین یک نسخه ی سبک تر با نام jqlight.lazyloadxt.min.js نیز ارائه می کند که نیازی به جی کوئری ندارد. نمونه ی بارگذاری:
<script src="jqlight.lazyloadxt.js"></script> <script src="jquery.lazyloadxt.js"></script>
پس از لود این پلاگین، باید تمامی تصاویر در سورس کد خود را با ویژگی data-src (به جای src) وارد کنید.
این پلاگین ویژگی های بسیار زیادی را ارائه می دهد که توضیح تمامی آن ها در یک مقاله ممکن نیست؛ به طور مثال:
$.lazyLoadXT.onload.addClass = 'animated bounceOutLeft';
قانون کلی در مورد کار با پلاگین ها، فریم وورک ها و هر نوع منابع اینترنتی
اکثر آنها قسمتی به نام documentation یا usage یا installation و ... دارند. قبل از استفاده حتما آن ها را بخوانید تا با روش کار و استفاده از آن ها آشنا شوید. اکثر این منابع به صورت متن باز نوشته شده اند و متعلق به کمپانی خاصی نیستند؛ بنابراین ممکن است از استاندارد های رایج وب پیروی نکنند و شما را سر در گم کنند.
پلاگین bLazy.js یک پلاگین لود تنبل سبک (حجم حدود 1.2 کیلوبایت پس از Gzip و minify شدن) و مستقل برای جاوا اسکریپت است. به نقل از وبسایت رسمی bLazy :
bLazy is a lightweight lazy loading image script (less than 1.2KB minified and gzipped). It lets you lazy load and multi-serve your images so you can save bandwidth and server requests. The user will have faster load times and save data loaded if he/she doesn’t browse the whole page.
نکات زیر از ویژگی های مثبت آن به شمار می روند:
مثال ساده از بارگذاری:
<img class="b-lazy" src="placeholder.gif" data-src="image.jpg" alt="test image">
حالا باید تگ img را به شکل زیر تغییر دهید:
- کلاس .b-lazy را اضافه کنید.
- از یک عکس دلخواه به عنوان placeholder برای ویژگی src استفاده کنید.
سپس می توانید در جاوااسکریپت blazy را صدا بزنید و تغییرات خود را اعمال کنید:
var bLazy = new Blazy({ //options here });
برای اطلاعات بیشتر:
اگر به مثالی که در قسمت قبل از وب سایت Medium ذکر کردیم توجه کرده باشید متوجه این مورد خواهید شد. تصاویر در وب سایت Medium قبل از بارگذاریِ کامل، به صورت تار و بلوری دیده می شوند؛ مثال تصویری:
روش های مختلفی برای پیاده سازی این تکنیک وجود دارد اما از نظر من روش بهتر، روش Craig Buckler است. مزیت های این روش:
می توانید سورس کد این پروژه را در صفحه ی گیت هاب (GitHub) آن دانلود کنید.
امیدوارم از این مقاله استفاده ی کافی را برده باشید، در پناه حق.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.