در این آموزش، ما میخواهیم یک افکت برفی متحرک را با استفاده از CSS و جاوا اسکریپت وانیلی در یک صفحه وب، درست به موقع برای فصل تعطیلات پیادهسازی کنیم.
این فصل شادی است، پس بگذار برف ببارد، بگذار برف ببارد، بگذار برف ببارد!
1. نشانه گذاری با HTML تعطیلات
برای نشانه گذاری خود، دو کانتینر اصلی خواهیم داشت: یک عنصر اصلی حاوی محتوای صفحه ما و یک عنصر کانتینر برفی که برف را نمایش می دهد.
<main> <h1>Happy Holidays!</h1> </main> <div id="snow-container"> </div>
2. استایلینگ فصل با CSS
در این نسخه ی نمایشی، محتوای اصلی ما دارای رنگ پس زمینه گرادیان است تا جلوه ای از آسمان شب به آن بدهد. ما با استفاده از CSS به این امر دست پیدا می کنیم گرادیان خطی عملکرد.
برای سادگی، فرض کنید ما این را در CodePen میسازیم، بنابراین نشانهگذاری در برگه HTML، استایلها در تب CSS و غیره قرار میگیرد.
main { background: linear-gradient(to bottom, #2d91c2 0%, #1e528e 100%); display: flex; align-items: center; justify-content: center; font-family: "Pacifico", cursive; height: 100vh; padding: 20px; text-align: center; } h1 { color: white; }
بنر ما اکنون به این شکل است:



ما همچنین از CSS برای مدیریت انیمیشن هر عنصر برفی استفاده خواهیم کرد. هر دانهی برف دو انیمیشن خواهد داشت: یک انیمیشن پاییزی برای کنترل دانههای برف که از بالا به پایین صفحه حرکت میکند و یک انیمیشن نوسانی برای حرکت آهسته دانههای برف به سمت دیگر.
@keyframes fall { 0% { opacity: 0; } 50% { opacity: 1; } 100% { top: 100vh; opacity: 1; } } @keyframes sway { 0% { margin-left: 0; } 25% { margin-left: 50px; } 50% { margin-left: -50px; } 75% { margin-left: 50px; } 100% { margin-left: 0; } }
همچنین به محفظه برفی خود و عنصر برفی که در جاوا اسکریپت ایجاد خواهیم کرد، استایل می دهیم.
#snow-container { height: 100vh; overflow: hidden; position: absolute; top: 0; transition: opacity 500ms; width: 100%; } .snow { animation: fall ease-in infinite, sway ease-in-out infinite; color: skyblue; position: absolute; }
ویژگی انیمیشن در این دمو سه مقدار دارد:
- نام: این مقدار انیمیشنی است که در زیر فریم های کلیدی ایجاد کردیم.
- زمان سنجی: این نحوه پیشرفت انیمیشن را مشخص می کند.
- تکرار: این تعداد دفعاتی است که انیمیشن اتفاق می افتد. ما از بی نهایت برای تکرار مداوم انیمیشن دانه های برف استفاده می کنیم.
3. فا لا لا لا لا عملکرد ♬
حالا میتوانیم روی قسمت سرگرمکننده کار کنیم: برف کردن! ابتدا، در تب JS در CodePen، بیایید یک مقدار به عنصر ظرف خود اختصاص دهیم:
const snowContainer = document.getElementById("snow-container");
برای محتوای برف ریزه خود، از نمادهای HTML (❄ ❅ ❆) استفاده خواهیم کرد:



ما یک آرایه snowContent ایجاد خواهیم کرد که حاوی کدهای نماد باشد
const snowContent = ['❄', '❅', '❆']
برای ایجاد افکت برف در حال سقوط، باید ظاهر و انیمیشن هر دانه برف را تصادفی کنیم.
ما استفاده خواهیم کرد Math.random()
و Math.floor()
توابعی برای تولید مقادیر تصادفی برای عناصر برفی ما.
const random = (num) => { return Math.floor(Math.random() * num); }
اکنون میتوانیم یک تابع برای ایجاد یک استایل تصادفی برای هر دانهی برف ایجاد کنیم. ما موقعیت، اندازه و مدت انیمیشن تصادفی ایجاد خواهیم کرد.
const getRandomStyles = () => { const top = random(100); const left = random(100); const dur = random(10) + 10; const size = random(25) + 25; return ` top: -${top}%; left: ${left}%; font-size: ${size}px; animation-duration: ${dur}s; `; }
برای مدت زمان و اندازه ثابت، یک مقدار عدد ثابت اضافه می کنیم تا مطمئن شویم که عدد تصادفی تولید شده دارای حداقل مقدار عددی است که اضافه می شود (یعنی کمترین عدد برای مدت زمان انیمیشن هر دانه برف 10 ثانیه است)
برای ثابت بالای خود، یک مقدار منفی نسبت می دهیم تا دانه های برف از هر درصدی بالای صفحه قابل مشاهده شروع شود.
در مرحله بعد، ما به اضافه کردن دانه های برف به ظرف برف می پردازیم.
const createSnow = (num) => { for (var i = num; i > 0; i--) { var snow = document.createElement("div"); snow.className = "snow"; snow.style.cssText = getRandomStyles(); snow.innerHTML = snowContent[random(2)] snowContainer.append(snow); } }
در این دمو از a استفاده می کنیم برای حلقه برای ایجاد تعداد ثابت دانه های برف و اضافه کردن آنها به ظرف. ما همچنین به صورت تصادفی innerHTML را به عنوان هر یک از مقادیر موجود در خود اختصاص می دهیم snowContent
آرایه.
سپس، ما تماس بگیرید createSnow
هنگامی که صفحه ما با استفاده از شنونده رویداد بارگذاری بارگیری می شود، عملکرد را انجام دهید.
window.addEventListener("load", () => { createSnow(30) });
و برف می بارد! کلیک اجرا مجدد برای دیدن برف متحرک:
از بین بردن دانه های برف
همچنین میتوانیم یک تابع برای حذف دانههای برف اضافه کنیم.
const removeSnow = () => { snowContainer.style.opacity = "0"; setTimeout(() => { snowContainer.remove() }, 500) }
در این تابع، به snowContainer خود یک کدورت 0 اختصاص می دهیم تا به آرامی محو شود و بعد از نیم ثانیه، ظرف را با استفاده از .remove()
روش.
سپس می توانیم انتخاب کنیم که این تابع را هر طور که می خواهیم فراخوانی کنیم. هنگامی که کاربر در هر نقطه از صفحه کلیک می کند، می توانیم برف را حذف کنیم:
window.addEventListener("click", () => { removeSnow() });
یا می توانیم آن را در تابع setTimeout () قرار دهیم تا پس از مدت زمان مشخصی ناپدید شود:
window.addEventListener("load", () => { createSnow(30) setTimeout(removeSnow, 10000) });
خاموش کردن دانه های برف
از آنجایی که ما این را از ابتدا ساختهایم، میتوانیم محتوای عنصر و انیمیشن را نیز بهروزرسانی کنیم تا جلوههای سرگرمکننده دیگری مانند بالنهای شناور ایجاد کنیم:
یا حتی گربه Nyan متحرک:
امیدوارم از این آموزش متحرک برف لذت برده باشید و باعث شده احساس خوبی داشته باشید و جشن بگیرید!