CSS animatsiyalari JavaScriptâsiz oddiy animatsiyalar yaratish imkonini beradi.
JavaScript CSS animatsiyalarini boshqarish va ularni ozgina kod bilan yanada yaxshilash uchun ishlatilishi mumkin.
CSS o'tishlar
CSS oâtishlari gâoyasi oddiy. Biz xususiyatni va uning oâzgarishlarini qanday animatsiya qilish kerakligini tavsiflaymiz. Xususiyat oâzgartirilganda, brauzer animatsiyani chizadi.
Yaâni, bizga kerak boâlgan narsa â xususiyatni oâzgartirish, suyuq oâtish esa brauzer tomonidan amalga oshiriladi.
Masalan, quyidagi CSS background-color oâzgarishlarini 3 soniya davomida animatsiya qiladi:
.animated {
transition-property: background-color;
transition-duration: 3s;
}
Endi agar element .animated klassiga ega boâlsa, background-color ning har qanday oâzgarishi 3 soniya davomida animatsiya qilinadi.
Fonga animatsiya berish uchun quyidagi tugmani bosing:
<button id="color">Meni bosing</button>
<style>
#color {
transition-property: background-color;
transition-duration: 3s;
}
</style>
<script>
color.onclick = function() {
this.style.backgroundColor = 'red';
};
</script>
CSS oâtishlarini tavsiflash uchun 4 ta xususiyat mavjud:
transition-propertytransition-durationtransition-timing-functiontransition-delay
Ularni bir zumda koârib chiqamiz, hozircha umumiy transition xususiyati ularni birgalikda property duration timing-function delay tartibida eâlon qilish imkonini beradi va bir vaqtning oâzida bir nechta xususiyatni animatsiya qilish imkonini beradi.
Masalan, bu tugma ham color, ham font-sizeni animatsiya qiladi:
<button id="growing">Meni bosing</button>
<style>
#growing {
transition: font-size 3s, color 2s;
}
</style>
<script>
growing.onclick = function() {
this.style.fontSize = '36px';
this.style.color = 'red';
};
</script>
Endi keling, animatsiya xususiyatlarini birma-bir koârib chiqamiz.
transition-property
transition-propertyda biz animatsiya qilinadigan xususiyatlar roâyxatini yozamiz, masalan: left, margin-left, height, color. Yoki biz all yozishimiz mumkin, bu âbarcha xususiyatlarni animatsiya qilâ degani.
Shuni taâkidlaymizki, animatsiya qilinmaydigan xususiyatlar mavjud. Ammo, koâpgina odatda ishlatiladigan xususiyatlar animatsiya qilish mumkin.
transition-duration
transition-durationda biz animatsiya qancha davom etishini belgilashimiz mumkin. Vaqt CSS vaqt formatida boâlishi kerak: soniyalarda s yoki millisioniyalarda ms.
transition-delay
transition-delayda biz animatsiya oldidan kechikishni belgilashimiz mumkin. Masalan, agar transition-delay 1s va transition-duration 2s boâlsa, animatsiya xususiyat oâzgarishidan 1 soniya keyin boshlanadi va umumiy davomiyligi 2 soniya boâladi.
Manfiy qiymatlar ham mumkin. Keyin animatsiya darhol koârsatiladi, lekin animatsiyaning boshlangâich nuqtasi berilgan qiymatdan (vaqt) keyin boâladi. Masalan, agar transition-delay -1s va transition-duration 2s boâlsa, animatsiya yarim yoâldan boshlanadi va umumiy davomiyligi 1 soniya boâladi.
Bu yerda animatsiya CSS translate xususiyatidan foydalanib raqamlarni 0dan 9gacha siljitadi:
stripe.onclick = function () {
stripe.classList.add("animate");
};#digit {
width: 0.5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block;
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: linear;
}<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
Animatsiya qilish uchun pastga bosing:
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>transform xususiyati quyidagicha animatsiya qilinadi:
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
}
Yuqoridagi misolda JavaScript elementga .animate klassini qoâshadi â va animatsiya boshlanadi:
stripe.classList.add('animate');
Shuningdek, biz uni oâtishning oârtasidan, aniq raqamdan, masalan, joriy soniyaga mos keluvchi, manfiy transition-delay yordamida boshlashimiz mumkin.
Bu yerda raqamni bossangiz â u joriy soniyadan animatsiyani boshlaydi:
stripe.onclick = function () {
let sec = new Date().getSeconds() % 10;
stripe.style.transitionDelay = "-" + sec + "s";
stripe.classList.add("animate");
};#digit {
width: 0.5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block;
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: linear;
}<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
Animatsiya qilish uchun pastga bosing:
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>JavaScript buni qoâshimcha satr bilan qiladi:
stripe.onclick = function() {
let sec = new Date().getSeconds() % 10;
// masalan, bu yerda -3s animatsiyani 3-soniyadan boshlaydi
stripe.style.transitionDelay = '-' + sec + 's';
stripe.classList.add('animate');
};
transition-timing-function
Timing funksiyasi animatsiya jarayoni uning vaqt chizigâi boâyicha qanday taqsimlanishini tavsiflaydi. U sekin boshlanib, keyin tez boradimi yoki aksincha.
Dastlab eng murakkab xususiyat boâlib koârinadi. Lekin agar biz unga ozgina vaqt ajratsak, u juda oddiy boâladi.
Bu xususiyat ikki xil qiymatni qabul qiladi: Bezier egri chizigâi yoki qadamlar. Keling, egri chiziqdan boshlaylik, chunki u tez-tez ishlatiladi.
Bezier egri chizigâi
Timing funksiyasi quyidagi shartlarni qondiradigan 4 ta nazorat nuqtasi bilan Bezier egri chizigâi sifatida oârnatilishi mumkin:
- Birinchi nazorat nuqtasi:
(0,0). - Oxirgi nazorat nuqtasi:
(1,1). - Oraliq nuqtalar uchun
xqiymatlari0..1intervalida boâlishi kerak,yhar qanday boâlishi mumkin.
CSS da Bezier egri chizigâi sintaksisi: cubic-bezier(x2, y2, x3, y3). Bu yerda biz faqat 2-chi va 3-chi nazorat nuqtalarini belgilashimiz kerak, chunki 1-chi (0,0)ga, 4-chisi esa (1,1)ga mahkamlangan.
Timing funksiyasi animatsiya jarayoni qanchalik tez borishini tavsiflaydi.
xoâqi vaqt:0â boshlanish,1âtransition-durationoxiri.yoâqi jarayonning tugallanishini bildiradi:0â xususiyatning boshlangâich qiymati,1â yakuniy qiymat.
Eng oddiy variant animatsiya bir xil chiziqli tezlik bilan bir tekis borishidir. Bu cubic-bezier(0, 0, 1, 1) egri chizigâi bilan belgilanishi mumkin.
Bu egri chiziq quyidagicha koârinadi:
â¦Koârib turganingizdek, bu shunchaki toâgâri chiziq. Vaqt (x) oâtishi bilan animatsiyaning tugallanishi (y) barqaror ravishda 0dan 1gacha boradi.
Quyidagi misoldagi poyezd chapdan oângga doimiy tezlik bilan boradi (uni bosing):
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
}<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<img
class="train"
src="https://js.cx/clipart/train.gif"
onclick="this.style.left='450px'"
/>
</body>
</html>CSS transition shu egri chiziqqa asoslangan:
.train {
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
/* JavaScript left ni 450px ga o'rnatadi */
}
â¦Va poyezdning sekinlashuvini qanday koârsatishimiz mumkin?
Biz boshqa Bezier egri chizigâidan foydalanishimiz mumkin: cubic-bezier(0.0, 0.5, 0.5 ,1.0).
Grafik:
Koârib turganingizdek, jarayon tez boshlanadi: egri chiziq yuqoriga koâtariladi, keyin sekinroq va sekinroq.
Timing funksiyasi amalda (poyezdni bosing):
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0px;
transition: left 5s cubic-bezier(0, 0.5, 0.5, 1);
}<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<img
class="train"
src="https://js.cx/clipart/train.gif"
onclick="this.style.left='450px'"
/>
</body>
</html>CSS:
.train {
left: 0;
transition: left 5s cubic-bezier(0, .5, .5, 1);
/* JavaScript left ni 450px ga o'rnatadi */
}
Bir nechta oârnatilgan egri chiziqlar mavjud: linear, ease, ease-in, ease-out va ease-in-out.
linear â cubic-bezier(0, 0, 1, 1) uchun qisqartma â toâgâri chiziq, yuqorida tasvirlagan.
Boshqa nomlar quyidagi cubic-bezier uchun qisqartmalar:
ease* |
ease-in |
ease-out |
ease-in-out |
|---|---|---|---|
(0.25, 0.1, 0.25, 1.0) |
(0.42, 0, 1.0, 1.0) |
(0, 0, 0.58, 1.0) |
(0.42, 0, 0.58, 1.0) |
* â sukut boâyicha, agar timing funksiyasi boâlmasa, ease ishlatiladi.
Shunday qilib, sekinlashayotgan poyezd uchun ease-out ishlatishimiz mumkin:
.train {
left: 0;
transition: left 5s ease-out;
/* transition: left 5s cubic-bezier(0, .5, .5, 1); */
}
Lekin u biroz boshqacha koârinadi.
Bezier egri chizigâi animatsiyani oâz oraligâidan oshirib yuborishi mumkin.
Egri chiziqdagi nazorat nuqtalari har qanday y koordinatlariga ega boâlishi mumkin: hatto manfiy yoki kattaroq. Keyin Bezier egri chizigâi ham juda past yoki baland choâziladi va animatsiya normal oraligâidan tashqariga chiqadi.
Quyidagi misolda animatsiya kodi:
.train {
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
/* JavaScript left ni 400px ga o'rnatadi */
}
left xususiyati 100pxdan 400pxgacha animatsiya qilinishi kerak.
Lekin poyezdni bossangiz, quyidagini koârasiz:
- Avval poyezd orqaga boradi:
left100pxdan kam boâladi. - Keyin u oldinga,
400pxdan biroz uzoqroq boradi. - Va keyin yana orqaga â
400pxgacha.
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 100px;
transition: left 5s cubic-bezier(0.5, -1, 0.5, 2);
}<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<img
class="train"
src="https://js.cx/clipart/train.gif"
onclick="this.style.left='400px'"
/>
</body>
</html>Nima uchun bu sodir boâlishi berilgan Bezier egri chizigâining grafikiga qarash bilan aniq:
Biz 2-nuqtaning y koordinatasini noldan pastga surdik va 3-nuqta uchun uni 1dan yuqori qildik, shuning uchun egri chiziq âoddiyâ kvadrantdan chiqadi. y âstandartâ 0..1 oraligâidan tashqarida.
Bilganimizdek, y âanimatsiya jarayonining tugallanishiniâ oâlchaydi. y = 0 qiymati boshlangâich xususiyat qiymatiga, y = 1 esa yakuniy qiymatga mos keladi. Shunday qilib, y<0 qiymatlar xususiyatni boshlangâich leftdan tashqariga, y>1 esa yakuniy leftdan tashqariga siljitadi.
Bu, albatta, âyumshoqâ variant. Agar biz -99 va 99 kabi y qiymatlarini qoâysak, poyezd oraliqdan ancha tashqariga chiqib ketardi.
Lekin muayyan vazifa uchun Bezier egri chizigâini qanday yaratamiz? Koâpgina vositalar mavjud. Masalan, buni http://cubic-bezier.com/ saytida qilishimiz mumkin.
Qadamlar
Timing funksiyasi steps(qadamlar soni[, start/end]) animatsiyani qadamlarga boâlish imkonini beradi.
Keling, buni raqamlar misolida koâraylik.
Mana animatsiyasiz raqamlar roâyxati, faqat manba sifatida:
#digit {
border: 1px solid red;
width: 1.2em;
}
#stripe {
display: inline-block;
font: 32px monospace;
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div id="digit"><div id="stripe">0123456789</div></div>
</body>
</html>Biz raqamlarni diskret tarzda paydo qilish uchun qizil "oyna"dan tashqaridagi roâyxat qismini koârinmas qilamiz va har qadamda roâyxatni chapga siljitamiz.
9 qadam boâladi, har bir raqam uchun qadam-harakat:
#stripe.animate {
transform: translate(-90%);
transition: transform 9s steps(9, start);
}
Amalda:
#digit {
width: 0.5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block;
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: steps(9, start);
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
Animatsiya qilish uchun pastga bosing:
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function () {
stripe.classList.add("animate");
};
</script>
</body>
</html>steps(9, start) ning birinchi argumenti qadamlar soni. Transformatsiya 9 qismga boâlinadi (har biri 10%). Vaqt intervali ham avtomatik ravishda 9 qismga boâlinadi, shuning uchun transition: 9s bizga butun animatsiya uchun 9 soniya beradi â har raqam uchun 1 soniya.
Ikkinchi argument ikkita soâzdan biri: start yoki end.
start degani, animatsiya boshida biz birinchi qadamni darhol qilishimiz kerak.
Buni animatsiya davomida kuzatishimiz mumkin: raqamni bossak, u darhol 1ga oâzgaradi (birinchi qadam), keyin keyingi soniya boshida oâzgaradi.
Jarayon quyidagicha boradi:
0sâ-10%(1-soniyaning boshida birinchi oâzgarish, darhol)1sâ-20%- â¦
8sâ-80%- (oxirgi soniya yakuniy qiymatni koârsatadi).
Muqobil qiymat end oâzgarish har soniyaning boshida emas, balki oxirida qoâllanilishi kerakligini bildiradi.
Shunday qilib, jarayon quyidagicha boradi:
0sâ01sâ-10%(1-soniya oxirida birinchi oâzgarish)2sâ-20%- â¦
9sâ-90%
Mana steps(9, end) amalda (birinchi raqam oâzgarishi orasidagi pauzaâga eâtibor bering):
#digit {
width: 0.5em;
overflow: hidden;
font: 32px monospace;
cursor: pointer;
}
#stripe {
display: inline-block;
}
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
transition-timing-function: steps(9, end);
}<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
Animatsiya qilish uchun pastga bosing:
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function () {
stripe.classList.add("animate");
};
</script>
</body>
</html>Qisqartma qiymatlari ham mavjud:
step-startâsteps(1, start)bilan bir xil. Yaâni, animatsiya darhol boshlanadi va 1 qadam oladi. Shunday qilib, u darhol boshlanadi va tugaydi, goâyo animatsiya yoâqdek.step-endâsteps(1, end)bilan bir xil: animatsiyanitransition-durationoxirida bitta qadamda amalga oshiring.
Bu qiymatlar kamdan-kam ishlatiladi, chunki bu haqiqatan ham animatsiya emas, balki bitta qadam oâzgarishi.
transitionend hodisasi
CSS animatsiyasi tugaganda transitionend hodisasi ishga tushadi.
U animatsiya tugagandan keyin harakat qilish uchun keng qoâllaniladi. Shuningdek, biz animatsiyalarni birlashtirishimiz mumkin.
Masalan, quyidagi misoldagi kema bosilganda u yerga va qaytganda suzib boradi, har safar oângga qarab uzoqroq va uzoqroq:
Animatsiya har safar oâtish tugaganda qayta ishlaydigan va yoânalishni oâzgartiradigan go funksiyasi tomonidan boshlanadi:
boat.onclick = function() {
//...
let times = 1;
function go() {
if (times % 2) {
// o'ngga suzish
boat.classList.remove('back');
boat.style.marginLeft = 100 * times + 200 + 'px';
} else {
// chapga suzish
boat.classList.add('back');
boat.style.marginLeft = 100 * times - 200 + 'px';
}
}
go();
boat.addEventListener('transitionend', function() {
times++;
go();
});
};
transitionend uchun hodisa obâekti bir nechta maxsus xususiyatlarga ega:
event.propertyName- Animatsiyasi tugagan xususiyat. Bir vaqtning oâzida bir nechta xususiyatni animatsiya qilsak foydali boâlishi mumkin.
event.elapsedTime- Animatsiya olgan vaqt (soniyalarda),
transition-delaysiz.
Keyframes
Biz @keyframes CSS qoidasidan foydalanib bir nechta oddiy animatsiyalarni birlashtirishimiz mumkin.
U animatsiyaning "nomi"ni va qoidalarni belgilaydi â nimani, qachon va qayerda animatsiya qilishni. Keyin animation xususiyatidan foydalanib, biz animatsiyani elementga biriktirish va uning uchun qoâshimcha parametrlarni belgilashimiz mumkin.
Mana tushuntirishlar bilan misol:
<div class="progress"></div>
<style>
@keyframes go-left-right { /* unga nom bering: "go-left-right" */
from { left: 0px; } /* left: 0px dan animatsiya qiling */
to { left: calc(100% - 50px); } /* left: 100%-50px gacha animatsiya qiling */
}
.progress {
animation: go-left-right 3s infinite alternate;
/* "go-left-right" animatsiyasini elementga qo'llang
davomiyligi 3 soniya
marta soni: cheksiz
har safar yo'nalishni o'zgartiring
*/
position: relative;
border: 2px solid green;
width: 50px;
height: 20px;
background: lime;
}
</style>
@keyframes haqida koâplab maqolalar va batafsil spetsifikatsiya mavjud.
Saytlaringizda hamma narsa doimiy harakatda boâlmasa, ehtimol sizga @keyframes tez-tez kerak boâlmaydi.
Xulosa
CSS animatsiyalari bitta yoki bir nechta CSS xususiyatlarining silliq (yoki yoâq) animatsiya oâzgarishlariga imkon beradi.
Ular koâpchilik animatsiya vazifalari uchun yaxshi. Shuningdek, biz animatsiyalar uchun JavaScriptâdan foydalanishimiz mumkin, keyingi bob bunga bagâishlangan.
JavaScript animatsiyalariga nisbatan CSS animatsiyalarining cheklovlari:
- Oddiy ishlar oddiy amalga oshiriladi.
- CPU uchun tez va yengil.
- JavaScript animatsiyalari moslashuvchan. Ular element âportlashiâ kabi har qanday animatsiya mantiqini amalga oshirishi mumkin.
- Faqat xususiyat oâzgarishlari emas. Biz JavaScriptâda animatsiyaning bir qismi sifatida yangi elementlar yaratishimiz mumkin.
Animatsiyalarning aksariyati ushbu bobda tasvirlanganidek CSS yordamida amalga oshirilishi mumkin. Va transitionend hodisasi animatsiyadan keyin JavaScriptâni ishga tushirish imkonini beradi, shuning uchun u kod bilan yaxshi integratsiya qilinadi.
Lekin keyingi bobda biz murakkabroq holatlarni qamrab olish uchun JavaScript animatsiyalarini qilamiz.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepenâ¦)