CSS позволÑÐµÑ ÑоздаваÑÑ Ð¿ÑоÑÑÑе анимаÑии без иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ JavaScript.
JavaScript Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñакими CSS-анимаÑиÑми. ÐÑо позволÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑе анимаÑии, иÑполÑзÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑие кÑÑоÑки кода.
CSS-пеÑÐµÑ Ð¾Ð´Ñ
ÐÐ´ÐµÑ CSS-пеÑÐµÑ Ð¾Ð´Ð¾Ð² пÑоÑÑа: Ð¼Ñ ÑказÑваем, ÑÑо некоÑоÑое ÑвойÑÑво должно бÑÑÑ Ð°Ð½Ð¸Ð¼Ð¸Ñовано, и как оно должно бÑÑÑ Ð°Ð½Ð¸Ð¼Ð¸Ñовано. Ркогда ÑвойÑÑво менÑеÑÑÑ, бÑаÑÐ·ÐµÑ Ñам обÑабоÑÐ°ÐµÑ ÑÑо изменение и оÑÑиÑÑÐµÑ Ð°Ð½Ð¸Ð¼Ð°ÑиÑ.
ÐÑÑ ÑÑо нам нÑжно, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ â ÑÑо измениÑÑ ÑвойÑÑво, а далÑÑе бÑаÑÐ·ÐµÑ ÑÐ´ÐµÐ»Ð°ÐµÑ Ð¿Ð»Ð°Ð²Ð½Ñй пеÑÐµÑ Ð¾Ð´ Ñам.
ÐапÑимеÑ, CSS-код ниже анимиÑÑÐµÑ ÑÑÑÑ
-ÑекÑндное изменениеbackground-color:
.animated {
transition-property: background-color;
transition-duration: 3s;
}
ТепеÑÑ, еÑли ÑлеменÑÑ Ð¿ÑиÑвоен клаÑÑ .animated, лÑбое изменение ÑвойÑÑва background-color бÑÐ´ÐµÑ Ð°Ð½Ð¸Ð¼Ð¸ÑоваÑÑÑÑ Ð² ÑеÑение ÑÑÑÑ
ÑекÑнд.
ÐажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ Ð½Ð¸Ð¶Ðµ, ÑÑÐ¾Ð±Ñ Ð°Ð½Ð¸Ð¼Ð¸ÑоваÑÑ Ñон:
<button id="color">Ðажми менÑ</button>
<style>
#color {
transition-property: background-color;
transition-duration: 3s;
}
</style>
<script>
color.onclick = function() {
this.style.backgroundColor = 'red';
};
</script>
СÑÑеÑÑвÑÐµÑ 4 ÑвойÑÑва Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ CSS-пеÑÐµÑ Ð¾Ð´Ð¾Ð²:
transition-propertyâ ÑвойÑÑво пеÑÐµÑ Ð¾Ð´Ð°transition-durationâ пÑодолжиÑелÑноÑÑÑ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð°transition-timing-functionâ вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð°transition-delayâ задеÑжка наÑала пеÑÐµÑ Ð¾Ð´Ð°
Ðалее Ð¼Ñ ÑаÑÑмоÑÑим иÑ
вÑе, а ÑейÑÐ°Ñ ÐµÑÑ Ð·Ð°Ð¼ÐµÑим, ÑÑо еÑÑÑ Ñакже обÑее ÑвойÑÑво transition, коÑоÑое позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð¸Ñ
одновÑеменно в поÑледоваÑелÑноÑÑи: property duration timing-function delay, а Ñакже анимиÑоваÑÑ Ð½ÐµÑколÑко ÑвойÑÑв одновÑеменно.
ÐапÑимеÑ, Ñ ÑÑой кнопки анимиÑÑÑÑÑÑ Ð´Ð²Ð° ÑвойÑÑва color и font-size одновÑеменно:
<button id="growing">Ðажми менÑ</button>
<style>
#growing {
transition: font-size 3s, color 2s;
}
</style>
<script>
growing.onclick = function() {
this.style.fontSize = '36px';
this.style.color = 'red';
};
</script>
ТепеÑÑ ÑаÑÑмоÑÑим каждое ÑвойÑÑво анимаÑии по оÑделÑноÑÑи.
transition-property
Ð transition-property запиÑÑваеÑÑÑ ÑпиÑок ÑвойÑÑв, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ¾ÑоÑÑÑ
необÑ
одимо анимиÑоваÑÑ, напÑимеÑ: left, margin-left, height, color.
ÐнимиÑоваÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ не вÑе ÑвойÑÑва, но многие из ниÑ
. ÐнаÑение ÑвойÑÑва all ознаÑÐ°ÐµÑ Â«Ð°Ð½Ð¸Ð¼Ð¸ÑÑй вÑе ÑвойÑÑва».
transition-duration
Ð transition-duration можно опÑеделиÑÑ, ÑколÑко вÑемени займÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑиÑ. ÐÑÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¾ в ÑоÑмаÑе вÑемени CSS: в ÑекÑндаÑ
s или миллиÑекÑндаÑ
ms.
transition-delay
Ð transition-delay можно опÑеделиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¿ÐµÑед наÑалом анимаÑии. ÐапÑимеÑ, еÑли transition-delay: 1s, Ñогда анимаÑÐ¸Ñ Ð½Ð°ÑнÑÑÑÑ ÑеÑез 1 ÑекÑÐ½Ð´Ñ Ð¿Ð¾Ñле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвойÑÑва.
ÐÑÑиÑаÑелÑнÑе знаÑÐµÐ½Ð¸Ñ Ñакже допÑÑÑимÑ. Ð Ñаком ÑлÑÑае анимаÑÐ¸Ñ Ð½Ð°ÑнÑÑÑÑ Ñ ÑеÑединÑ. ÐапÑимеÑ, еÑли transition-duration Ñавно 2s, а transition-delay â -1s, Ñогда анимаÑÐ¸Ñ Ð·Ð°Ð¹Ð¼ÑÑ Ð¾Ð´Ð½Ñ ÑекÑÐ½Ð´Ñ Ð¸ наÑнÑÑÑÑ Ñ ÑеÑединÑ.
ÐдеÑÑ Ð¿ÑиведÑн пÑÐ¸Ð¼ÐµÑ Ð°Ð½Ð¸Ð¼Ð°Ñии, ÑдвигаÑÑей ÑиÑÑÑ Ð¾Ñ 0 до 9 Ñ Ð¸ÑполÑзованием CSS-ÑвойÑÑва transform Ñо знаÑением translate:
stripe.onclick = function() {
stripe.classList.add('animate');
};#digit {
width: .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>
ÐликниÑе на ÑиÑÑÑ Ð´Ð»Ñ Ð½Ð°Ñала анимаÑии:
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>СвойÑÑво transform анимиÑÑеÑÑÑ ÑледÑÑÑим обÑазом:
#stripe.animate {
transform: translate(-90%);
transition-property: transform;
transition-duration: 9s;
}
РпÑимеÑе вÑÑе JavaScript-код добавлÑÐµÑ ÐºÐ»Ð°ÑÑ .animate к ÑлеменÑÑ, поÑле Ñего наÑинаеÑÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑиÑ:
stripe.classList.add('animate');
Ðожно наÑаÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Â«Ñ ÑеÑединÑ», Ñ Ð¾Ð¿ÑеделÑнного ÑиÑла, напÑимеÑ, иÑполÑзÑÑ Ð¾ÑÑиÑаÑелÑное знаÑение transition-delay, ÑооÑвеÑÑÑвÑÑÑие необÑ
Ð¾Ð´Ð¸Ð¼Ð¾Ð¼Ñ ÑиÑлÑ.
ÐÑли Ð²Ñ Ð½Ð°Ð¶Ð¼ÑÑе на ÑиÑÑÑ Ð½Ð¸Ð¶Ðµ, Ñо анимаÑÐ¸Ñ Ð½Ð°ÑнÑÑÑÑ Ñ Ð¿Ð¾Ñледней ÑекÑндÑ:
stripe.onclick = function() {
let sec = new Date().getSeconds() % 10;
stripe.style.transitionDelay = '-' + sec + 's';
stripe.classList.add('animate');
};#digit {
width: .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>
Click below to animate:
<div id="digit"><div id="stripe">0123456789</div></div>
<script src="script.js"></script>
</body>
</html>JavaScript Ð´ÐµÐ»Ð°ÐµÑ ÑÑо Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода:
stripe.onclick = function() {
let sec = new Date().getSeconds() % 10;
// напÑимеÑ, знаÑение -3s здеÑÑ Ð½Ð°ÑнÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Ñ ÑÑеÑÑей ÑекÑндÑ
stripe.style.transitionDelay = '-' + sec + 's';
stripe.classList.add('animate');
};
transition-timing-function
ÐÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¾Ð¿Ð¸ÑÑваеÑ, как пÑоÑеÑÑ Ð°Ð½Ð¸Ð¼Ð°Ñии бÑÐ´ÐµÑ ÑаÑпÑеделÑн во вÑемени. ÐÑÐ´ÐµÑ Ð»Ð¸ она наÑаÑа медленно и заÑем ÑÑкоÑиÑÑÑ Ð¸Ð»Ð¸ наобоÑоÑ.
Ðа пеÑвÑй взглÑд ÑÑо оÑÐµÐ½Ñ Ñложное ÑвойÑÑво, но оно ÑÑановиÑÑÑ Ð¿Ð¾Ð½ÑÑнÑм, еÑли ÑделиÑÑ ÐµÐ¼Ñ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ вÑемени.
ÐÑо ÑвойÑÑво Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð´Ð²Ð° вида знаÑений: кÑивÑÑ ÐезÑе или колиÑеÑÑво Ñагов. ÐавайÑе наÑнÑм Ñ ÐºÑивой ÐезÑе, как Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ ÑаÑÑо иÑполÑзÑемой.
ÐÑÐ¸Ð²Ð°Ñ ÐезÑе
ÐÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð°, как кÑÐ¸Ð²Ð°Ñ ÐезÑе Ñ 4 конÑÑолÑнÑми ÑоÑками, ÑдовлеÑвоÑÑÑÑими ÑÑловиÑм:
- ÐеÑÐ²Ð°Ñ ÐºÐ¾Ð½ÑÑолÑÐ½Ð°Ñ ÑоÑка:
(0,0). - ÐоÑледнÑÑ ÐºÐ¾Ð½ÑÑолÑÐ½Ð°Ñ ÑоÑка:
(1,1). - ÐÐ»Ñ Ð¿ÑомежÑÑоÑнÑÑ
ÑоÑек знаÑение
xдолжно бÑÑÑ0..1, знаÑениеyÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð»Ñбое знаÑение.
СинÑакÑÐ¸Ñ Ð´Ð»Ñ ÐºÑивÑÑ
ÐезÑе в CSS: cubic-bezier(x2, y2, x3, y3). Ðам необÑ
одимо задаÑÑ ÑолÑко вÑоÑÑÑ Ð¸ ÑÑеÑÑÑ ÐºÐ¾Ð½ÑÑолÑнÑе ÑоÑки, поÑÐ¾Ð¼Ñ ÑÑо пеÑÐ²Ð°Ñ Ð·Ð°ÑикÑиÑована Ñо знаÑением (0,0) и ÑеÑвÑÑÑÐ°Ñ â (1,1).
ÐÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¾Ð¿Ð¸ÑÑÐ²Ð°ÐµÑ Ñо, наÑколÑко бÑÑÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñии во вÑемени.
- ÐÑÑ
xâ ÑÑо вÑемÑ:0â наÑалÑнÑй моменÑ,1â поÑледний моменÑtransition-duration. - ÐÑÑ
yÑказÑÐ²Ð°ÐµÑ Ð½Ð° завеÑÑение пÑоÑеÑÑа:0â наÑалÑное знаÑение ÑвойÑÑва,1â конеÑное знаÑение.
СамÑм пÑоÑÑÑм пÑимеÑом анимаÑии ÑвлÑеÑÑÑ ÑавномеÑÐ½Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Ñ Ð»Ð¸Ð½ÐµÐ¹Ð½Ð¾Ð¹ ÑкоÑоÑÑÑÑ. Ðна Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð° Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÑивой cubic-bezier(0, 0, 1, 1).
ÐÐ¾Ñ ÐºÐ°Ðº вÑглÑÐ´Ð¸Ñ ÑÑа «кÑиваÑ»:
â¦Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо пÑÑÐ¼Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ. ÐнаÑÐµÐ½Ð¸Ñ Ð²Ñемени (x) ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð½Ð°Ñение завеÑÑÑнноÑÑи анимаÑии (y), коÑоÑое ÑавномеÑно изменÑеÑÑÑ Ð¾Ñ 0 к 1.
РпÑимеÑе ниже поезд «едеÑ» Ñлева напÑаво Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ð¹ ÑкоÑоÑÑÑÑ (нажмиÑе на поезд):
.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>Ð ÑвойÑÑве transition Ñказана ÑледÑÑÑÐ°Ñ ÐºÑÐ¸Ð²Ð°Ñ ÐезÑе:
.train {
left: 0;
transition: left 5s cubic-bezier(0, 0, 1, 1);
/* JavaScript ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑвойÑÑво left ÑавнÑм 450px */
}
â¦Ð как показаÑÑ Ð·Ð°Ð¼ÐµÐ´Ð»ÑÑÑийÑÑ Ð¿Ð¾ÐµÐ·Ð´?
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð´ÑÑгÑÑ ÐºÑивÑÑ ÐезÑе: cubic-bezier(0.0, 0.5, 0.5 ,1.0).
ÐÑ Ð³ÑаÑик:
Ðак видим, анимаÑÐ¸Ñ Ð½Ð°ÑинаеÑÑÑ Ð±ÑÑÑÑо: кÑÐ¸Ð²Ð°Ñ Ð±ÑÑÑÑо поднимаеÑÑÑ Ð²Ð²ÐµÑÑ , и заÑем вÑе медленнее и медленнее.
Ðиже вÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð² дейÑÑвии (нажмиÑе на поезд):
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 0px;
transition: left 5s cubic-bezier(0.0, 0.5, 0.5, 1.0);
}<!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 ÑавнÑм 450px */
}
ÐÑÑÑ Ð½ÐµÑколÑко вÑÑÑоеннÑÑ
обознаÑений кÑивÑÑ
ÐезÑе: linear, ease, ease-in, ease-out и ease-in-out.
linear ÑÑо коÑоÑÐºÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð»Ñ cubic-bezier(0, 0, 1, 1) â пÑÑмой линии, коÑоÑÑÑ Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ ÑанÑÑе.
ÐÑÑгие Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ â ÑÑо Ñакже ÑокÑаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´ÑÑгиÑ
cubic-bezier:
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) |
* â иÑполÑзÑеÑÑÑ Ð¿Ð¾ ÑмолÑаниÑ, еÑли не задана дÑÑÐ³Ð°Ñ Ð²ÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑиÑ.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¼ÐµÐ´Ð»Ð¸ÑÑ Ð¿Ð¾ÐµÐ·Ð´, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ease-out:
.train {
left: 0;
transition: left 5s ease-out;
/* transition: left 5s cubic-bezier(0, .5, .5, 1); */
}
Ðо полÑÑивÑийÑÑ ÑезÑлÑÑÐ°Ñ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ оÑлиÑаеÑÑÑ.
ÐÑÐ¸Ð²Ð°Ñ ÐезÑе Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÑÑавиÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Â«Ð²ÑпÑÑгиваÑÑ» за пÑÐµÐ´ÐµÐ»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°.
ÐонÑÑолÑнÑе ÑоÑки могÑÑ Ð¸Ð¼ÐµÑÑ Ð»ÑбÑе знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ оÑи y: оÑÑиÑаÑелÑнÑе или ÑÐºÐ¾Ð»Ñ Ñгодно болÑÑие. Ð Ñаком ÑлÑÑае кÑÐ¸Ð²Ð°Ñ ÐезÑе бÑÐ´ÐµÑ ÑкакаÑÑ Ð¾ÑÐµÐ½Ñ Ð²ÑÑоко или оÑÐµÐ½Ñ Ð½Ð¸Ð·ÐºÐ¾, заÑÑавлÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Ð²ÑÑ
одиÑÑ Ð·Ð° ÐµÑ Ð½Ð¾ÑмалÑнÑе пÑеделÑ.
РпÑиведÑнном ниже пÑимеÑе код анимаÑии:
.train {
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .5, 2);
/* JavaScript sets left to 400px */
}
СвойÑÑво left бÑÐ´ÐµÑ Ð°Ð½Ð¸Ð¼Ð¸ÑоваÑÑÑÑ Ð¾Ñ 100px до 400px.
Ðо когда Ð²Ñ Ð½Ð°Ð¶Ð¼ÑÑе на поезд, Ð²Ñ ÑвидиÑе ÑледÑÑÑее:
- СнаÑала, поезд Ð¿Ð¾ÐµÐ´ÐµÑ Ð½Ð°Ð·Ð°Ð´:
leftÑÑÐ°Ð½ÐµÑ Ð¼ÐµÐ½ÑÑе, Ñем100px. - ÐаÑем он Ð¿Ð¾ÐµÐ´ÐµÑ Ð²Ð¿ÐµÑÑд, немного далÑÑе, Ñем
400px. - РзаÑем веÑнÑÑÑÑ Ð½Ð°Ð·Ð°Ð´ в знаÑение
400px.
.train {
position: relative;
cursor: pointer;
width: 177px;
height: 160px;
left: 100px;
transition: left 5s cubic-bezier(.5, -1, .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>ÐÑли Ð¼Ñ Ð²Ð·Ð³Ð»Ñнем на кÑивÑÑ ÐезÑе из пÑимеÑа, ÑÑановиÑÑÑ Ð¿Ð¾Ð½ÑÑно поведение поезда.
ÐÑ Ð²ÑнеÑли кооÑдинаÑÑ y Ð´Ð»Ñ Ð¿ÐµÑвой опоÑной ÑоÑки ниже нÑÐ»Ñ Ð¸ вÑÑе единиÑÑ Ð´Ð»Ñ ÑÑеÑÑей опоÑной ÑоÑки, поÑÑÐ¾Ð¼Ñ ÐºÑÐ¸Ð²Ð°Ñ Ð²ÑÑла за пÑÐµÐ´ÐµÐ»Ñ Â«Ð¾Ð±ÑÑного» квадÑаÑа. ÐнаÑÐµÐ½Ð¸Ñ y вÑÑли из «ÑÑандаÑÑного» диапазона 0..1.
Ðак Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼, оÑÑ y измеÑÑÐµÑ Â«Ð·Ð°Ð²ÐµÑÑÑнноÑÑÑ Ð¿ÑоÑеÑÑа анимаÑии». ÐнаÑение y = 0 ÑооÑвеÑÑÑвÑÐµÑ Ð½Ð°ÑалÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð¸ÑÑемого ÑвойÑÑва и y = 1 â конеÑÐ½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑ. Таким обÑазом, y<0 Ð´ÐµÐ»Ð°ÐµÑ Ð·Ð½Ð°Ñение ÑвойÑÑва left менÑÑе наÑалÑного знаÑÐµÐ½Ð¸Ñ Ð¸ y>1 â болÑÑе конеÑного.
ÐÑо, конеÑно, «мÑгкий» ваÑианÑ. ÐÑли знаÑение y бÑдÑÑ -99 и 99, Ñо поезд бÑÐ´ÐµÑ Ð³Ð¾Ñаздо ÑилÑнее «вÑпÑÑгиваÑÑ» за пÑеделÑ.
Ðак ÑделаÑÑ ÐºÑивÑÑ ÐезÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑной задаÑи? СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво инÑÑÑÑменÑов.
- РпÑимеÑÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑделаÑÑ ÑÑо на ÑайÑе https://cubic-bezier.com.
- ÐÑаÑзеÑннÑе инÑÑÑÑменÑÑ ÑазÑабоÑÑика Ñакже имеÑÑ ÑпеÑиалÑнÑÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶ÐºÑ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÑивÑÑ
ÐезÑе в CSS:
- ÐÑкÑойÑе инÑÑÑÑменÑÑ ÑазÑабоÑÑика пÑи помоÑи F12 (Mac: Cmd+Opt+I).
- ÐÑбеÑеÑе вкладкÑ
Elements, заÑем обÑаÑиÑе внимание на под-панелÑStylesв пÑавой ÑÑоÑоне. - СвойÑÑва CSS Ñо Ñловом
cubic-bezierбÑдÑÑ Ð¸Ð¼ÐµÑÑ Ð¸ÐºÐ¾Ð½ÐºÑ Ð¿ÐµÑед ÑÑим Ñловом. - ÐликниÑе по иконке, ÑÑÐ¾Ð±Ñ Ð¾ÑÑедакÑиÑоваÑÑ ÐºÑивÑÑ.
Шаги
ÐÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ steps(колиÑеÑÑво Ñагов[, start/end]) позволÑÐµÑ ÑазделиÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Ð½Ð° Ñаги.
ÐавайÑе ÑаÑÑмоÑÑим ÑÑо на Ñже знакомом нам пÑимеÑе Ñ ÑиÑÑами.
Ðиже пÑедÑÑавлен ÑпиÑок ÑиÑÑ, без какой-либо анимаÑии, коÑоÑÑй Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð² каÑеÑÑве оÑновÑ:
#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>Ð HTML, веÑениÑа ÑиÑÑ Ð·Ð°ÐºÐ»ÑÑена в <div id="digits"> ÑикÑиÑованной длинÑ:
<div id="digit">
<div id="stripe">0123456789</div>
</div>
Div-ÑÐ»ÐµÐ¼ÐµÐ½Ñ #digit Ð¸Ð¼ÐµÐµÑ ÑикÑиÑованнÑÑ ÑиÑÐ¸Ð½Ñ Ð¸ гÑаниÑÑ, поÑÑÐ¾Ð¼Ñ Ð¾Ð½ вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº кÑаÑное окно.
ÐÑ Ñделаем ÑаймеÑ: ÑиÑÑÑ Ð±ÑдÑÑ Ð¿Ð¾ÑвлÑÑÑÑÑ Ð¾Ð´Ð½Ð° за дÑÑгой, диÑкÑеÑно.
ЧÑÐ¾Ð±Ñ Ð´Ð¾Ð±Ð¸ÑÑÑÑ ÑÑого, Ð¼Ñ ÑкÑоем #stripe за пÑеделами #digit, иÑполÑзÑÑ overflow: hidden, а заÑем, Ñаг за Ñагом бÑдем ÑдвигаÑÑ #stripe влево.
ÐÑего бÑÐ´ÐµÑ 9 Ñагов, один Ñаг Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑиÑÑÑ:
#stripe.animate {
transform: translate(-90%);
transition: transform 9s steps(9, start);
}
ÐеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ Ð²Ñеменной ÑÑнкÑии steps(9, start) â колиÑеÑÑво Ñагов. ТÑанÑÑоÑмаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ñазделена на 9 ÑаÑÑей (10% каждаÑ). ÐÑеменной инÑеÑвал Ñакже бÑÐ´ÐµÑ ÑазделÑн на 9 ÑаÑÑей, Ñаким обÑазом ÑвойÑÑво transition: 9s обеÑпеÑÐ¸Ð²Ð°ÐµÑ Ð½Ð°Ð¼ 9 ÑекÑнд анимаÑии, ÑÑо даÑÑ Ð¿Ð¾ одной ÑекÑнде на ÑиÑÑÑ.
ÐÑоÑÑм аÑгÑменÑом ÑвлÑеÑÑÑ Ð¾Ð´Ð½Ð¾ из клÑÑевÑÑ
Ñлов: start или end.
start â ознаÑаеÑ, ÑÑо в наÑале анимаÑии нам необÑ
одимо пеÑейÑи на пеÑвÑй Ñаг немедленно.
РдейÑÑвии:
#digit {
width: .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>
ÐликниÑе на ÑиÑÑÑ Ð´Ð»Ñ Ð½Ð°Ñала анимаÑии:
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function() {
stripe.classList.add('animate');
}
</script>
</body>
</html>ЩелÑок по ÑиÑÑе немедленно изменÑÐµÑ ÐµÑ Ð½Ð° 1 (пеÑвÑй Ñаг), а заÑем изменÑеÑÑÑ Ð² наÑале ÑледÑÑÑей ÑекÑндÑ.
ÐнимаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ñак:
0sâ-10%(пеÑвое изменение в наÑале пеÑвой ÑекÑндÑ, ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле нажаÑиÑ)1sâ-20%- â¦
8sâ-90%- (на пÑоÑÑжении поÑледней ÑекÑÐ½Ð´Ñ Ð¾ÑобÑажаеÑÑÑ Ð¿Ð¾Ñледнее знаÑение).
ÐдеÑÑ Ð¿ÐµÑвое изменение бÑло немедленнÑм из-за start в steps.
ÐлÑÑеÑнаÑивное знаÑение end ознаÑало бÑ, ÑÑо Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ñжно пÑименÑÑÑ Ð½Ðµ в наÑале, а в конÑе каждой ÑекÑндÑ.
ÐнимаÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ñак:
0sâ01sâ-10%(пеÑвое изменение пÑоизойдÑÑ Ð² конÑе пеÑвой ÑекÑндÑ)2sâ-20%- â¦
9sâ-90%
ÐÑÐ¸Ð¼ÐµÑ step(9, end) в дейÑÑвии (обÑаÑиÑе внимание на паÑÐ·Ñ Ð¿ÐµÑед пеÑвÑм изменением ÑиÑÑÑ):
#digit {
width: .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>
ÐликниÑе на ÑиÑÑÑ Ð´Ð»Ñ Ð½Ð°Ñала анимаÑии:
<div id="digit"><div id="stripe">0123456789</div></div>
<script>
digit.onclick = function() {
stripe.classList.add('animate');
}
</script>
</body>
</html>СÑÑеÑÑвÑÑÑ Ñакже некоÑоÑÑе заÑанее опÑеделÑннÑе ÑокÑаÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ steps(...):
step-startâ Ñо же Ñамое, ÑÑоsteps(1, start). Ðно ознаÑаеÑ, ÑÑо анимаÑÐ¸Ñ Ð½Ð°ÑнÑÑÑÑ ÑÑÐ°Ð·Ñ Ð¸ пÑоизойдÑÑ Ð² один Ñаг. Таким обÑазом она наÑнÑÑÑÑ Ð¸ завеÑÑиÑÑÑ ÑÑазÑ, как бÑдÑо и Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ анимаÑии.step-endâ Ñо же Ñамое, ÑÑоsteps(1, end): вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Ð·Ð° один Ñаг в конÑеtransition-duration.
Такие знаÑÐµÐ½Ð¸Ñ Ð¸ÑполÑзÑÑÑÑÑ Ñедко, поÑÐ¾Ð¼Ñ ÑÑо ÑÑо не ÑовÑем анимаÑиÑ, а ÑоÑнее бÑÐ´ÐµÑ ÑказаÑÑ Ð¾Ð´Ð½Ð¾ÑаговÑе изменениÑ. ÐÑ Ñпоминаем Ð¸Ñ Ð·Ð´ÐµÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ ÐºÐ°ÑÑинÑ.
СобÑÑие: «transitionend»
Ðогда завеÑÑаеÑÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑиÑ, ÑÑабаÑÑÐ²Ð°ÐµÑ ÑобÑÑие transitionend.
Ðно ÑиÑоко иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑÑвий поÑле завеÑÑÐµÐ½Ð¸Ñ Ð°Ð½Ð¸Ð¼Ð°Ñии, а Ñакже Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑледоваÑелÑноÑÑи анимаÑий.
ÐапÑимеÑ, коÑÐ°Ð±Ð»Ñ Ð² пÑиведÑнном ниже пÑимеÑе наÑÐ¸Ð½Ð°ÐµÑ Ð¿Ð»Ð°Ð²Ð°ÑÑ ÑÑда и обÑаÑно по кликÑ, каждÑй Ñаз вÑе далÑÑе и далÑÑе впÑаво:
ÐнимаÑÐ¸Ñ Ð½Ð°ÑинаеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии go, коÑоÑÐ°Ñ Ð²ÑзÑваеÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз Ñнова, когда пеÑеÑ
од заканÑиваеÑÑÑ Ð¸ менÑеÑÑÑ Ð½Ð°Ð¿Ñавление:
boat.onclick = function() {
//...
let times = 1;
function go() {
if (times % 2) {
// плÑÑÑ Ð²Ð¿Ñаво
boat.classList.remove('back');
boat.style.marginLeft = 100 * times + 200 + 'px';
} else {
// плÑÑÑ Ð²Ð»ÐµÐ²Ð¾
boat.classList.add('back');
boat.style.marginLeft = 100 * times - 200 + 'px';
}
}
go();
boat.addEventListener('transitionend', function() {
times++;
go();
});
};
ÐбÑÐµÐºÑ ÑобÑÑÐ¸Ñ transitionend ÑодеÑÐ¶Ð¸Ñ ÑÑд полезнÑÑ
ÑвойÑÑв:
event.propertyName- ÐÐ¼Ñ ÑвойÑÑва, анимаÑÐ¸Ñ ÐºÐ¾ÑоÑого завеÑÑилаÑÑ. ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñм, еÑли Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð¸ÑÑем неÑколÑко ÑвойÑÑв.
event.elapsedTime- ÐÑÐµÐ¼Ñ (в ÑекÑндаÑ
), коÑоÑое занÑла анимаÑиÑ, без ÑÑÑÑа
transition-delay.
ÐлÑÑевÑе кадÑÑ
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ обÑединиÑÑ Ð½ÐµÑколÑко пÑоÑÑÑÑ
анимаÑий вмеÑÑе, иÑполÑзÑÑ CSS-пÑавило @keyframes.
Ðно опÑеделÑÐµÑ Â«Ð¸Ð¼Ñ» анимаÑии и пÑавила: ÑÑо, когда и где анимиÑоваÑÑ. ÐоÑле ÑÑого можно иÑполÑзоваÑÑ ÑвойÑÑво animation, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð·Ð½Ð°ÑиÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ Ð½Ð° ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ опÑеделиÑÑ ÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе паÑамеÑÑÑ.
Ðиже пÑиведÑн пÑÐ¸Ð¼ÐµÑ Ñ Ð¿Ð¾ÑÑнениÑми:
<div class="progress"></div>
<style>
@keyframes go-left-right { /* обÑÑвлÑем Ð¸Ð¼Ñ Ð°Ð½Ð¸Ð¼Ð°Ñии: "go-left-right" */
from { left: 0px; } /* оÑ: left: 0px */
to { left: calc(100% - 50px); } /* до: left: 100%-50px */
}
.progress {
animation: go-left-right 3s infinite alternate;
/* пÑимениÑÑ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ñ "go-left-right" на ÑлеменÑе
пÑодолжиÑелÑноÑÑÑÑ 3 ÑекÑндÑ
колиÑеÑÑво Ñаз: беÑконеÑно (infinite)
менÑÑÑ Ð½Ð°Ð¿Ñавление анимаÑии каждÑй Ñаз (alternate)
*/
position: relative;
border: 2px solid green;
width: 50px;
height: 20px;
background: lime;
}
</style>
СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑÑаÑей пÑо @keyframes, а Ñакже деÑалÑÐ½Ð°Ñ ÑпеÑиÑикаÑиÑ.
СкоÑее вÑего, вам неÑаÑÑо понадобиÑÑÑ @keyframes, Ñазве ÑÑо на ваÑем ÑайÑе вÑе поÑÑоÑнно в движении.
ÐÑого
CSS-анимаÑии позволÑÑÑ Ð¿Ð»Ð°Ð²Ð½Ð¾, или не оÑенÑ, менÑÑÑ Ð¾Ð´Ð½Ð¾ или неÑколÑко ÑвойÑÑв.
Ðни Ñ Ð¾ÑоÑо ÑеÑаÑÑ Ð±Ð¾Ð»ÑÑинÑÑво Ð·Ð°Ð´Ð°Ñ Ð¿Ð¾ анимаÑии. Также Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑеализоваÑÑ Ð°Ð½Ð¸Ð¼Ð°Ñии ÑеÑез JavaScript, более подÑобно об ÑÑом â в ÑледÑÑÑей главе.
ÐгÑаниÑÐµÐ½Ð¸Ñ CSS-анимаÑий в ÑÑавнении Ñ JavaScript-анимаÑиÑми:
- ÐÑоÑÑÑе анимаÑии делаÑÑÑÑ Ð¿ÑоÑÑо.
- ÐÑÑÑÑÑе и не ÑоздаÑÑ Ð½Ð°Ð³ÑÑÐ·ÐºÑ Ð½Ð° CPU.
- JavaScript-анимаÑии более гибкие. Ð Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑиÑÑÑÑÑвоваÑÑ Ð»ÑÐ±Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°ÑÐ¸Ð¾Ð½Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°, как напÑÐ¸Ð¼ÐµÑ Â«Ð²Ð·Ð¾ÑваÑÑ» ÑлеменÑ.
- Ðожно изменÑÑÑ Ð½Ðµ ÑолÑко ÑвойÑÑва. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаваÑÑ Ð½Ð¾Ð²Ñе ÑлеменÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ JavaScript Ð´Ð»Ñ Ð°Ð½Ð¸Ð¼Ð°Ñии.
ÐолÑÑинÑÑво анимаÑий Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñеализовано Ñ Ð¸ÑполÑзованием CSS, как опиÑано в ÑÑой главе. Ð ÑобÑÑие transitionend позволÑÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑ JavaScript поÑле анимаÑии, поÑÑÐ¾Ð¼Ñ CSS-анимаÑии пÑекÑаÑно инÑегÑиÑÑÑÑÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼.
Ðо в ÑледÑÑÑей главе Ð¼Ñ ÑаÑÑмоÑÑим некоÑоÑÑе JavaScript-анимаÑии, коÑоÑÑе позволÑÑÑ ÑеÑаÑÑ Ð±Ð¾Ð»ÐµÐµ ÑложнÑе задаÑи.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)