با شما در این روزهای سخت همراهیم (۴۰٪ تخفیف کمپین همدلی)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱۲ دیدگاه نظر مهشاد کلانتری
آموزش ریسپانسیو با css + آپدیت 2025
سرفصل‌های مقاله
  • رایج‌ترین راه حل
  • آموزش ریسپانسیو در css
  • <picture> چگونه کار میکند؟
  •  استفاده ساده از تصاویر با رزولوشن بالاتر در نمایشگرهای رتینا
  •  انتخاب فرمت‌های تصویر مدرن (WebP و AVIF)
  •  بارگذاری تنبل و بهینه‌سازی اولویت‌ها

ریسپانسیو بودن تصاویر در css برای طراحان وب همیشه مسئله چالش بر انگیزی بوده پس همراه من باشید تا در این مقاله به شما ریسپانسیو کردن تصاویر را آموزش دهم . میدونید که تصاویر همیشه یکی از بحث‌های چالش برانگیز در طراحی سایت‌های ریسپانسیو هستند پس در این مطلب میخوایم تگ زیر را به شما آموزش دهیم! تگی که راه حلی رایج برای مشکل تصاویر ریسپانسیو هست رو بررسی کنیم.

<picture> 

رایج‌ترین راه حل

معمولا هر سایت ریسپانسیوی رو که باز کنید، داخل کدهای css اون سایت، چنین چیزی رو میبینید:

img {    max-width: 100%;    height: auto; }

این کد از 

max-width: 100%

 استفاده میکنه تا نذاره اندازه عرض تصویر بیشتر از عرض والدش بشه. اگر عرض والد کمتر از عرض تصویر بشه، عرض تصویر هم به همون نسبت کم میشه. 

height: auto

 هم باعث میشه تا متناسب با کم شدن اندازه عرض تصویر، ارتفاع تصویر هم کم بشه.

این راه حل، مشکل رو فقط از یک جنبه حل میکنه و اجازه میده تا تحت شرایط متفاوت، یک تصویر رو نمایش بدیم. ولی اگر بخوایم تحت شرایط متفاوت، تصاویر متفاوتی رو نشون بدیم چی؟

آموزش ریسپانسیو در css

<picture>

 تگ بالا یکی از عناصر جدید html5 هست که به شما این امکان رو میده چند تگ source (که هر کدوم از این تگ‌ها شامل محل تصویر و شرطی که تحت اون شرط باید تصاویر بارگذاری بشه) رو برای picture قرار بدید.

با این روش میتونید یک تصویر کاملا متفاوت رو با توجه به دو حالت زیر بارگذاری کنید:

  • نتایج مدیاکوئری مثلا ارتفاع، عرض یا orientation دستگاه
  • تراکم پیکسلی

یعنی شما میتونید:

  • تصاویر با سایز مناسب، که باعث استفاده بهتر از پهنای باند میشه رو بارگذاری کنید
  • تصاویر مختلف بریده شده با ابعاد مختلف رو با توجه به تغییرات layout در عرض‌های مختلف بارگذاری کنید
  • تصاویر با رزولوشن بالاتر رو برای صفحه نمایش هایی با تراکم پیکسلی بالاتر بارگذاری کنید

<picture> چگونه کار میکند؟

مراحل اساسی کار با <picture>:

  • ایجاد تگ‌های باز و بسته‌ی <picture></picture>
  • اضافه کردن تگ <source> برای هر کوئری که قصد دارید اجرا شود
  • استفاده از صفت media برای تعریف کوئری‌هایی مثل عرض، ارتفاع یا orientation دستگاه
  • استفاده از صفت srcset برای مشخص کردن نام تصویر مربوطه جهت بارگذاری
  • پشتیبانی از نمایشگرهای با تراکم پیکسلی بالا (رتینا) با اضافه کردن نام تصاویر دیگر به صفت srcset
  • اضافه کردن تگ <img> به عنوان fallback یا تصویر پیش‌فرض

این مثال یه مثال ساده هست که اگر سایز صفحه نمایش کمتر از 768px بود، تصویر کوچک‌تر رو بارگذاری میکنه:

<picture>
    <source srcset="smaller.jpg" media="(max-width: 768px)">
    <source srcset="default.jpg">
    <img srcset="default.jpg" alt="My default image">
</picture>

سینتکس استفاده شده در صفت media دقیقاً مشابه همان چیزی است که در CSS برای ساخت مدیاکوئری استفاده می‌کنید.

می‌توانید از ویژگی‌هایی زیر استفاده کنید:

max-width
min-width
max-height
min-height
orientation 

 

میتونید کوئری ای بنویسید که مثلا یه تصویر رو با توجه به عمودی یا افقی بودن دستگاه، بارگذاری کنید. خوبیش اینه که میتونید چند کوئری رو همزمان بنویسید. به مثال زیر توجه کنید:

<picture>
    <source srcset="smaller_landscape.jpg" media="(max-width: 40em) and (orientation: landscape)">
    <source srcset="smaller_portrait.jpg" media="(max-width: 40em) and (orientation: portrait)">
    <source srcset="default_landscape.jpg" media="(min-width: 40em) and (orientation: landscape)">
    <source srcset="default_portrait.jpg" media="(min-width: 40em) and (orientation: portrait)">
    <img srcset="default_landscape.jpg" alt="My default image">
</picture>

کد بالا عملیات زیر را انجام میدهد:

  • برای دستگاه‌هایی با سایز کمتر از 40em و حالت افقی --->  تصویر smaller_landscape.jpg را نمایش میدهد.
  • برای دستگاه‌هایی با سایز بیشتر از 40em و حالت افقی ---> تصویر default_landscape.jpg
  • برای دستگاه‌هایی با سایز کمتر از 40em و حالت عمودی ---> تصویر smaller_portrait.jpg
  • برای دستگاه‌هایی با سایز بیشتر از 40em و حالت عمودی ---> تصویر default_portrait.jpg

 استفاده ساده از تصاویر با رزولوشن بالاتر در نمایشگرهای رتینا

گاهی لازم است برای نمایشگرهایی با تراکم پیکسلی بالا (مثل رتینا)، تصویر با کیفیت بیشتری نشان داده شود. این کار خیلی ساده است: کافیست در صفت srcset علاوه بر تصویر اصلی، نسخه‌ی با رزولوشن بالاتر را هم اضافه کنید.

<picture>
    <source srcset="smaller.jpg, smaller_retina.jpg 2x" media="(max-width: 768px)">
    <source srcset="default.jpg, default_retina.jpg 2x">
    <img srcset="default.jpg, default_retina.jpg 2x" alt="My default image">
</picture>

 توضیح مرحله به مرحله

  • اول مدیاکوئری بررسی می‌شود ---> مشخص می‌کند کدام تصویر باید برای اندازه‌های مختلف صفحه نمایش بارگذاری شود.
  • بعد تصویر انتخاب‌شده نمایش داده می‌شود.
  • اگر عرض صفحه کمتر از 768px باشد ---> تصویر smaller.jpg نمایش داده می‌شود.
  • اگر همان دستگاه نمایشگر رتینا باشد ---> به جای smaller.jpg، تصویر با کیفیت بالاتر یعنی smaller_retina.jpg نمایش داده می‌شود.
  • در حالت پیش‌فرض (بدون محدودیت عرض) ---> تصویر default.jpg نمایش داده می‌شود.
  • و اگر نمایشگر رتینا باشد → نسخه‌ی با کیفیت‌تر یعنی default_retina.jpg جایگزین می‌شود.

 انتخاب فرمت‌های تصویر مدرن (WebP و AVIF)

یکی از مهم‌ترین بهبودهایی که در سال‌های اخیر برای تصاویر وب معرفی شده، استفاده از فرمت‌های WebP و AVIF است. این فرمت‌ها حجم تصاویر را به شکل چشمگیری کاهش می‌دهند، بدون اینکه کیفیت قابل توجهی از دست برود.

چرا WebP و AVIF؟

  • WebP: توسط گوگل معرفی شد، حجم کمتر نسبت به JPEG و PNG، پشتیبانی از شفافیت و انیمیشن.
  • AVIF: فرمت جدیدتر مبتنی بر کُدک AV1، فشرده‌سازی بهتر از WebP و کیفیت بالاتر در حجم کمتر.
  • مزیت اصلی: سرعت بارگذاری بیشتر، مصرف کمتر پهنای باند و بهبود تجربه کاربری.
<picture>
  <source type="image/avif" srcset="hero.avif">
  <source type="image/webp" srcset="hero.webp">
  <img src="hero.jpg" alt="تصویر اصلی صفحه">
</picture>
  • در کد بالا، مرورگر ابتدا بررسی می‌کند آیا از AVIF پشتیبانی می‌کند؛ اگر نه، سراغ WebP می‌رود.
  • در نهایت اگر هیچ‌کدام پشتیبانی نشد، تصویر JPEG یا PNG نمایش داده می‌شود.

     بارگذاری تنبل و بهینه‌سازی اولویت‌ها

    یکی دیگر از تکنیک‌های مهم در بهینه‌سازی تصاویر، Lazy Loading یا بارگذاری تنبل است. این روش باعث می‌شود تصاویر فقط زمانی بارگذاری شوند که کاربر به آن بخش صفحه برسد.

    چرا بارگذاری تنبل مهم است؟

  • کاهش درخواست‌های اولیه HTTP
  • افزایش سرعت بارگذاری صفحه (بهبود Core Web Vitals)
  • صرفه‌جویی در مصرف اینترنت کاربران

    نحوه استفاده

    <img 
      src="gallery-1.webp" 
      alt="نمونه کار شماره یک" 
      loading="lazy" 
      decoding="async">
    

✅ همین حالا از <picture> استفاده کنید

امروزه مرورگرهای مدرن (کروم، فایرفاکس، اج، سافاری، اپرا و مرورگرهای موبایل) به طور کامل از <picture> پشتیبانی می‌کنند.

بنابراین می‌توانید بدون نگرانی از ناسازگاری، در پروژه‌های خود از این قابلیت استفاده کنید و تصاویر خود را ریسپانسیو کنید!

۱۲ دیدگاه
ما همه سوالات و دیدگاه‌ها رو می‌خونیم و پاسخ میدیم
لیلا ۱۳ آبان ۱۳۹۹، ۰۸:۳۰

چندتا سایت وردپرسی و ووکامرسی رو تست کردم، در همه ی موارد روی موبایل وقتی عکسی رو دانلود میکنم به جای اون ابعادی که تعریف شده، عکس رو در ابعاد اصلی که آپلود شده دانلود میکنه، میخوام بدونم که آیا موقع لود سایت برای بازدید کننده هم همون ابعاد اصلی آپلود میشه؟ و چرا عکس با ابعاد اصلیش دانلود میشه؟ روی دسک تاپ اما اینطور نیست و وقتی عکس رو دانلود کنی با همون ابعادی که تعریف کردیم و بهش دادیم دانلود میشه. مثلا ابعاد نمایشی عکس در موبایل 160*160 هستش ولی وقتی دانلودش میکنم با ابعاد 1200*1200 که ابعاد عکس اصلی هست دانلود میشه (فقط روی موبایل). در ادامه کدش رو هم قرار دادم.

نازنین کریمی مقدم ۱۳ آبان ۱۳۹۹، ۱۳:۳۹

درود. این مسئله که تصاویر برای موبایل بهینه شده اند یا نه، بسته به نوع قالب متفاوت است. بعضی از قالبها به طور خاص برای موبایل هم بهینه میشوند و در توضیحات هر قالبی معمولا این موارد مشخص میشه. بخاطر مسائل امنیتی کدتون برای ما حذف میشه و من نمیتونم ببینم، اما شما باید کد رو برای اندازه‌های مختلف نمایشگر با @media بازنویسی کنید تا روی همه دستگاه‌ها اعمال بشه.

amin hazeghi ۱۵ آبان ۱۳۹۸، ۱۹:۳۸

من با asp ساتمو ساختم.ولی این تگ را اصلا نمی‌شناسه.فایل را دانلود کردم و طبق توضیحات فایل جاوا را با لینک به صفحه اضافه کردم.اما هر کار میکنم زیر تگ خط قرمز به معنی عدم شناخت تگ میکشه لطفا راهنمایی کنید

omid hojaty ۱۰ بهمن ۱۳۹۷، ۱۷:۰۰

سلام ببخشید من یک اسلایدر دارم .من میخوام وقتی اندازه صفحه رو کوچک میکنم اسلایدرم هم کوچیک بشه ( رسپانسیو ) . میشه راهنمایی کنید .

sajjad ۲۹ مهر ۱۳۹۴، ۰۰:۵۲

ممنونم کاش یکم مبتدی‌تر توضیح میدادید تا کاملا مطلب رومتوجه بشیم با این حال 70 % قابل فهم بود خیلی متشکر :smile:

ساغر ۰۶ مرداد ۱۳۹۳، ۱۹:۳۲

من میخوام برای یک اسلاید شو ک تصاویر رو از داخل دیتابیس دریافت میکنه این خاصیت رو استفاده کنم ..همچنین ریسپانسیو را برای سه دستگاه تنظیم کرده ام...موبایل و تبلت و دستکتاپ ممنون میشم راهنماییم کنید ک سایز تصاویر چطوری متناسب با کادر هر دستگاه تنظیم بشه بابت مطالب مفیدتون هم کمال تشکر دارم

محمد بابازاده ۰۷ تیر ۱۳۹۳، ۲۰:۳۳

ممنونم

Irandroid gigfa com ۰۳ تیر ۱۳۹۳، ۰۸:۲۵

خیلی خوب بود ممنون از آموزشهاتون

سجاد دریس ۰۲ تیر ۱۳۹۳، ۲۲:۵۴

خیلی عالی بود.

m.yousefikia ۰۲ تیر ۱۳۹۳، ۲۰:۱۶

ممنون. مثل همیشه عالی و مفید

mm021 ۰۲ تیر ۱۳۹۳، ۱۸:۴۷

مرسی ♥ ♥ ♥ ♥ عالی بود ♥♥♥

مهدی اکرمی ۰۲ تیر ۱۳۹۳، ۱۷:۵۰

مطلب بسیار مفیدی بود . خیلی ممنون از آموزش هاتون :grin:

دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد:

۲۰۰ هزار تومان رایگان
دریافت دوره الفبای برنامه نویسی