Sau đây mình xin hướng dẫn cách tạo một Bouncing Page Loader giống như hình bên trên, ta có thể làm theo cách sau:
HTML
- Đầu tiên, hãy viết HTML cơ bản cho project của bạn
<p>Hello world!</p>
<div class="loader">
<span></span>
<span></span>
<span></span>
</div>
- Ta sẽ thêm một
div
mới với class làloader
.div
này chịu trách nhiệm cho thằngloader
trên trang của mình. Trongdiv
này, ta thêm ba thẻspan
liên tiếp, mỗi thẻ đại diện cho vòng tròn trên trình tải trang.
CSS Style
- Trước tiên hãy tạo style cho các thẻ cơ bản của chúng ta.
body {
background: #2C294F;
padding: 2rem;
}
p {
color: white;
text-align: center;
}
- Đoạn code trên xác định các kiểu CSS tùy chọn cho thẻ
p
vàbody
Tạo style cho class loader
- Tiếp theo, ta tạo style cho thằng
loader
của mình với các thuộc tính sau:
.loader {
display: flex;
justify-content: center;
align-items: center;
}
- Ở đây ta sử dụng Flexbox (
display: flex;
). Thuộc tính để đặtbouncing page loader
của mình ở giữa trang theo chiều ngang và chiều dọc.
.loader > span {
background: #FAD000;
border-radius: 50%;
margin: 5rem 0.5rem;
animation: bouncingLoader 0.6s infinite alternate;
}
.loader > span:nth-child(2) {
animation-delay: 0.2s;
}
.loader > span:nth-child(3) {
animation-delay: 0.4s;
}
- Mỗi vòng tròn sẽ có được tạo style:
width: 1rem;
vàheight:1rem;
với màu là#FFB651
. Theo mặc định, hình dạngloader
của ta sẽ là hình vuông. Để tạo cho nó một hình tròn, ta đặtborder-radius
thành 50%. - Ta cũng đã chỉnh lề giữa cho các vòng tròn (
margin: 5rem 0.5rem;
). Tuy nhiên phần thú vị nhất ở đây là thuộc tínhanimation
. Chúng ta đang sử dụng mộtanimation keyframe
được gọi làbouncingLoader
chạy một lần trong 0,6 giây và cứ thế cứ thế nó lặp đi lặp lại. (Nếu bạn muốnloader
của mình ở dạng hình vuông, hãy bỏ thuộc tínhborder-radius
đi)
Tạo Animation Keyframe
Keyframes
được sử dụng để định nghĩa cách hoạt động củaanimation
mà mình đang tạo và cung cấp cho ta quyền kiểm soát hoàn toàn một chu kỳ củaanimation
trong CSS. Chúng tôi định nghĩa nó là@keyframes
theo sau là tên củaanimation
trong trường hợp này làbouncingLoader
.- Bên trong
@keyframe
, ta sử dụng các từ khóafrom
vàto
để chỉ định điểm bắt đầu và điểm kết thúc choanimation
của mình. Ta cũng có thể sử dụng0%
chofrom
để từ đó mô tả điểm bắt đầu và100%
choto
để mô tả điểm kết thúc choanimation
. - Nếu ta muốn một vài hiệu ứng chuyển tiếp, ta có thể xác định một phạm vi tỷ lệ phần trăm, mỗi phần chứa danh sách các tùy chọn mà ta cần. Các tỷ lệ phần trăm này có thể được liệt kê theo bất kỳ thứ tự nào cùng với sự khác biệt giữa chúng. Ví dụ:
@keyframes animationExample {
0% { opacity: 1; }
30% { opacity: 0.75; }
50% { opacity: 0.5; }
100% { opacity: 0.25; }
}
- Quay trở lại bài viết, ta sẽ viết
keyframe
cho thằngloader
của mình
@keyframes bouncingLoader {
from {
width: 0.1rem;
height: 0.1rem;
opacity: 1;
transform: translate3d(0);
}
to {
width: 1rem;
height: 1rem;
opacity: 0.1;
transform: translate3d(0, -1rem, 0);
}
}
- Ta sử dụng các từ khóa
from
vàto
để xác định các thuộc tính kiểu dáng cơ bản về chiều rộng, chiều cao và độ mờ của các vòng tròn. Ngoài ra, để tạo hiệu ứngbouncing
, ta sử dụng thuộc tínhtransform
CSS để thay đổi tọa độ của một phần tử đã cho để chuyển đổi vị trí của mỗi vòng tròn. - Với thuộc tính
transform
này, ta đã sử dụng hàmtranslate3D()
có ba đầu vào là các tọa độ x, y, z. Vì ta muốn trình tải của mình chạy theo chuyển động sóng, nên ta cần dịch chủ yếu theo trục y và giữ cho trục x và z không đổi. Do đó, giá trị điểm kết thúc của ta là(0, -1rem, 0)
. - Nếu ta đặt giá trị điểm kết thúc của mình là biến đổi:
translate3d (1rem, 0rem, 1rem);
. Điều đó có nghĩa là ta đang chuyển đổi nó dọc theo trục x và z trong khi giữ cho trục y của ta không đổi. Nó sẽ thành như thế này:\
Sử dụng Animation Delay với Keyframe
- Vì ta đã viết mã cho
@keyframe
của mình nên bây giờ ta sẽ thiết lập và chạy nó.
.loader > span {
background: #FAD000;
border-radius: 50%;
margin: 5rem 0.5rem;
animation: bouncingLoader 0.6s infinite alternate;
}
- Ta định kiểu phần tử ta muốn tạo hiệu ứng với thuộc tính
animation
cộng với việc có thể có hoặc không có thuộc tính phụ cho nó. Sử dụng thuộc tính này, ta có thể kiểm soáttiming, duration
và các chi tiết khác củaanimation
. Ví dụ:
animation: animation-name, animation-duration, animation-iteration-count, animation-direction;
/*animation-name: Xác định tên của animation của mình, trong trường hợp của ta là thằng loader*/
/*animation-duration: cấu hình thời lượng mà animation của mình sẽ mất để hoàn thành một chu kỳ*/
/*animation-iteration-count: Cho biết số lần ta muốn chu kỳ animation của mình phát trước khi dừng*/
/*animation-direction: Xác định rằng animation của mình sẽ phát theo hướng nào*/
OK, trên đây là cách mình tạo ra một Bouncing Page Loader. Cảm ơn các bạn đã đọc bài viết này!