ساخت افکت بارگذاری شبکه ای با CSS
افکت بارگذاری شبکهای (Grid Loading) یک الگوی بصری محبوب برای نشان دادن بارگذاری محتوای شبکهای مانند کارتها، گالریها یا لیست محصولات است. در این مقاله بهصورت گامبهگام روشهای ساخت این افکت با CSS خالص، نکات بهینهسازی، دسترسپذیری و نمونههای قابل استفاده در پروژههای واقعی را بررسی میکنیم.
چرا از افکت بارگذاری شبکهای استفاده کنیم؟
- حس پایدار بودن رابط کاربری در زمان بارگذاری دادهها.
- کاهش حس تأخیر برای کاربر و افزایش ادراک سرعت.
- قابلیت تطبیق آسان با طراحی ریسپانسیو و شبکهای.
المانهای اصلی یک Skeleton Grid
- شبکهی قالب (CSS Grid یا Flexbox) برای جایگزینی محتوای نهایی.
- استایلهای پسزمینه و انیمیشن برای ایجاد حرکت و “شاین” (shimmer).
- پشتیبانی از prefers-reduced-motion برای کاربران حساس به انیمیشن.
نمونه پایه: HTML و CSS ساده
<div class="skeleton-grid">
<div class="skeleton-item"></div>
<div class="skeleton-item"></div>
<div class="skeleton-item"></div>
<div class="skeleton-item"></div>
</div>
/* CSS */.skeleton-grid{
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 16px;
}
.skeleton-item{
height: 150px;
background: linear-gradient(90deg, #eee 25%, #f5f5f5 50%, #eee 75%);
background-size: 200% 100%;
animation: shimmer 1.2s linear infinite;
border-radius: 8px;
}
@keyframes shimmer{
0%{ background-position: 200% 0; }
100%{ background-position: -200% 0; }
}توضیح: این کد یک شبکه ساده با آیتمهای اسکلتون ایجاد میکند. هر آیتم دارای یک گرادیانت افقی است که با انیمیشن keyframes حرکت میکند تا افکت شاین یا نوری ایجاد شود. grid-template-columns با auto-fill باعث میشود آیتمها در اندازههای مختلف صفحه بهطور خودکار جا بگیرند.
توضیحات بهینهسازی و نسخه بهبود یافته
مثالی که بالا دیدید ساده و کاربردی است، اما میتوان آن را با CSS تغییرپذیرتر، بهینهتر و قابل دسترستر کرد. در ادامه نسخهای با استفاده از متغیرهای CSS، نمایش شرطی انیمیشن و ساختار داخلی برای شبیهسازی عنوان و متن هر کارت میبینید.
<div class="skeleton-grid" aria-hidden="true">
<div class="skeleton-card">
<div class="skeleton-image"></div>
<div class="skeleton-line short"></div>
<div class="skeleton-line"></div>
</div>
<!-- repeat cards as needed -->
</div>
/* CSS */:root{
--skeleton-bg: #e9e9e9;
--skeleton-highlight: #f6f6f6;
--shimmer-duration: 1.1s;
}
.skeleton-grid{
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 18px;
}
.skeleton-card{
padding: 12px;
background: var(--skeleton-bg);
border-radius: 10px;
overflow: hidden;
position: relative;
}
.skeleton-image{
height: 120px;
border-radius: 6px;
background: linear-gradient(90deg, var(--skeleton-bg) 30%, var(--skeleton-highlight) 50%, var(--skeleton-bg) 70%);
background-size: 200% 100%;
animation: shimmer var(--shimmer-duration) linear infinite;
}
.skeleton-line{
height: 12px;
margin-top: 10px;
border-radius: 6px;
background: linear-gradient(90deg, var(--skeleton-bg) 30%, var(--skeleton-highlight) 50%, var(--skeleton-bg) 70%);
background-size: 200% 100%;
animation: shimmer var(--shimmer-duration) linear infinite;
}
.skeleton-line.short{ width: 60%; }
/* کاهش حرکت برای کاربران حساس */@media (prefers-reduced-motion: reduce){
.skeleton-image, .skeleton-line{ animation: none; background: var(--skeleton-bg); }
}
@keyframes shimmer{
0%{ background-position: 200% 0; }
100%{ background-position: -200% 0; }
}توضیح: در این نسخه از متغیرهای CSS برای مدیریت رنگ و زمان انیمیشن استفاده شده است تا سفارشیسازی سادهتر شود. همچنین از aria-hidden برای پنهانسازی محتوای اسکلتون از دسترسیپذیرکنندهها استفاده شده (توجه کنید هنگام نمایش محتوای واقعی باید این ویژگی حذف یا تغییر کند). با media query مربوط به prefers-reduced-motion، کاربران حساس به حرکت از انیمیشن معاف میشوند.
روشهای جایگزین و مزایا/معایب
| روش | مزایا | معایب |
|---|---|---|
| گرادیانت و keyframes | سبک، بدون جاوااسکریپت، کنترل دقیق انیمیشن | ممکن است روی GPU بار بگذارد اگر بیش از حد استفاده شود |
| تصاویر SVG یا Lottie | طراحی پیچیدهتر و زیبا | نیاز به فایلهای خارجی، بار اضافی شبکه |
| جاوااسکریپت برای ساخت داینامیک | ایجاد تعداد آیتم بر اساس دادهها بهسادگی | پیچیدگی و وابستگی به اسکریپت |
نکات اجرایی و بهترین روشها
- از CSS variables برای تمها و تغییرات سریع استفاده کنید.
- برای اجرا در صفحات طولانی، تعداد آیتمهای اسکلتون را محدود کنید تا مصرف حافظه کمتر باشد.
- همیشه از prefers-reduced-motion پشتیبانی کنید تا کاربران دارای حساسیت از تجربه بهتری برخوردار شوند.
- پس از دریافت داده واقعی، اسکلتون را جایگزین محتوای واقعی کنید؛ میتوانید با transition نرمی بین حالتها ایجاد کنید.
- از aria-live یا aria-busy به شکل درست استفاده کنید تا خوانندههای صفحه (screen readers) وضعیت بارگذاری را تشخیص دهند.
نمونه پیادهسازی با حذف اسکلتون پس از لود
// pseudo JavaScript (for clarity)
fetch('/api/items')
.then(res => res.json())
.then(data => {
renderItems(data); // تابعی که DOM واقعی را میسازد
document.querySelector('.skeleton-grid').remove();
});توضیح: این کد نشان میدهد که چگونه پس از بارگذاری دادهها اسکلتون را حذف و محتوای واقعی را جایگزین کنید. در پروژههای واقعی بهتر است شکستهای شبکه را نیز مدیریت کنید و نمایش پیام خطا یا دکمه تلاش دوباره (retry) را در نظر بگیرید.
نتیجهگیری و موارد کاربرد
افکت بارگذاری شبکهای با CSS یک تکنیک ساده اما قدرتمند برای بهبود تجربه کاربری است. با استفاده از CSS Grid، گرادیانتها و keyframes میتوانید بدون بار اضافی روی سرور یا فایلهای خارجی، یک اسکلتون زیبا و قابلسفارشیسازی بسازید. توجه به دسترسپذیری، عملکرد و پاسخگویی به ترجیحات کاربر از نکات کلیدی برای پیادهسازی حرفهای است.
اگر نیاز به نسخه React/Vue یا تولید داینامیک اسکلتون با جاوااسکریپت دارید، میتوانم نمونههای آماده و قابل استفاده برای فریمورک شما تهیه کنم.
آیا این مطلب برای شما مفید بود ؟




