ویژگی تصویر

افکت حرکت موج روی پس‌زمینه با CSS

  /  CSS   /  افکت حرکت موج روی پس‌زمینه با CSS
بنر تبلیغاتی الف

افکت موج روی پس‌زمینه یک راه موثر برای افزایش جذابیت بصری وب‌سایت و ایجاد حس حرکت و عمق است. این افکت می‌تواند در بخش‌های هدر، بخش‌های قهرمان (hero)، فوتر یا بین بخش‌های محتوایی استفاده شود. در این مقاله روش‌های مختلف پیاده‌سازی موج با CSS و SVG، نکات عملکردی، دسترسی و نمونه‌های قابل سفارشی‌سازی را بررسی می‌کنیم.

روش‌های متداول برای ساخت موج

  • موج با SVG و انیمیشن transform یا path
  • موج با pseudo-elements و گرادیانت‌های خطی/رادیال
  • موج با CSS background-position روی تصاویر تکرارشونده
  • موج با Canvas (برای انیمیشن پیچیده و محاسبات زمان واقعی)

نمونه ساده با HTML و CSS (موج لایه‌ای)

<div class="wave-container">
  <div class="wave wave1"></div>
  <div class="wave wave2"></div>
  <div class="wave wave3"></div>
</div>

.wave-container{
  position: relative;
  height: 300px;
  overflow: hidden;
  background: linear-gradient(180deg,#0d47a1 0%, #1976d2 100%);
}

.wave{
  position: absolute;
  left: -50%;
  width: 200%;
  height: 200px;
  bottom: 0;
  background-repeat: repeat-x;
  opacity: 0.6;
  transform: translate3d(0,0,0);
  will-change: transform;
}

.wave1{
  background-image: radial-gradient(circle at 50% 50%, rgba(255,255,255,0.15) 10%, rgba(255,255,255,0) 40%);
  animation: waveMove 10s linear infinite;
  bottom: -10px;
}

.wave2{
  background-image: radial-gradient(circle at 20% 40%, rgba(255,255,255,0.08) 10%, rgba(255,255,255,0) 30%);
  animation: waveMove 14s linear infinite reverse;
  bottom: -20px;
  opacity: 0.4;
}

.wave3{
  background-image: radial-gradient(circle at 80% 60%, rgba(255,255,255,0.06) 10%, rgba(255,255,255,0) 30%);
  animation: waveMove 18s linear infinite;
  bottom: -30px;
  opacity: 0.3;
}

@keyframes waveMove{
  0%{ transform: translateX(0); }
  100%{ transform: translateX(-50%); }
}

توضیح: این مثال از سه لایهٔ موج استفاده می‌کند که هرکدام گرادیانت شعاعی (radial-gradient) دارند و با animation و transform به سمت چپ حرکت می‌کنند. استفاده از translate3d و will-change کمک می‌کند تا انیمیشن روی GPU اجرا شده و روان‌تر شود. با تغییر زمان‌ها و شفافیت (opacity) می‌توانید عمق و اختلاف سرعت بین لایه‌ها را کنترل کنید.

نسخه بهینه‌تر با SVG و CSS Variables

<div class="hero">
  <svg class="wave-svg" viewBox="0 0 1440 320" preserveAspectRatio="none">
    <path id="wavePath" d="M0,160 C360,200 1080,120 1440,160 L1440,320 L0,320 Z" />
    <use href="#wavePath" class="wave-fill" x="0" y="0" />
    <use href="#wavePath" class="wave-fill" x="0" y="20" />
  </svg>
</div>

/* CSS */:root{
  --wave-speed: 12s;
  --wave-color: rgba(255,255,255,0.15);
}

.hero{ position: relative; height: 320px; background: linear-gradient(180deg,#2196f3,#0d47a1); overflow: hidden; }

.wave-svg{
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 40%;
  pointer-events: none;
}

.wave-fill{
  fill: var(--wave-color);
  transform-origin: center;
  animation: float var(--wave-speed) linear infinite;
  will-change: transform;
  opacity: 0.8;
}

.wave-fill:nth-child(2){ animation-duration: calc(var(--wave-speed) * 1.6); opacity: 0.6; transform: translateY(6px) }

@keyframes float{
  0%{ transform: translateX(0) translateY(0) }
  50%{ transform: translateX(-6%) translateY(6px) }
  100%{ transform: translateX(0) translateY(0) }
}

توضیح: این روش از یک مسیر SVG مشترک استفاده می‌کند و با <use> آن را چندبار در همان SVG مصرف می‌کنیم تا لایه‌های موج ایجاد شود. با CSS variables سرعت و رنگ موج قابل تنظیم است. انیمیشن با transform انجام می‌شود که باز هم برای عملکرد مناسب است.

دسترس‌پذیری و کاهش حرکت

@media (prefers-reduced-motion: reduce){
  .wave-fill, .wave{ animation: none !important; }
}

توضیح: کاربران با حساسیت به حرکات یا کاربری‌های بهره‌گیری از گزینهٔ “کاهش حرکت” در سیستم‌عامل، تجربهٔ ناخوشایند خواهند داشت. با استفاده از prefers-reduced-motion می‌توان انیمیشن‌ها را غیرفعال یا ساده کرد تا دسترس‌پذیری افزایش یابد.

مقایسه سریع روش‌ها

روشمزایامعایب
SVG + CSSدقت بالا، مقیاس‌پذیر، قابل تغییر با CSSاگر خیلی بهم پیچیده شود ممکن است DOM سنگین شود
CSS Gradientsبدون تصویر، سبک و سادهکنترل شکل موج محدودتر از SVG
Canvasانعطاف‌پذیر برای انیمیشن‌های پیچیدهنیاز به جاوااسکریپت و بار پردازشی بیشتر

نکات عملکردی و عملیاتی (Expert Tips)

  • همیشه از transform (translateX/Y) و opacity برای انیمیشن استفاده کنید؛ زیرا باعث ایجاد لایهٔ ترکیبی (compositing layer) و استفاده از GPU می‌شود.
  • از will-change با احتیاط استفاده کنید؛ زیاد به کار بردن آن می‌تواند حافظه را مصرف کند.
  • برای سازگاری موبایل اندازهٔ SVG را با preserveAspectRatio="none" کنترل کنید تا موج همیشه فیت باشد.
  • برای کاهش تعداد فریم‌ها و مصرف انرژی، مدت زمان انیمیشن را افزایش دهید یا از easing ملایم استفاده کنید.
  • برای افزایش سئوی صفحه، مراقب باشید که انیمیشن‌ها بار محتوای اصلی را به تعویق نیندازند و محتوای متنی روی موج خوانا بماند (کنتراست کافی).

نمونهٔ کاربرد

افکت موج مناسب برای:

  • بخش‌های هدر و قهرمان در صفحات فروشگاهی یا معرفی محصول
  • پس‌زمینه کارت‌های خدماتی یا بنرها
  • آثار هنری تعاملی و میکرویزرها (micro-interactions)

جمع‌بندی

انتخاب روش مناسب به نیاز پروژه، اولویت در عملکرد و سطح سفارشی‌سازی بستگی دارد. برای اغلب موارد، ترکیب SVG با انیمیشن‌های مبتنی بر transform بهترین تعادل بین زیبایی و عملکرد را فراهم می‌کند. همیشه رفتار را برای کاربرانی که درخواست کاهش حرکت دارند فراهم کنید و در نهایت موج‌ها را به گونه‌ای طراحی کنید که محتوای صفحه تحت تاثیر منفی قرار نگیرد.

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

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