Τι είναι αυτό το εργαλείο;
Το cubic-bezier() είναι μια συνάρτηση χρονισμού CSS που ελέγχει πώς μια κινούμενη ή μεταβατική τιμή επιταχύνει και επιβραδύνει με τον χρόνο, αντί να κινείται με σταθερό ρυθμό. Ορίζεται από δύο σημεία ελέγχου — (x1, y1) και (x2, y2) — που κάμπτουν μια καμπύλη μεταξύ ενός σταθερού σημείου εκκίνησης (0,0) και σημείου τέλους (1,1). Οι τιμές x πρέπει να παραμένουν μεταξύ 0 και 1, αλλά οι τιμές y μπορούν να ξεπερνούν αυτό το εύρος για να δημιουργήσουν εφέ υπερπήδησης ή αναπήδησης.
Γραμμένο με το χέρι, η ρύθμιση τεσσάρων δεκαδικών αριθμών για να πετύχετε ένα αίσθημα που δεν είναι ούτε πολύ απότομο ούτε πολύ μαλακό απαιτεί πολύ δοκιμή και λάθος. Αυτό το εργαλείο αντικαθιστά αυτή την αστάθμητη διαδικασία με άμεσο χειρισμό: σύρετε έναν ολισθητή, δείτε την καμπύλη να κάμπτεται και τη μπάλα προεπισκόπησης να κινείται ανάλογα, και αντιγράψτε το CSS μόλις η κίνηση αισθάνεται σωστή.
Πηγή: CSS Easing Functions Level 1, W3C — η προδιαγραφή που ορίζει το cubic-bezier() και τις πέντε ονομαστικές λέξεις-κλειδιά στις οποίες βασίζονται τα προκαθορισμένα αυτού του εργαλείου.
Γιατί να το χρησιμοποιήσετε;
- Ζωντανό γράφημα SVG δείχνει ακριβώς πώς κάμπτεται η καμπύλη σας μεταξύ των σταθερών σημείων εκκίνησης και τέλους, με και τα δύο σημεία ελέγχου και τις λαβές τους σχεδιασμένες για σαφήνεια.
- Το κουμπί αναπαραγωγής κάνει κινούμενη εικόνα ενός στοιχείου προεπισκόπησης σε μια διαδρομή χρησιμοποιώντας την ακριβή καμπύλη σας, ώστε να αισθανθείτε την κίνηση, όχι μόνο να δείτε ένα στατικό γράφημα.
- Προκαθορισμένα με ένα κλικ για τις πέντε τυπικές ονομαστικές συναρτήσεις εξομάλυνσης — ease, ease-in, ease-out, ease-in-out και linear — όπως τεκμηριώνονται στην προδιαγραφή CSS Easing Functions.
- Οι τιμές Y μπορούν να πάνε κάτω από 0 ή πάνω από 1, επιτρέποντάς σας να χτίσετε εφέ εξομάλυνσης τύπου υπερπήδησης/αναπήδησης που οι ονομαστικές λέξεις-κλειδιά δεν μπορούν να παράγουν.
- Παράγει CSS transition-timing-function έτοιμο προς επικόλληση — η ίδια τιμή λειτουργεί επίσης για animation-timing-function.
- Τρέχει εξ ολοκλήρου στον περιηγητή σας — τίποτα από όσα ρυθμίζετε δεν ανεβαίνει πουθενά. Δωρεάν, χωρίς εγγραφή.
Πώς χρησιμοποιείται
- Σύρετε τους ολισθητές x1/y1 για να ορίσετε το πρώτο σημείο ελέγχου, που διαμορφώνει πώς ξεκινά η κινούμενη εικόνα.
- Σύρετε τους ολισθητές x2/y2 για να ορίσετε το δεύτερο σημείο ελέγχου, που διαμορφώνει πώς τελειώνει η κινούμενη εικόνα.
- Παρακολουθήστε τη μαύρη καμπύλη στο γράφημα — μια καμπύλη που φουσκώνει πάνω από τη διαγώνιο νωρίς σημαίνει ότι η κίνηση ξεκινά γρήγορα, μια που παραμένει κάτω από αυτήν σημαίνει ότι η κίνηση ξεκινά αργά.
- Κάντε κλικ στο Play για να δείτε ένα στοιχείο προεπισκόπησης να κινείται σε μια διαδρομή χρησιμοποιώντας την καμπύλη σας ως transition-timing-function.
- Δοκιμάστε ένα προκαθορισμένο (ease, ease-in, ease-out, ease-in-out, linear) ως σημείο εκκίνησης, και μετά μετακινήστε τους ολισθητές από εκεί.
- Αντιγράψτε το παραγόμενο CSS και επικολλήστε το σε κανόνα transition ή animation.
Παράδειγμα
Είσοδος
x1: 0.25, y1: 0.1, x2: 0.25, y2: 1Έξοδος
transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1);Αυτή είναι η τυπική λέξη-κλειδί ease της CSS γραμμένη ως ρητά σημεία ελέγχου — γρήγορη εκκίνηση, απότομη επιτάχυνση, μετά σταδιακή επιβράδυνση προς το τέλος.
Γιατί οι τιμές y μπορούν να ξεπεράσουν το 0–1
Σε αντίθεση με τον άξονα x, που αντιπροσωπεύει τον χρόνο και πρέπει να τρέχει από 0 έως 1, ο άξονας y αντιπροσωπεύει την πρόοδο της κινούμενης τιμής και δεν έχει τέτοιο όριο. Ορίζοντας το y1 κάτω από 0 ή το y2 πάνω από 1 κάνει την καμπύλη να βυθίζεται πέρα από την αρχική τιμή ή να ξεπερνά την τελική τιμή πριν σταθεροποιηθεί — η βάση των εφέ υπερπήδησης και προσδοκίας που χρησιμοποιούνται σε πατήματα κουμπιών, εμφανίσεις modal και παιχνιδιάρικες μικρο-αλληλεπιδράσεις UI. Καμία από τις πέντε ονομαστικές λέξεις-κλειδιά (ease, ease-in, ease-out, ease-in-out, linear) δεν μπορεί να το παραγάγει αυτό· χρειάζεστε προσαρμοσμένο cubic-bezier() για αυτό.
transition-timing-function έναντι animation-timing-function
Η τιμή cubic-bezier() που παράγει αυτό το εργαλείο λειτουργεί πανομοιότυπα και στις δύο ιδιότητες. Χρησιμοποιήστε transition-timing-function όταν η κίνηση ενεργοποιείται από αλλαγή κατάστασης (όπως ένα hover ή εναλλαγή κλάσης), και animation-timing-function μέσα σε κανόνα κινούμενης εικόνας οδηγούμενο από @keyframes όταν χρειάζεστε το ίδιο αίσθημα εξομάλυνσης εφαρμοσμένο αυτόματα ή σε βρόχο.
Συνηθισμένα μοτίβα εξομάλυνσης
- Σβέλτη ανατροφοδότηση UI (κουμπιά, διακόπτες): κρατήστε τα σημεία ελέγχου κοντά στη διαγώνιο με ελαφριά τάση ease-out, π.χ. cubic-bezier(0.4, 0, 0.2, 1).
- Η τυπική καμπύλη του Material Design: cubic-bezier(0.4, 0, 0.2, 1) — γρήγορη εκκίνηση, ήπιο τέλος, ευρέως χρησιμοποιούμενη για μεταβάσεις πάνελ και καρτών.
- Αναπήδηση/υπερπήδηση: σπρώξτε το y2 πάνω από 1, π.χ. cubic-bezier(0.34, 1.56, 0.64, 1), για παιχνιδιάρικο αίσθημα εμφάνισης.
- Προσδοκία πριν την κίνηση: σπρώξτε το y1 κάτω από 0 ώστε το στοιχείο να τραβιέται ελαφρώς προς τα πίσω πριν κινηθεί εμπρός.
- Ομαλή ease-in-out για επαναλαμβανόμενες κινούμενες εικόνες: κρατήστε την καμπύλη κοντά σε συμμετρική γύρω από το κέντρο.
Συνδυασμός με άλλα εργαλεία CSS
Μια καμπύλη εξομάλυνσης σπάνια στέκεται μόνη της — συνήθως εφαρμόζεται σε στοιχείο που χρειάζεται επίσης οριζόμενες σκιές, στρογγυλεμένες γωνίες ή διαβαθμίσεις. Δημιουργήστε το οπτικό στυλ με τα άλλα εργαλεία CSS παρακάτω, μετά προσθέστε τη συνάρτηση χρονισμού από αυτό το εργαλείο στον ίδιο κανόνα ή δήλωση transition/animation.
Συχνές ερωτήσεις
Τι σημαίνουν στην πραγματικότητα οι τέσσερις αριθμοί στο cubic-bezier();
Είναι οι συντεταγμένες δύο σημείων ελέγχου, (x1, y1) και (x2, y2), που κάμπτουν μια καμπύλη Bézier που τρέχει από ένα σταθερό σημείο εκκίνησης στο (0,0) έως ένα σταθερό σημείο τέλους στο (1,1). Ο άξονας x αντιπροσωπεύει τον διερχόμενο χρόνο (0 έως 1) και ο άξονας y αντιπροσωπεύει πόσο έχει προχωρήσει η κινούμενη ιδιότητα, γι' αυτό τα x1 και x2 πρέπει να παραμένουν εντός 0–1 ενώ τα y1 και y2 μπορούν να ξεπερνούν αυτό το εύρος.
Ποια είναι η διαφορά μεταξύ ease, ease-in, ease-out και ease-in-out;
Το ease (η προεπιλογή CSS) ξεκινά γρήγορα, μετά επιβραδύνει απαλά. Το ease-in ξεκινά αργά και επιταχύνει προς το τέλος, χρήσιμο για στοιχεία που αφήνουν την οθόνη. Το ease-out ξεκινά γρήγορα και επιβραδύνει, χρήσιμο για στοιχεία που εισέρχονται στην οθόνη. Το ease-in-out είναι αργό και στα δύο άκρα και πιο γρήγορο στη μέση, δίνοντας ένα ομαλό, συμμετρικό αίσθημα.
Μπορώ να χρησιμοποιήσω την ίδια τιμή cubic-bezier() και για transitions και για animations;
Ναι. Τα transition-timing-function και animation-timing-function δέχονται την ακριβώς ίδια σύνταξη cubic-bezier() και παράγουν την ίδια καμπύλη εξομάλυνσης — η μόνη διαφορά είναι σε ποιο χαρακτηριστικό CSS (ένα transition έναντι μιας κινούμενης εικόνας keyframes) είναι συνδεδεμένη αυτή η συνάρτηση χρονισμού.
Γιατί η καμπύλη μου φαίνεται 'σπασμένη' όταν το y1 ή το y2 είναι πολύ μεγάλο ή αρνητικό;
Αυτό είναι αναμενόμενο — η ώθηση τιμών y πολύ έξω από το 0–1 δημιουργεί ισχυρή υπερπήδηση, όπου η κινούμενη τιμή ταλαντεύεται καλά πέρα από τον στόχο της πριν σταθεροποιηθεί. Είναι έγκυρο και συχνά σκόπιμο εφέ, αλλά αν φαίνεται ανεπιθύμητο, επαναφέρετε τα y1 και y2 πιο κοντά στο εύρος 0–1.
Είναι μια προσαρμοσμένη καμπύλη καλύτερη από απλή χρήση των ονομαστικών λέξεων-κλειδιών;
Όχι απαραίτητα — οι πέντε λέξεις-κλειδιά (ease, ease-in, ease-out, ease-in-out, linear) καλύπτουν τις περισσότερες καθημερινές ανάγκες και είναι ευκολότερες στην ανάγνωση στον κώδικα. Φτάστε σε προσαρμοσμένο cubic-bezier() όταν χρειάζεστε ένα συγκεκριμένο αίσθημα που οι λέξεις-κλειδιά δεν παρέχουν, όπως αναπήδηση, πιο απότομη κίνηση, ή ταίριασμα με τη σχεδιαστική προδιαγραφή κίνησης ενός συγκεκριμένου συστήματος σχεδίασης.