ساخت گالری تصاویر واکنشگرا با CSS
گالری تصاویر واکنشگرا (responsive image gallery) یکی از اجزای رایج وبسایتهاست که باید هم زیبا باشد و هم سریع و در دسترس. در این مقاله به اصول طراحی، نمونههای کاربردی با CSS Grid و Flexbox، نکات عملکردی (performance) و دسترسپذیری (accessibility) میپردازیم و کدهایی برای پیادهسازی عملی ارائه میکنیم.
اصول کلیدی گالری واکنشگرا
- استفاده از سیستم شبکهای (Grid یا Flex) برای چیدمان پویا.
- حفظ نسبت ابعاد تصاویر با aspect-ratio یا فضای نگهدارنده (placeholder).
- بهینهسازی بارگذاری با lazy loading و تصاویر واکنشگرا (
srcset/sizes). - قابلیت پیمایش با صفحهکلید، متن جایگزین مناسب (
alt) و کنتراست کافی.
نمونه پایه: ساختار HTML
<div class="gallery">
<figure class="gallery-item">
<img src="photo1.jpg" alt="توضیح عکس ۱" loading="lazy">
<figcaption>عنوان عکس ۱</figcaption>
</figure>
<!-- تکرار برای آیتمهای دیگر -->
</div>در این مثال از عنصر <figure> برای گروهبندی تصویر و کپشن استفاده شده و با صفت loading="lazy" بارگذاری تنبل فعال میشود که عملکرد صفحه را بهتر میکند.
CSS اولیه با Grid (ریسپانسیو و ساده)
.gallery{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
align-items: start;
}
.gallery-item{
background: #f8f8f8;
border-radius: 8px;
overflow: hidden;
}
.gallery-item img{
width: 100%;
height: 100%;
object-fit: cover;
display: block;
aspect-ratio: 16/9;
}این CSS از auto-fit و minmax برای ایجاد ستونهای منعطف استفاده میکند. خاصیت aspect-ratio باعث میشود همه تصاویر نسبت ثابت داشته باشند. object-fit: cover برای پر کردن کادر بدون کشیدگی تصویر مناسب است.
بهبود عملکرد با تصاویر واکنشگرا
<figure class="gallery-item">
<img
src="photo1-800.jpg"
srcset="photo1-400.jpg 400w, photo1-800.jpg 800w, photo1-1200.jpg 1200w"
sizes="(max-width:600px) 100vw, (max-width:1200px) 50vw, 33vw"
alt="توضیح عکس ۱"
loading="lazy">
<figcaption>عنوان عکس ۱</figcaption>
</figure>با srcset و sizes مرورگر مناسبترین نسخه تصویر را انتخاب میکند و پهنای باند کاربر ذخیره میشود. ترکیب با loading="lazy" بار اولیه را کاهش میدهد.
افزودن تعامل: افکتها و دسترسپذیری
.gallery-item{
position: relative;
transition: transform .25s ease, box-shadow .25s ease;
}
.gallery-item:focus-within,
.gallery-item:hover{
transform: translateY(-6px);
box-shadow: 0 8px 20px rgba(0,0,0,.12);
}
.gallery-item img{
border-radius: 6px;
}
.gallery-item a{
outline: none;
}
.gallery-item a:focus{
box-shadow: 0 0 0 3px rgba(0,123,255,.25);
}این CSS حرکت و سایه برای تعامل بهتر روی حالتها (hover و focus) فراهم میکند. استفاده از :focus یا :focus-within اهمیت دارد تا کاربران صفحهکلید نیز پیمایش کنند.
نمونه بهبود یافته: مدال/لایتباکس ساده (اختیاری)
const openModal = (src, alt) => {
const modal = document.getElementById('modal');
const modalImg = modal.querySelector('img');
modalImg.src = src;
modalImg.alt = alt;
modal.classList.add('open');
};
document.addEventListener('click', (e) => {
const target = e.target;
if(target.matches('.gallery-item img')){
openModal(target.src, target.alt);
} else if(target.matches('#modal') || target.matches('#modal .close')){
document.getElementById('modal').classList.remove('open');
}
});این اسکریپت بسیار ساده برای باز کردن یک تصویر در لایتباکس کاربرد دارد. توجه کنید در پروژههای واقعی باید از مدیریت تار شدن پسزمینه، کنترل صفحهکلید (Escape) و دسترسپذیری ARIA استفاده کنید.
نکات تکمیلی و بهترین شیوهها
- تصاویر را فشرده و در فرمتهای مدرن (WebP/AVIF) ارائه کنید و برای مرورگرهایی که پشتیبانی ندارند تصویر پشتیبان داشته باشید.
- از CDN یا سرویسهای بهینهسازی تصویر برای بارگذاری سریعتر استفاده کنید.
- برای بارگذاری اولیه از placeholderهای کمحجم (LQIP) یا SVGهای بلور استفاده کنید تا لودینگ کمتر محسوس باشد.
- متن جایگزین (alt) مختصر و معنادار بنویسید؛ برای تصاویر صرفاً تزئینی از
alt=""استفاده کنید.
جدول پیشنهادی نقاط قطع (breakpoints)
| نمای صفحه | ستون پیشنهادی |
|---|---|
| کمتر از 600px | یک ستون |
| 600px تا 900px | دو ستون |
| 900px تا 1200px | سه ستون |
| بیش از 1200px | چهار ستون یا بیشتر (بسته به طراحی) |
خلاصه و جمعبندی
برای ساخت یک گالری تصاویر واکنشگرا، از یک سیستم شبکهای (معمولاً CSS Grid) استفاده کنید، نسبت ابعاد را حفظ کنید، تصاویر را با srcset و loading="lazy" بهینه کنید و تعاملات و دسترسپذیری را فراموش نکنید. این موارد باعث میشود گالری شما سریع، منعطف و کاربردی برای کاربران مختلف باشد.
در صورت نیاز میتوانم یک پروژه نمونه کامل ZIP یا کد آماده برای فریمورکهای رایج (React/Vue) ارائه دهم یا نسخه RTL و فارسیسازیشده با سبک متریال تهیه کنم.
آیا این مطلب برای شما مفید بود ؟




