برای درک بهتر آنچه که میخواهیم بسازیم، این را بررسی کنید صفحه نمایشی. برای تکرار انیمیشن حتما روی لینک های منو کلیک کنید.
از آنجایی که هر دو انیمیشن شباهت هایی دارند، من برخی از بخش های محتوایی را از آموزش قبلی قرض می کنم. این کمک می کند تا هر آموزش دقیق و مستقل بماند.
نمایش انیمیشن صفحه
برای این آموزش نسخه ی نمایشی ما نمی خواهد زنده در CodePen از آنجایی که برای نمایش انیمیشن به صفحات مختلفی نیاز داریم، تصمیم گرفتم که بهتر است آن را در GitHub میزبانی کنیم. اینجاست ساختار پروژه:
1 |
panels-animation/ |
2 |
├── about.html |
3 |
├── contact.html |
4 |
├── index.html |
5 |
├── main.css |
6 |
└── main.js |
قبل از اینکه ادامه دهیم، شایان ذکر است که الهامبخش این دمو از نمایش نسبتاً دوستداشتنی گرفته شده است وب سایت Nine Orchard.



1. با علامت گذاری صفحه شروع کنید
بیایید نشانه گذاری را برای index.html
صفحه این صفحه مشابه صفحات دیگر خواهد بود.
در داخل آن قرار می دهیم:
- یک هدر صفحه معمولی
- پنل هایی که وظیفه تقسیم صفحه نمایش به هفت قسمت مساوی را بر عهده خواهند داشت.
- این
main
عنصری که محتوای اصلی صفحه در آن زندگی می کند.
علاوه بر این، ما وارد خواهیم کرد:
با در نظر گرفتن تمام موارد فوق، در اینجا نشانه گذاری مرتبط آمده است:
1 |
<!doctype html>
|
2 |
<html lang="en"> |
3 |
<head>
|
4 |
<meta charset="utf-8"> |
5 |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
6 |
<link rel="preconnect" href="https://fonts.gstatic.com"> |
7 |
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;700&display=swap"> |
8 |
<link rel="stylesheet" href="main.css"> |
9 |
<title>Simple JavaScript Page Loading Animation</title> |
10 |
</head>
|
11 |
|
12 |
<body>
|
13 |
<header class="page-header"> |
14 |
<nav>
|
15 |
<ul>
|
16 |
<li>
|
17 |
<a href="index.html">Home</a> |
18 |
</li>
|
19 |
<!-- more list items -->
|
20 |
</ul>
|
21 |
</nav>
|
22 |
</header>
|
23 |
|
24 |
<ul class="panels"> |
25 |
<li class="panel" style="--index: 3"></li> |
26 |
<li class="panel" style="--index: 2"></li> |
27 |
<li class="panel" style="--index: 1"></li> |
28 |
<li class="panel" style="--index: 0"></li> |
29 |
<li class="panel" style="--index: 1"></li> |
30 |
<li class="panel" style="--index: 2"></li> |
31 |
<li class="panel" style="--index: 3"></li> |
32 |
</ul>
|
33 |
|
34 |
<main class="page-main"> |
35 |
<div>
|
36 |
<h1>Home Page</h1> |
37 |
<!-- put more content here -->
|
38 |
</div>
|
39 |
</main>
|
40 |
|
41 |
<script src="main.js"></script> |
42 |
</body>
|
43 |
</html>
|
استایل های درون خطی را که به پنل ها اضافه می کنیم در نظر بگیرید. همانطور که بعدا خواهیم دید، ما از آن استفاده خواهیم کرد index
متغیر CSS برای متحرک سازی آنها. هر چه مقدار بزرگتر باشد، زمان بیشتری طول می کشد تا عنصر مرتبط متحرک شود.
2. برخی از سبک های اساسی را تعریف کنید
در مرحله بعد، با برخی از متغیرهای CSS و بازنشانی سبکها ادامه میدهیم:
1 |
:root { |
2 |
--panel-width: calc(100% / 7); |
3 |
--darkblue: #02020c; |
4 |
--white: #fff; |
5 |
--lightgray: #fafafb; |
6 |
}
|
7 |
|
8 |
* { |
9 |
padding: 0; |
10 |
margin: 0; |
11 |
box-sizing: border-box; |
12 |
}
|
13 |
|
14 |
ul { |
15 |
list-style: none; |
16 |
}
|
17 |
|
18 |
a { |
19 |
color: inherit; |
20 |
text-decoration: none; |
21 |
}
|
22 |
|
23 |
h1 { |
24 |
font-size: 3rem; |
25 |
}
|
26 |
|
27 |
body { |
28 |
height: 100vh; |
29 |
font-family: "Montserrat", sans-serif; |
30 |
color: var(--white); |
31 |
background: var(--darkblue); |
32 |
overflow: hidden; |
33 |
}
|
سه نکته قابل توجه:
- این
panel-width
متغیر عرض پانل را تعیین می کند. - ارتفاع صفحه برابر با ارتفاع نمای پورت خواهد بود.
- ما هر نوار پیمایش احتمالی را که ممکن است بسته به مقدار محتوای صفحه ظاهر شود، پنهان می کنیم.
3. سبک های اصلی را مشخص کنید
بیایید اکنون بر روی آن تمرکز کنیم اصلی سبک ها ما سبکهای هدر را کنار میگذاریم زیرا اهمیتی ندارند.
4. انیمیشن ها را آتش بزنید
هنگامی که صفحه بارگیری می شود، انیمیشن های زیر باید به ترتیب پخش شوند:
- ابتدا، پانل ها باید از پایین به بالا ظاهر شوند.
- سپس، پانل ها باید ناپدید شوند و به سمت بالا حرکت کنند.
- در نهایت، تمام محتویات صفحه باید قابل مشاهده باشند.
در دو مرحله اول، پانل ها با کمی تاخیر جابجا می شوند. همانطور که قبلاً بحث کردیم، این به ارزش آنها بستگی دارد index
متغیر.
تقلید از یک جدول زمانی
خلق كردن دنباله ای از توئین ها مانند دفعه قبل جدول زمانی GSAP، ما تاز یک رویداد کمتر شناخته شده به نام استفاده کنید transitionend
. این رویداد هر بار که یک انتقال CSS به پایان می رسد فعال می شود و به ما توانایی همگام سازی انیمیشن ها را می دهد.
البته، ما به همه انتقالها علاقهای نداریم، در عوض، فقط به انتقال پانلها و بهویژه انتقالهای آخرین پانل متحرک اهمیت میدهیم. در مورد ما، آخرین پانل های متحرک اولین و هفتمین (آخرین) خواهد بود همانطور که هر دو دارند index: 3
.



همانطور که در کد خواهید دید، ما با آخرین مورد کار خواهیم کرد، اما به همان اندازه می توانستیم از اولین مورد استفاده کنیم. برای درک بهتر آن، سعی کنید به پانل انتخاب شده تاخیر زیادی در حدود 1 ثانیه بدهید و ببینید که چگونه انیمیشن ها از هماهنگی خارج می شوند.
از نظر منطق کد، کارهای زیر را به ترتیب انجام می دهیم:
- ابتدا، هنگامی که صفحه بارگیری می شود، ما آن را اضافه می کنیم
loaded
کلاس بهbody
. - سپس، منتظر میمانیم تا انتقال آخرین پانل به پایان برسد-این در مجموع دو بار شلیک می کند. در آن مرحله، کلاس دیگری را به آن اضافه می کنیم
body
. اولین بار ما اضافه می کنیمsecond-round
کلاس، در حالی که بار دوم، ما را اضافه می کنیمthird-round
.
پس از تکمیل انتقال ما، body
این کلاس ها را خواهند داشت:



این کد جاوا اسکریپت است:
1 |
const body = document.body; |
2 |
const lastPanel = document.querySelector(".panels .panel:last-child"); |
3 |
|
4 |
window.addEventListener("load", () => { |
5 |
body.classList.add("loaded"); |
6 |
|
7 |
lastPanel.addEventListener("transitionend", () => { |
8 |
if (body.classList.contains("second-round")) { |
9 |
body.classList.add("third-round"); |
10 |
} else { |
11 |
body.classList.add("second-round"); |
12 |
}
|
13 |
});
|
14 |
});
|
به جای load
رویداد، ما می توانستیم از آن استفاده کنیم DOMContentLoaded
رویداد.
و سبک های مربوطه:
1 |
.loaded .panels .panel { |
2 |
clip-path: inset(0); |
3 |
transition-delay: calc(var(--index) * 0.06s); |
4 |
}
|
5 |
|
6 |
.loaded.second-round .panels .panel { |
7 |
clip-path: inset(0 0 100% 0); |
8 |
}
|
9 |
|
10 |
.loaded.third-round { |
11 |
overflow: auto; |
12 |
}
|
13 |
|
14 |
.loaded.third-round .page-main > div > * { |
15 |
opacity: 1; |
16 |
transform: none; |
17 |
}
|
نتیجه
تبریک میگم، مردم! ما موفق به ساخت یک جذاب شدیم انیمیشن بارگذاری صفحه جاوا اسکریپت توسط انیمیشن های خیره کننده به لطف transitionend
رویداد. بدیهی است که برای استفاده سنگین تر از انیمیشن ها، کتابخانه ای مانند GSAP رویکرد قوی تری برای دنبال کردن است. می توانید نسخه ی نمایشی را همانطور که می خواهید گسترش دهید و آن را با من به اشتراک بگذارید!
مثل همیشه، خیلی ممنون که خواندید!
پروژه های بیشتر برای تمرین
به این پروژه ها در Tuts+ که از clip-path
ویژگی برای اعمال انواع مختلف انیمیشن ها.