افکت حرکت موج روی پسزمینه با 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 بهترین تعادل بین زیبایی و عملکرد را فراهم میکند. همیشه رفتار را برای کاربرانی که درخواست کاهش حرکت دارند فراهم کنید و در نهایت موجها را به گونهای طراحی کنید که محتوای صفحه تحت تاثیر منفی قرار نگیرد.
آیا این مطلب برای شما مفید بود ؟




