Catatan: Artikel ini mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang animasi CSS. Jika tidak, silakan lihat panduan ini oleh Tom Waterhouse sebelum melanjutkan ke artikel.
Kami menjelajahi web setiap hari, dan sebagai pengembang, kami cenderung memperhatikan detail halus di situs web. Satu hal yang selalu saya perhatikan adalah seberapa halus animasi di situs web. Animasi sangat bagus untuk tujuan UX dan desain. Anda dapat membuat website interaktif yang menyenangkan pengunjung dan membuat mereka mengingat website Anda.
Membuat animasi tingkat lanjut terdengar seperti topik yang sulit, tetapi kabar baiknya adalah, di CSS, Anda dapat menumpuk beberapa animasi sederhana satu sama lain untuk membuat yang lebih kompleks!
Dalam postingan blog ini, Anda akan mempelajari hal-hal berikut:
- Apa itu bezier kubik dan bagaimana penggunaannya untuk membuat animasi “kompleks” hanya dalam satu baris CSS;
- Cara menumpuk animasi satu sama lain untuk membuat animasi tingkat lanjut;
- Cara membuat animasi rollercoaster dengan menerapkan dua poin yang Anda pelajari di atas.
Catatan: Artikel ini mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang animasi CSS. Jika tidak, silakan periksa tautan ini sebelum melanjutkan dengan artikel ini.
Cubic Beziers: Apa Itu?
Fungsi cubic-bezier di CSS adalah fungsi pelonggaran yang memberi Anda kendali penuh atas perilaku animasi Anda terhadap waktu. Berikut definisi resminya:
Fungsi easing kubik Bézier adalah jenis fungsi easing yang ditentukan oleh empat bilangan real yang menentukan dua titik kontrol,
P1
danP2
dari kurva Bézier kubik yang titik akhirnyaP0
danP3
ditetapkan pada (0
,0
) dan (1
,1
) masing-masing. Itux
koordinat dariP1
danP2
terbatas pada jangkauan [0
,1
].
Catatan: Jika Anda ingin mempelajari lebih lanjut tentang fungsi easing, Anda dapat membaca artikel ini. Ini berjalan di belakang layar tentang bagaimana fungsi linear, kubik-bezier, dan tangga bekerja!
Tapi Apa Itu Fungsi Easing?
Mari Kita Mulai Dengan Kurva Linear
Bayangkan dua poin P0 dan P1di mana P0 adalah titik awal dari animasi dan P1 adalah titik akhir. Sekarang bayangkan titik lain bergerak secara linear antara dua titik sebagai berikut:
Ini disebut kurva linier! Ini adalah animasi paling sederhana di luar sana, dan Anda mungkin pernah menggunakannya sebelumnya saat mulai belajar CSS.
Selanjutnya: Kurva Bezier Kuadrat
Bayangkan Anda memiliki tiga poin: P0, P1 dan P2. Anda ingin animasi berpindah dari P0 ke P2. Pada kasus ini, P1 adalah titik kontrol yang mengontrol kurva animasi.
Ide dari bezier kuadrat adalah sebagai berikut:
- Hubungkan garis imajiner antara P0 dan P1 dan antara P1 dan P2 (diwakili oleh garis abu-abu).
- Titik Q0 bergerak sepanjang garis antara P0 dan P1. Pada saat yang sama, Titik Q1 bergerak sepanjang garis antara P1 dan P2.
- Hubungkan garis imajiner antara Q0 dan Q1 (diwakili oleh garis hijau).
- Pada saat yang sama Q0 dan Q1 mulai bergerak, intinya B mulai bergerak di sepanjang garis hijau. Jalur titik itu B ambil adalah jalur animasi.
Perhatikan bahwa Q1, Q2 dan B tidak bergerak dengan kecepatan yang sama. Mereka semua harus memulai pada waktu yang sama dan menyelesaikan jalan mereka pada waktu yang sama pula. Jadi setiap titik bergerak dengan kecepatan yang sesuai berdasarkan panjang garis yang dilaluinya.
Akhirnya: Kurva Cubic Bezier
Kurva bezier kubik terdiri dari 4 poin: P0, P1, P2 dan P3. Animasi dimulai pada P0 dan berakhir pada P3. P1 dan P2 adalah titik kontrol kita.
Bezier kubik berfungsi sebagai berikut:
- Hubungkan garis imajiner antara (P0, P1), (P1, P2) dan (P2, P3). Ini diwakili oleh garis abu-abu.
- Poin Q0, Q1 dan Q2 bergerak sepanjang garis (P0, P1), (P1, P2) dan (P2, P3) masing-masing.
- Hubungkan garis imajiner antara (Q0, Q1) dan (Q1, Q2). Mereka diwakili oleh garis hijau.
- Poin R0 dan R1 bergerak sepanjang garis (Q0, Q1) dan (Q1, Q2) masing-masing.
- Hubungkan garis antara R0 dan R1 (diwakili oleh garis biru).
- Terakhir, Titik B bergerak sepanjang garis yang menghubungkan antara R0 dan R1. Titik ini bergerak di sepanjang jalur animasi.
Jika Anda ingin lebih memahami cara kerja bezier kubik, saya sarankan untuk memeriksa tautan desmos ini. Bermain-main dengan titik kontrol dan periksa bagaimana animasi berubah seiring waktu. (Perhatikan bahwa animasi di tautan diwakili oleh garis hitam.)
Susun Animasi
Animasi besar dengan banyak langkah dapat dipecah menjadi beberapa animasi kecil. Anda dapat mencapainya dengan menambahkan animation-delay
properti ke CSS Anda. Menghitung penundaan itu sederhana; Anda menjumlahkan waktu semua animasi sebelum animasi yang Anda hitung penundaan animasinya.
Sebagai contoh:
animation: movePointLeft 4s linear forwards, movePointDown 3s linear forwards;
Di sini, kami memiliki dua animasi, movePointLeft
dan movePointDown
. Penundaan animasi untuk movePointLeft
akan menjadi nol karena itu adalah animasi yang ingin kita jalankan terlebih dahulu. Namun, penundaan animasi untuk movePointDown
akan menjadi empat detik karena movePointLeft
akan dilakukan setelah waktu tersebut.
Oleh karena itu, animation-delay
properti akan menjadi sebagai berikut:
animation-delay: 0s, 4s;
Perhatikan bahwa jika Anda memiliki dua atau lebih animasi yang dimulai pada waktu yang sama, penundaan animasinya akan sama. Selain itu, saat Anda menghitung penundaan animasi untuk animasi yang akan datang, Anda akan menganggapnya sebagai satu animasi.
Sebagai contoh:
animation: x 4s linear forwards, y 4s linear forwards, jump 2s linear forwards;
Asumsikan kita ingin memulai x
dan y
serentak. Dalam hal ini, penundaan animasi untuk keduanya x
dan y
akan menjadi nol, sedangkan penundaan animasi untuk animasi lompatan akan menjadi empat detik (bukan delapan!).
animation-delay: 0s, 0s, 4s;
Membuat Rollercoaster
Sekarang setelah kita mempelajari dasar-dasarnya, saatnya menerapkan apa yang telah kita pelajari!
Memahami Animasi
Jalur rollercoaster terdiri dari tiga bagian:
- Bagian geser,
- Bagian lingkaran,
- Juga akan ada beberapa animasi untuk membuat spasi horizontal di antara kedua animasi di atas.
Menyiapkan Segalanya
Kita akan mulai dengan membuat sebuah bola sederhana yang akan menjadi “gerobak” kita untuk rollercoaster.
1. Tambahkan ini ke badan file HTML baru Anda:
<div id="the-cart" class="cart"></div>
2. Tambahkan ini ke file CSS Anda:
.cart
background-color: rgb(100, 210, 128);
height: 50px;
width: 50px;
border: 1px solid black;
border-radius: 50px;
position: absolute;
left: 10vw;
top: 30vh;
Saya akan menggunakan lebar viewport (vw
) dan tinggi viewport (vh
) properti untuk membuat animasi responsif. Anda bebas menggunakan unit apa pun yang Anda inginkan.
Bagian Geser
Membuat bagian tempat bola meluncur dapat dilakukan dengan menggunakan fungsi kubik-bezier! Animasi ini terdiri dari 2 animasi, satu di sepanjang x
-axis dan yang lainnya di sepanjang y
-sumbu. Itu x
-Animasi sumbu adalah animasi linier normal di sepanjang x
-sumbu. Kami dapat mendefinisikan bingkai kuncinya sebagai berikut:
@keyframes x
to
left: 40vw;
Tambahkan ke properti animasi Anda di jalur bola sebagai berikut:
animation: x 4s linear forwards
Itu y
-axis animation adalah dimana kita akan menggunakan fungsi cubic-bezier. Pertama-tama mari kita tentukan keyframe animasi. Kami ingin perbedaan antara titik awal dan akhir menjadi sangat kecil sehingga bola mencapai ketinggian yang hampir sama.
@keyframes y
to
top: 29.99vh;
}
Sekarang mari kita pikirkan tentang fungsi kubik-bezier. Kami ingin jalur kami bergerak perlahan ke kanan terlebih dahulu, lalu saat meluncur, jalurnya harus lebih cepat.
- Bergerak perlahan ke kanan berarti $P1$ akan berada di sepanjang
x
-sumbu. Jadi, kita tahu itu di (V
,0
).- Kita harus memilih V yang cocok yang membuat animasi kita bergerak perlahan ke kanan tetapi tidak terlalu banyak sehingga memakan seluruh ruang. Dalam hal ini, saya menemukan itu
0.55
paling cocok.
- Kita harus memilih V yang cocok yang membuat animasi kita bergerak perlahan ke kanan tetapi tidak terlalu banyak sehingga memakan seluruh ruang. Dalam hal ini, saya menemukan itu
- Untuk mencapai efek geser, kita perlu bergerak
P2
ke bawahy
-sumbu (nilai negatif) jadiP2=(X, -Y)
.Y
harus bernilai besar. Dalam hal ini, saya memilihY=5000
.- Mendapatkan
X
, kita tahu bahwa kecepatan animasi kita seharusnya lebih cepat saat meluncur dan lebih lambat saat naik lagi. Jadi, semakin dekatX
adalah nol, Semakin curam animasi akan meluncur. Dalam hal ini, biarkanX = 0.8
.
Sekarang Anda memiliki fungsi kubik-bezier Anda, itu akan menjadi cubic-bezier(0.55, 0, 0.2, -800)
.
Mari tambahkan keyframe ke properti animasi kita:
animation: x 4s linear forwards,
y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards;
Ini adalah bagian pertama dari animasi kita, jadi penundaan animasi adalah nol. Kita harus menambahkan sebuah animation-delay
properti karena mulai dari animasi berikut, animasi akan dimulai pada waktu yang berbeda dari animasi pertama.
animation-delay: 0s, 0s;
Lihat Pena [Rollercoaster sliding part [forked]](https://codepen.io/smashingmag/pen/VwxXBQb) oleh Yosra Emad.
Menambahkan Ruang Horisontal
Sebelum membuat putaran, bola harus bergerak sepanjang x
-axis sebentar, jadi ada ruang di antara kedua animasi. Jadi, ayo lakukan itu!
@keyframes x2
to
left: 50vw;
- Tambahkan ke properti animasi:
animation: x 4s linear forwards,
y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards, x2 0.5s linear forwards;
Animasi ini harus dimulai setelah animasi geser, dan animasi geser membutuhkan waktu empat detik; dengan demikian, penundaan animasi akan menjadi empat detik:
animation-delay: 0s, 0s, 4s;
Lihat Pena [Rollercoaster horizontal space [forked]](https://codepen.io/smashingmag/pen/dyemExY) oleh Yosra Emad.
Bagian Lingkaran
Untuk membuat lingkaran (loop) di CSS, kita perlu memindahkan lingkaran ke tengah loop dan memulai animasi dari sana. Kami ingin jari-jari lingkaran menjadi 100px
jadi kita akan mengubah posisi lingkaran menjadi top: 20vh
(30 adalah radius yang diinginkan (10vh
di sini)). Namun, ini harus terjadi setelah animasi geser selesai, jadi kami akan membuat animasi lain dengan durasi nol detik dan menambahkan penundaan animasi yang sesuai.
@keyframes pointOfCircle
to
top: 20vh;
- Tambahkan ini ke daftar animasi dengan durasi =
0s
:
animation: x 4s linear forwards,
y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards, x2 0.5s linear forwards,
pointOfCircle 0s linear forwards;
- Tambahkan penundaan animasi, yang akan terjadi
4.5s
:
animation-delay: 0s, 0s, 4s, 4.5s;
Lingkaran itu sendiri
Untuk membuat animasi loop:
- Buat keyframe yang menggerakkan bola kembali ke posisi lama dan kemudian memutar bola:
@keyframes loop
from
transform: rotate(0deg) translateY(10vh) rotate(0deg);
to
transform: rotate(-360deg) translateY(10vh) rotate(360deg);
- Tambahkan bingkai kunci lingkaran ke properti animasi:
animation: x 4s linear forwards,
y 4s cubic-bezier(0.55, 0, 0.2, -5000) forwards, x2 0.5s linear forwards,
pointOfCircle 0s linear forwards, loop 3s linear forwards;
- Tambahkan penundaan animasi, yang juga akan menjadi
4.5
detik di sini:
animation-delay: 0s, 0s, 4s, 4.5s, 4.5s;
Lihat Pena [Rollercoaster loop [forked]](https://codepen.io/smashingmag/pen/mdLxZdR) oleh Yosra Emad.
Menambahkan Spasi Horizontal (Lagi)
Kami hampir selesai! Kita hanya perlu memindahkan bola setelah animasi di sepanjang x
-sumbu agar bola tidak berhenti tepat setelah loop seperti pada gambar di atas.
@keyframes x3
to
left: 70vw;
- Tambahkan bingkai utama ke properti animasi:
animation: x 4s linear forwards,
y 4s cubic-bezier(0.55, 0, 0.2, -800) forwards, x2 0.5s linear forwards,
pointOfCircle 0s linear forwards, loop 3s linear forwards,
x3 2s linear forwards;
- Menambahkan penundaan yang sesuai, ini dia
7.5s
:
animation-delay: 0s, 0s, 4s, 4.5s, 4.5s, 7.5s;
Hasil Akhir
Lihat Pena [Rollercoaster Final [forked]](https://codepen.io/smashingmag/pen/wvjmLKp) oleh Yosra Emad.
Kesimpulan
Pada artikel ini, kami membahas cara menggabungkan beberapa bingkai utama untuk membuat jalur animasi yang kompleks. Kita juga membahas bezier kubik dan cara menggunakannya untuk membuat fungsi easing Anda sendiri. Saya akan merekomendasikan untuk melanjutkan dan membuat jalur animasi Anda sendiri untuk mengotori tangan Anda dengan animasi. Jika Anda memerlukan bantuan atau ingin memberikan umpan balik, Anda dipersilakan untuk mengirim pesan ke salah satu tautan di sini. Selamat siang/malam yang indah!
(vf, itu, yk)
Pengeluaran hk tercepat hari ini dari website togel Data SGP pools https://survivingmommy.com/ hasil keluaran hk terkini tiap hari. Dengan kenakan rekapan bagan information hk prize, Pasti mempermudah bettor didalam lihat no pengeluaran SGP hari ini. Di mana tiap hasil pengeluaran hk https://avonauthors.com/ ini terkini tetap kami pembaharuan menjajaki result keluaran hongkong terkini berasal dari hongkongpools.com. Tujuannya supaya para pengagum judi togel https://testbankcampus.com/ di Indonesia bisa bersama mudahnya mengenali hasil hk hari ini terkini dan juga terlalu kilat.