ویژگی تصویر

ساخت افکت Pixelated با CSS

  /  CSS   /  ساخت افکت Pixelated با CSS
بنر تبلیغاتی الف

افکت «پیکسل‌شده» یا Pixelated زمانی استفاده می‌شود که بخواهیم تصویری با ظاهر پیکسلی و نوستالژیک ایجاد کنیم. این افکت در طراحی بازی‌های دوبعدی، آثار هنری، بنرهای تبلیغاتی و رابط‌های کاربری که حال‌ و هوای رترو می‌خواهند دیده می‌شود. در این مقاله چند روش عملی برای پیاده‌سازی این افکت با CSS و جاوااسکریپت توضیح داده می‌شود، همراه با نکات سازگاری و بهینه‌سازی.

روش‌های اصلی برای ساخت افکت Pixelated

  • استفاده از CSS و خاصیت image-rendering
  • تکنیک تغییر background-size یا scale در CSS
  • رسم روی <canvas> و غیرفعال کردن smoothing در جاوااسکریپت
  • روش‌های مبتنی بر SVG و فیلترها

1. ساده‌ترین راه: image-rendering

موتورهای مرورگر قابلیت‌هایی برای رندر کردن تصویر با روش nearest-neighbor دارند؛ این کار با image-rendering: pixelated یا مقدارهای مشابه انجام می‌شود تا زمانی که تصویر بزرگ‌تر شود، پیکسل‌ها محو نشوند.

img.pixel {
  width: 400px; /* بزرگ‌نمایی تصویر */  image-rendering: pixelated;
  image-rendering: crisp-edges; /* fallback برای مرورگرها */  image-rendering: -moz-crisp-edges; /* Firefox قدیمی */  image-rendering: -o-pixelated; /* Opera قدیمی */  image-rendering: -webkit-optimize-contrast; /* WebKit fallback */}

توضیح: این کد یک تگ <img> را بزرگ می‌کند و با image-rendering به مرورگر می‌گوید از فیلترسازی نرم (anti-aliasing) استفاده نکند. در نتیجه پیکسل‌ها واضح و مربعی باقی می‌مانند. استفاده از چند مقدار برای compatibility با مرورگرها توصیه می‌شود.

مثال HTML ساده

<img src="sprite.png" class="pixel" alt="sprite">

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

2. ترفند background-size برای جلوهٔ موزائیکی

یک تکنیک CSS-only دیگر استفاده از background-size کوچک و سپس بزرگ‌نمایی پس‌زمینه است تا تصویر به صورت بلوک‌هایی از پیکسل نمایش یابد. این روش زمانی موثر است که بخواهیم تصویر پس‌زمینه را پیکسلاتی کنیم.

.pixel-bg {
  width: 500px;
  height: 300px;
  background-image: url('photo.jpg');
  background-size: 50px 30px; /* کوچک‌سازی برای تولید پیکسل */  image-rendering: pixelated;
  background-repeat: no-repeat;
  background-position: center;
}

توضیح: با کاهش background-size به مقادیر خیلی کوچک، مرورگر به‌طور طبیعی تصویر را به عنوان بلوک‌های بزرگ بازآفرینی می‌کند؛ ترکیب با image-rendering کمک می‌کند تا لبه‌ها صاف نشوند. این روش برای کاورهای گرافیکی مناسب است اما کنترل داینامیک محدودی دارد.

3. روش پیشنهادی برای کنترل دقیق: Canvas + JS

اگر بخواهید میزان پیکسلی شدن را داینامیک تغییر دهید یا افکت انیمیشنی بسازید، بهترین راه استفاده از <canvas> است. در اینجا ابتدا تصویر را در اندازهٔ کوچک‌تر می‌کشیم سپس آن را بزرگ‌نمایی می‌کنیم و smoothing را خاموش می‌کنیم.

// HTML
<canvas id="pix-canvas"></canvas>
<img id="source" src="photo.jpg" style="display:none">

// JavaScript
const img = document.getElementById('source');
const canvas = document.getElementById('pix-canvas');
const ctx = canvas.getContext('2d');

img.onload = () => {
  const scale = 8; // هر چقدر بزرگتر، پیکسلی‌تر
  canvas.width = Math.floor(img.width / scale);
  canvas.height = Math.floor(img.height / scale);

  // اندازهٔ داخلی کوچکتر، سپس بزرگنمایی با CSS
  ctx.imageSmoothingEnabled = false;
  ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

  // حالا canvas را با CSS بزرگ می‌کنیم تا پیکسل‌ها نمایان شوند
  canvas.style.width = (canvas.width * scale) + 'px';
  canvas.style.height = (canvas.height * scale) + 'px';
};

توضیح: کد بالا تصویر را ابتدا در رزولوشن پایین روی canvas می‌کشد (drawImage با ابعاد کوچک). سپس با خاموش کردن imageSmoothing (که در مرورگرها برای جلوگیری از مات شدن تصویر استفاده می‌شود) و بزرگ‌نمایی CSS روی همان canvas، افکت پیکسلی واقعی و قابل تنظیم به‌دست می‌آید. این روش برای افکت‌های انیمیشنی و تغییر پارامتر در زمان اجرا بسیار مناسب است.

4. مقایسه روش‌ها (جدول)

روشمزایامعایب
image-renderingساده، بدون JS، performantکنترل کم، ممکن است در همه مرورگرها مشابه نمایش داده نشود
background-sizeبدون JS، مناسب برای پس‌زمینه‌هاکنترل محدود و نیاز به تنظیم دقیق اندازه
canvas + JSکنترل کامل، قابل انیمیشن، دقیقنیاز به JS و پردازش بیشتر
SVG / فیلترهاقابلیت ترکیب با فیلترهای برداریپیچیده‌تر و بسته به فیلترها محدود

نکات فنی، سازگاری و بهینه‌سازی

  • برای سازگاری: از چند مقدار image-rendering (crisp-edges, pixelated و vendor prefixes) استفاده کنید.
  • اگر از تصاویر بزرگ استفاده می‌کنید، پردازش canvas ممکن است مصرف حافظه و CPU را افزایش دهد؛ در موبایل‌ها مراقب باشید.
  • برای انیمیشنِ پیکسلی، بهتر است تنها بخش مورد نیاز را دوباره رندر کنید تا performance حفظ شود.
  • برای ریسپانسیو بودن، مقادیر scale را بر اساس نسبت تصویر و اندازهٔ نمایشگر حساب کنید.

نتیجه‌گیری و کاربردهای عملی

اگر به دنبال راه‌حلی سریع و سازگار با حداقل کدنویسی هستید، image-rendering بهترین نقطهٔ شروع است. برای نیاز به کنترل و افکت‌های داینامیک، canvas + JS انتخاب حرفه‌ای‌تری است. بسته به پروژه می‌توانند این تکنیک‌ها را با یکدیگر ترکیب کرد — مثلاً پیش‌نمایش سریع با CSS و خروجی نهایی با canvas برای بهینه‌سازی و انیمیشن.

در نهایت، انتخاب روش مناسب وابسته به هدف شما، محدودیت پلتفرم و نیاز به تعامل است؛ هر کدام از روش‌های بالا مزایا و کاربردهای مشخصی دارند که بسته به سناریو می‌توانید از آن‌ها بهره ببرید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: