
عکس بزرگ چگونه نمایش محتوای اصلی را عقب میاندازد؟
برای نمایش یک تصویر با عرض چندصد پیکسل، ارسال فایل چندمگابایتی همیشه لازم نیست. کاربر موبایل علاوه بر دانلود، هزینهٔ بازکردن و پردازش تصویر بزرگ را هم میپردازد. در این آموزش یک تصویر نمونه را در سه اندازه تولید میکنیم و انتخاب فایل مناسب را به مرورگر میسپاریم. کیفیت ظاهری، نسبت تصویر و اندازهٔ واقعی محل نمایش باید همزمان بررسی شوند؛ کمکردن حجم بهتنهایی معیار کافی نیست.
ویژگی مجموعهٔ منابع، عرض واقعی هر فایل را معرفی میکند و ویژگی اندازهها توضیح میدهد تصویر در چیدمان چقدر فضا دارد. اگر این مقدار با عرض ستون صفحه هماهنگ نباشد، مرورگر ممکن است فایل بزرگتری انتخاب کند. تراکم نمایشگر هم بر انتخاب اثر دارد؛ بنابراین انتظار انتخاب فایل ۳۲۰ پیکسلی در هر گوشی درست نیست. نام فایل کافی نیست و عرض ثبتشده باید با محتوای واقعی فایل برابر باشد.
تولید اندازهها و هماهنگی تصویر با چیدمان
برای تصویر اصلی که از ابتدای صفحه دیده میشود، بارگذاری تنبل انتخاب مناسبی نیست. نمونه از بارگذاری فوری و اولویت بالا استفاده میکند تا مرورگر زودتر درخواست را ببیند. این اولویت را به همهٔ تصاویر ندهید؛ عکسهای پایین صفحه میتوانند تنبل باشند. عرض و ارتفاع ذاتی را نیز ثبت کنید تا فضای تصویر پیش از رسیدن فایل رزرو شود و نوشتهها هنگام نمایش عکس جابهجا نشوند.
ابتدا بستهٔ Pillow را در محیط مجازی پروژه نصب کنید و python generate_images.py را اجرا کنید. سه فایل وبپی داخل پوشهٔ تصاویر ساخته میشود. سپس python audit_images.py را برای بررسی عرض فایلها، نسبت تصویر و تنظیمات نشانهگذاری اجرا کنید. برای مشاهدهٔ صفحه، با python -m http.server 8086 یک سرور محلی باز کنید و نشانی صفحهٔ نمونه را در مرورگر ببینید؛ فایلهای اصلی پروژهٔ خود را بازنویسی نکنید.
در ابزار شبکهٔ مرورگر، حافظهٔ موقت را غیرفعال کنید و صفحه را با عرض موبایل، تبلت و دسکتاپ دوباره بارگذاری کنید. منبع انتخابشده، حجم انتقال، زمان آغاز درخواست و مدت نمایش محتوای اصلی را ثبت کنید. تغییر عرض پس از بارگذاری لزوماً باعث دریافت فایل کوچکتر نمیشود؛ هر اندازه را با بارگذاری تازه بسنجید. نمونهٔ مصنوعی برای سنجش قرارداد فایلها است، نه اثبات بهبود سرعت همهٔ عکسهای واقعی.
کدهای کامل و قابل ذخیره
چهار فایل زیر را در یک پوشه ذخیره کنید. دستورهای اجرا و بررسی در متن آمدهاند؛ هیچ کد با سهنقطه جایگزین نشده است.
1. ساخت سه اندازهٔ تصویر نمونه
نام فایل: generate_images.py؛ همهٔ سطرها را با همین نام ذخیره کنید.
"""Create a reproducible demo image; Pillow is required."""
from pathlib import Path
from PIL import Image, ImageDraw
def generate(output):
output = Path(output)
output.mkdir(parents=True, exist_ok=True)
original = Image.new('RGB', (1280, 720), '#22292c')
draw = ImageDraw.Draw(original)
for x in range(0, 1280, 80):
draw.rectangle((x, 120, x + 48, 600), fill='#b6cfbe')
for width in (320, 640, 1280):
image = original.resize((width, width * 9 // 16), Image.Resampling.LANCZOS)
image.save(output / f'hero-{width}.webp', quality=82, method=6)
if __name__ == '__main__':
generate(Path(__file__).resolve().parent / 'images')این فایل بخشی از مثال کامل بالاست؛ ترتیب اجرا، پیشنیازها و محدودیتهای نتیجه در متن مقاله توضیح داده شده است.
2. منابع، اندازهها و اولویت تصویر
نام فایل: index.html؛ همهٔ سطرها را با همین نام ذخیره کنید.
<!doctype html>
<html lang="fa" dir="rtl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>آزمایش تصویر واکنشگرا</title>
<link rel="stylesheet" href="demo.css">
</head>
<body>
<main>
<h1>تصویر متناسب با عرض صفحه</h1>
<img src="images/hero-640.webp"
srcset="images/hero-320.webp 320w, images/hero-640.webp 640w, images/hero-1280.webp 1280w"
sizes="(max-width: 960px) calc(100vw - 32px), 928px"
width="1280" height="720" fetchpriority="high" loading="eager"
decoding="async" alt="ستونهای سبز روی زمینهٔ تیره برای آزمایش کیفیت تصویر">
<p>در ابزار شبکه، حافظهٔ موقت را غیرفعال و صفحه را دوباره بارگذاری کنید.</p>
</main>
</body>
</html>این فایل بخشی از مثال کامل بالاست؛ ترتیب اجرا، پیشنیازها و محدودیتهای نتیجه در متن مقاله توضیح داده شده است.
3. چیدمان منطبق با اندازههای اعلامشده
نام فایل: demo.css؛ همهٔ سطرها را با همین نام ذخیره کنید.
* { box-sizing: border-box; }
body { margin: 0; background: #eae9e3; color: #15342b; font-family: Tahoma, sans-serif; }
main { width: min(100%, 960px); margin-inline: auto; padding: 16px; }
img { display: block; width: 100%; height: auto; }
h1 { font-size: clamp(20px, 4vw, 30px); }
p { line-height: 1.9; }این فایل بخشی از مثال کامل بالاست؛ ترتیب اجرا، پیشنیازها و محدودیتهای نتیجه در متن مقاله توضیح داده شده است.
4. آزمون اندازهٔ فایلها و نشانهگذاری
نام فایل: audit_images.py؛ همهٔ سطرها را با همین نام ذخیره کنید.
from html.parser import HTMLParser
from pathlib import Path
from PIL import Image
class Images(HTMLParser):
def __init__(self):
super().__init__()
self.items = []
def handle_starttag(self, tag, attrs):
if tag == 'img':
self.items.append(dict(attrs))
def audit(root):
parser = Images()
parser.feed((root / 'index.html').read_text(encoding='utf-8'))
assert len(parser.items) == 1
image = parser.items[0]
assert image['loading'] == 'eager' and image['fetchpriority'] == 'high'
assert image['width'] == '1280' and image['height'] == '720'
assert image['sizes'] == '(max-width: 960px) calc(100vw - 32px), 928px'
for entry in image['srcset'].split(','):
filename, descriptor = entry.strip().split()
with Image.open(root / filename) as variant:
assert variant.width == int(descriptor[:-1])
assert variant.width * 9 == variant.height * 16
print('PASS: dimensions, candidates and eager main image; measure LCP in a browser.')
if __name__ == '__main__':
audit(Path(__file__).resolve().parent)این فایل بخشی از مثال کامل بالاست؛ ترتیب اجرا، پیشنیازها و محدودیتهای نتیجه در متن مقاله توضیح داده شده است.
بررسی انتخاب مرورگر و اندازهگیری واقعی
برای سایت اصلی، تصاویر واقعی را با حفظ جزئیات مهم در اندازههای مناسب خروجی بگیرید و برش را فقط وقتی تغییر دهید که موضوع عکس همچنان واضح بماند. دادهٔ آزمایشگاهی را با تجربهٔ کاربران واقعی و شبکههای کند مقایسه کنید. اگر متن یا پاسخ سرور عامل اصلی تأخیر باشد، تبدیل عکس به وبپی بهتنهایی مسئله را حل نمیکند. تغییر نهایی باید با کیفیت قابل قبول، درخواست درست و چیدمان پایدار همراه باشد.
چکلیست اجرای عملی
- عرض واقعی هر فایل با توصیف منبع برابر باشد.
- تصویر اصلی فوری و تصاویر پایین صفحه تنبل باشند.
- هر عرض با بارگذاری تازه و حافظهٔ موقت غیرفعال بررسی شود.
- کیفیت و پایداری چیدمان همراه حجم اندازهگیری شود.
منابع
تدوین و راهنمای عملی: دانشنامه لیان.




