اسپرایت تصویر در CSS
Optional Advanced تازه !important را دیدید — پرچم override نادر. این جلسه موضوع دیگری است: اسپرایت تصویر. در استایلشیتهای قدیمی و بعضی مجموعهآیکنهای legacy هنوز میبینیدش. ایده ساده است: یک فایل تصویر، چند آیکن؛ با background-position مشخص میکنید کدام تکه از پنجرهٔ کوچک دیده شود.
جواب مستقیم
اسپرایت تصویر در CSS یعنی یک شیت که چند آیکن (یا حالت دکمه) را کنار هم نگه میدارد. هر عنصر UI یک عرض و ارتفاع ثابت میگیرد، همان background-image را دارد، و با background-position شیت جابهجا میشود تا تکهٔ درست داخل جعبه بنشیند. وقتی هر آیکن یک درخواست HTTP جدا بود، اسپرایت کمک میکرد. برای کار تازه معمولاً آیکن SVG، SVG درونخطی، یا یک سیستم آیکن کوچک بهتر است — اسپرایت را وقتی نگه دارید که شیت از قبل هست یا باید با طراحی قدیمی یکی بمانید.
اصلاً چرا اسپرایت آمد؟
سالها پیش هر آیکن اغلب یعنی یک رفتوبرگشت HTTP دیگر. بیست PNG ریز را در یک شیت جمع کردن یعنی یک دانلود و یک کش. بعد مرورگر با CSS پنجرههای مختلف روی همان شیت میگذاشت. HTTP/2 و باندل امروزی آن درد را کم کرد؛ آیکن برداری هم معمولاً تیزتر است — ولی الگوی جابهجایی هنوز سواد مفیدی است وقتی CSS قدیمی باز میکنید.
سه قطعه
به اینها نیاز دارید:
- یک شیت — مثلاً
icons.pngبا تکهها در ردیف یا شبکه - یک جعبه —
widthوheightهماندازهٔ یک تکه (اغلب باinline-blockیا لینک بلوکی) - یک آفست —
background-positionتا تکهٔ درست زیر جعبه بیاید
background-repeat: no-repeatجلوی تکرار شیت را میگیرد. فایل جدا برای هر آیکن نمیآورید؛ دارید با موقعیت برش میزنید.
تکهٔ اول روی شیت مشترک
فرض کنید هر آیکن ۳۲×۳۲ پیکسل است و اولی بالا-چپ نشسته. جعبه هم ۳۲×۳۲ است و پسزمینه از 0 0 شروع میشود:
.icon {
display: inline-block;
width: 32px;
height: 32px;
background-image: url("icons.png");
background-repeat: no-repeat;
background-position: 0 0;
}
جعبه مثل ویوپورت عمل میکند. فقط ۳۲×۳۲ بالا-چپ icons.png دیده میشود. بقیهٔ شیت هست — فقط با اندازهٔ عنصر بریده شده.
آیکن دوم: شیت را بکشید
اگر آیکن بعدی ۳۲ پیکسل به راست شروع شده، پسزمینه را ۳۲ پیکسل به چپ ببرید (X منفی). همان تصویر، همان اندازهٔ جعبه، پنجرهٔ دیگر:
.icon-home {
display: inline-block;
width: 32px;
height: 32px;
background-image: url("icons.png");
background-repeat: no-repeat;
background-position: 0 0;
}
.icon-search {
display: inline-block;
width: 32px;
height: 32px;
background-image: url("icons.png");
background-repeat: no-repeat;
background-position: -32px 0;
}
X منفی شیت را چپ میکشد تا تکهٔ دوم پنجره را پر کند. ردیف دوم آیکنها Y را هم عوض میکند (مثلاً -32px -32px). از شیت واقعی اندازه بگیرید — آفست را از حفظ حدس نزنید.
هاور از تکهٔ دیگر
مجموعهدکمهها اغلب حالت عادی و هاور (یا active) را روی همان شیت میگذارند. روی :hover فقط background-position را عوض کنید:
.btn-icon {
display: inline-block;
width: 40px;
height: 40px;
background-image: url("btn-sheet.png");
background-repeat: no-repeat;
background-position: 0 0;
}
.btn-icon:hover {
background-position: -40px 0;
}
فایل تصویر دوم نیست — فقط برش دیگر. اندازهٔ جعبه ثابت بماند تا کنترل نپرد.
عادتهای آرام برای شیت
همیشه شیت را با جعبهٔ صریح و no-repeat جفت کنید. کلاس را با نقش نام بگذارید، نه فقط با حساب پیکسل:
.sprite {
display: inline-block;
background-image: url("icons.png");
background-repeat: no-repeat;
}
.sprite--mail {
width: 24px;
height: 24px;
background-position: 0 -48px;
}
.sprite--bell {
width: 24px;
height: 24px;
background-position: -24px -48px;
}
شبکهٔ تکهها را در یک توضیح کوتاه بنویسید (اندازهٔ تکه، ترتیب ردیف) تا نفر بعدی مجبور نباشد اعداد جادویی را مهندسی معکوس کند.
اسپرایت آنوقت در برابر آیکن الان
📊 Sprite sheets vs modern icon approaches
| Approach | Best when | Watch out |
|---|---|---|
| CSS image sprite (PNG sheet) | Legacy UI you must keep; one cached sheet already in the project | Raster scales poorly; offsets break if the sheet changes |
| Inline SVG / SVG sprite | Crisp UI icons at any size; easy theming with currentColor |
Slightly more markup or build setup |
| Icon font | Very old stacks that already ship one | Accessibility and ligature quirks; harder to theme than SVG |
| Separate PNG per icon | Rare one-off graphics | Many requests on old HTTP/1 connections |
Real <img> photos |
Content images, galleries, product shots | Not a job for background-position sprites |
درسهای گالری تصویر و تصاویر واکنشگرا با <img> واقعی کار میکنند (انگشتشست فلکس، object-fit، srcset). اسپرایت معمولاً کروم تزئینی UI در پسزمینه است — جایگزین عکس محتوا با alt معنیدار نیست.
برای UI تازه، آیکن مدرن را ترجیح بدهید
اگر رابط از صفر است، با SVG شروع کنید (درونخطی یا سیستم کوچک SVG). لبه تیزتر، رنگ سادهتر، بدون آفست شکنندهٔ پیکسلی. سراغ اسپرایت PNG کلاسیک بروید فقط وقتی پک طراحی از قبل شیت است، یا CSSای را پچ میکنید که به همان شیت وابسته است.
/* Content photo — use <img>, not a sprite crop */
.hero-photo {
max-width: 100%;
height: auto;
}
/* UI chrome — sprite OK only if the sheet already exists */
.toolbar .icon-save {
width: 16px;
height: 16px;
background-image: url("legacy-toolbar.png");
background-repeat: no-repeat;
background-position: -64px 0;
}
خودتان امتحان کنید
- روی کاغذ یک ردیف سهآیکنی بکشید (یا یک اسپرایت واقعی باز کنید). عرض تکه را بنویسید (مثلاً ۳۲px).
.icon-aبسازید باbackground-position: 0 0و جعبهٔ هماندازه..icon-bبا-32px 0(یا آفست واقعی دومی) اضافه کنید.- قانون هاوری بنویسید که به تکهٔ سوم برود بدون عوض کردن عرض/ارتفاع.
- در یک توضیح یک جمله بنویسید: چرا این شیت هنوز هست (legacy) یا دفعهٔ بعد چرا SVG میگذارید.
اشتباههای رایج
- گذاشتن عکس محتوا داخل اسپرایت و از دست دادن
alt/ معنای درست - فراموش کردن عرض و ارتفاع تا کل شیت دیده شود یا برش تمیز نماند
- آفست مثبت وقتی باید شیت را برعکس بکشید
- روشن ماندن
background-repeatتا تکهها داخل جعبه تکرار شوند - ساخت اپ تازه روی اسپرایت PNG بهجای SVG بهعنوان پیشفرض
- کپی آفست از آموزش بدون اندازه گرفتن از شیت خودتان
خلاصه
- اسپرایت یک شیت است؛
background-positionمیگوید کدام تکه جعبهٔ ثابت را پر کند - تاریخی برای کم کردن درخواست HTTP آیکنهای ریز بود
no-repeat، اندازهٔ پایدار، نقشنامگذاری؛ شبکه را مستند کنید- برای UI تازه SVG (یا مشابه) را ترجیح بدهید؛ اسپرایت برای شیتهای قدیمی
- عکس محتوا
<img>واقعی میماند — گالری و تصاویر واکنشگرا کار دیگریاند - Optional Advanced بعدی: چندستونه (
multi-column)
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود