ویژگی تصویر

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

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

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

چرا از افکت موجی استفاده کنیم؟

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

روش‌های رایج پیاده‌سازی

  • SVG: دقیق، مقیاس‌پذیر و قابل انیمیت با کمترین تأثیر روی کیفیت
  • CSS خالص: ساده و بدون نیاز به فایل اضافه، مناسب برای موج‌های ساده
  • ترکیبی: SVG به‌عنوان ماسک یا تصویر پس‌زمینه و CSS برای انیمیشن

نمونه 1 — موج ساده با SVG و CSS

<svg viewBox="0 0 1440 320" preserveAspectRatio="none" class="wave">
  <path d="M0,160 C360,240 1080,80 1440,160 L1440,320 L0,320 Z" fill="#6c8eff"></path>
</svg>


.container {
  position: relative;
  height: 300px;
  background: linear-gradient(180deg,#0f172a 0%, #071233 100%);
  overflow: hidden;
}
.wave {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 40%;
  transform-origin: center bottom;
  animation: waveMove 10s linear infinite;
  opacity: 0.9;
}
@keyframes waveMove {
  0% { transform: translateX(0) translateZ(0); }
  50% { transform: translateX(-20%) translateZ(0); }
  100% { transform: translateX(0) translateZ(0); }
}
/* Respect user's motion preference */@media (prefers-reduced-motion: reduce) {
  .wave { animation: none; }
}

توضیح: این کد یک SVG تک‌مسیر (path) برای ایجاد شکل موج رسم می‌کند. SVG درون یک کانتینر قرار دارد و با CSS به‌صورت افقی جابجا می‌شود تا حرکت موج را شبیه‌سازی کند. preserveAspectRatio=”none” باعث می‌شود مسیر در هر اندازه صفحه به عرض کشیده شود. استفاده از translateZ(0) و تعیین transform-origin باعث می‌شود مرورگر از تسریع سخت‌افزاری استفاده کند.

نمونه 2 — چند لایه موج با CSS خالص (pseudo-elements)

.hero {
  position: relative;
  height: 320px;
  background: linear-gradient(180deg, #0f172a 0%, #071233 100%);
  overflow: hidden;
}
.hero::before,
.hero::after {
  content: "";
  position: absolute;
  left: -10%;
  width: 120%;
  height: 140px;
  background: radial-gradient(closest-side, rgba(108,142,255,0.6) 20%, transparent 70%);
  border-radius: 35%;
  opacity: 0.6;
  animation: float 6s linear infinite;
}
.hero::after {
  bottom: 0;
  background: radial-gradient(closest-side, rgba(108,200,255,0.35) 20%, transparent 70%);
  height: 180px;
  animation-duration: 8s;
  transform: translateY(20px);
}
@keyframes float {
  0% { transform: translateX(0) translateY(0); }
  50% { transform: translateX(-25%) translateY(-8px); }
  100% { transform: translateX(0) translateY(0); }
}

توضیح: این روش فقط با pseudo-elementها موج‌هایی با ظاهری نرم و محو ایجاد می‌کند. از radial-gradient برای ساخت منحنی استفاده شده و انیمیشن float حرکت افقی و عمودی ملایم می‌دهد. این تکنیک سبک و مناسب پس‌زمینه‌های ساده است.

نکات بهینه‌سازی و عملکرد

  • از transform (translate, scale) به‌جای تغییر top/left استفاده کنید تا ریل‌تایم GPU را فعال کنید.
  • به مرورگر بگویید چه چیزی تغییر می‌کند با will-change: transform؛ اما محدود و حساب‌شده استفاده کنید تا حافظه اشغال نشود.
  • برای انیمیشن‌های طولانی از animation-timing-function و cubic-bezier استفاده کنید تا حرکت طبیعی‌تر به‌نظر برسد.
  • در صفحات سنگین، موج‌ها را به تصاویر ثابت تبدیل کرده یا از عناصر کم‌جزئیات استفاده کنید تا بار پردازشی کاهش یابد.

دسترس‌پذیری و prefers-reduced-motion

انیمیشن‌های پس‌زمینه ممکن است برای برخی کاربران (مثل افراد حساس به حرکت) آزاردهنده باشد. حتماً از مدیا کوئری prefers-reduced-motion استفاده کنید و انیمیشن‌ها را در صورت انتخاب کاربر خاموش یا سبک کنید.

نمونه 3 — موج عدالت‌محور با clip-path و SVG به‌عنوان ماسک

.section {
  position: relative;
  height: 420px;
  background: linear-gradient(180deg,#124 0%,#246 100%);
  overflow: hidden;
}
.section .wave-mask {
  position: absolute;
  inset: auto 0 0 0;
  height: 120px;
  background: #fff;
  clip-path: url(#waveClip);
  opacity: 0.15;
  animation: slide 12s linear infinite;
}
@keyframes slide {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}
<svg width="0" height="0">
  <defs>
    <clipPath id="waveClip" clipPathUnits="objectBoundingBox">
      <path d="M0,0.6 C0.25,0.7 0.75,0.5 1,0.6 L1,1 L0,1 Z"/>
    </clipPath>
  </defs>
</svg>

توضیح: در این نمونه از SVG به‌عنوان clip-path استفاده شده تا ماسک موجی روی یک عنصر اعمال شود. clip-path که با id در SVG تعریف شده است، به background یا المان سفید اعمال می‌شود و با انیمیشن slide حرکت موج را خلق می‌کند. مزیت این روش کنترل دقیق روی شکل و مقیاس‌پذیری است.

مزایا و معایب روش‌ها

روشمزایامعایب
SVGقابل‌مقیاس، دقیق، جزئیات بالانیاز به دانش مسیرها، حجم بیشتر در صورت پیچیدگی
CSS خالصساده، بدون فایل اضافه، سریعمحدود در شکل‌های پیچیده، ممکن است نیاز به هک‌ها باشد
ترکیبیکنترل کامل و عملکرد مناسبپیچیدگی پیاده‌سازی بیشتر

نکات حرفه‌ای و پیشنهادات کاربردی

  • برای لود سریع‌تر، SVG را درون HTML قرار دهید تا تگ‌ها بتوانند با CSS تعامل داشته باشند و از فایل‌های خارجی پرهیز شود مگر لازم باشد.
  • اگر نیاز به تغییر رنگ دینامیک دارید، از currentColor یا CSS variables برای رنگ مسیرها استفاده کنید.
  • برای جلوه‌های روان‌تر از چند لایه موج با اندازه‌ها و زمان‌های متفاوت استفاده کنید تا عمق مصنوعی ایجاد شود.
  • همیشه با ابزارهای توسعه مرورگر تست کنید که انیمیشن روی صفحه‌های کوچک و بزرگ مناسب باقی بماند و با دستگاه‌های کم‌قدرت سازگار باشد.

مثال بهینه‌سازی: استفاده از CSS variable برای رنگ و کاهش repaints

:root {
  --wave-color: rgba(108,142,255,0.6);
}
.wave path { fill: var(--wave-color); }

توضیح: استفاده از CSS variable اجازه می‌دهد رنگ موج بدون دستکاری DOM یا SVG تغییر کند و مرورگر تغییرات را بهینه‌تر اعمال می‌کند. همچنین می‌توانید رنگ را براساس تم (light/dark) یا حالت عادی/هاور تغییر دهید.

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

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

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