Переход и анимация — важные атрибуты для создания анимации DOM-элемента в CSS3, но они могут удовлетворить лишь некоторые общие требования, а переходить атрибуты не-DOM-элементов бессильно, поэтому следующий шаг — просто реализовать его принцип анимации через js. (прямо говоря. То есть косвенно манипулировать значением целевого свойства перехода через JavaScript и обновлять его время от времени), чтобы сделать анимацию более гибкой и управляемой, вместо того, чтобы говорить отвратительному pm, какой смысл в этом эффект и отключать его, естественно, должно быть См. сценарии использования
Сначала дайте демонстрацию: как добиться такого спроса?
На чистом css сделать это явно невозможно (картинка немного искажается,Онлайн-краудфандинг для Mac, смысл на месте~)
Простой обзорНа картинке выше макет реализован с помощью d3.Обычные плагины визуальной графики (такие как ECharts, ichartjs и т. д.) могут быть невозможны из-за простой настройки. Для школьников, знакомых с d3, реализовать не составит большого труда.Основная картина на рисунке, как реализовать смену чисел и эффект цветового градиента дуги, а также общую навеску. Принцип анимации описан ниже с помощью js, что упрощает освоение перехода CSS и анимации анимации.
Есть много статей о введении свойств перехода и анимации.Свойства анимации CSS3
Затем используйте js, чтобы просто реализовать эффект анимации, который изменяет атрибут ширины элемента div с 20 пикселей на 200 пикселей.
HTML-код
<div id="motionPath"></div>
css-код
#motionPath {
width: 20px;
height: 100px;
color:#333;
background-color: red;
}
Прежде чем приступить к реализации, сначала кратко ознакомьтесь с принципом ссылки на кривую Безье.Кривая Безье Грамотность, разобравшись с принципом, порекомендуйте js-библиотеку, реализующую кубические кривые БезьеCubicBezier, которая также является функцией анимации, используемой ниже, эквивалентной функции синхронизации перехода CSS, функции синхронизации анимации
Сначала определите несколько параметров анимации перехода:
- paused: управляет флагом паузы анимации.
- продолжительность: время перехода анимации
- easing: кривая перехода анимации, настройка общей ссылки на кривую перехода анимацииФункция ослабления
- update: функция обратного вызова при обновлении анимации
var BezierEasing = require('bezier-easing')
var tween = {
paused: false,
duration: 6000,
easing: BezierEasing(0, 0, 1, 0.5),
update: function (v) {
// anim 是下文定义的一个描述动画的对象
anim.target.innerHTML = v
}
}
Определить функцию запуска анимации play()
var raf = null
function play() {
raf = requestAnimationFrame(function (t) {
step(t);
})
function step(t) {
if (!tween.paused) {
setInstanceProgress(t);
play();
} else {
raf = cancelAnimationFrame(raf);
}
}
}
step() — вход анимации.Здесь используется функция анимации ключевого кадра requestAnimationFrame.Конечно, setTimeout можно использовать и для симуляции реализации, но более рекомендуется использовать requestAnimationFrame.Рекомендуется прочитатьГлубокое понимание requestAnimationFrame. Функция setInstanceProgress() будет вызываться в каждом цикле ключевого кадра анимации Давайте рассмотрим реализацию функции setInstanceProgress().
function setInstanceProgress(engineTime) {
var insTime = engineTime;
if (insTime > tween.duration) {
tween.paused = true;
}
var currentTime = Math.min(Math.max(insTime, 0), tween.duration);
setAnimationsProgress(currentTime);
}
Функция setInstanceProgress() корректирует время анимации и в то же время определяет, должна ли анимация закончиться, и передает исправленное время функции setAnimationsProgress(). Давайте также посмотрим на реализацию функции setAnimationsProgress(). Мы знаем, что анимация на самом деле является «перемещением». О функции «время»: s=f(t) связывает функцию анимации со временем и вычисляет значение атрибута анимации f(t) в момент времени t.
Далее определите объект, описывающий анимацию.Значение следующих параметров:
- target: целевой объект перехода, в настоящее время элемент div
- type: тип целевого свойства перехода, ширина элемента объединена с css
- свойство: имя свойства целевого перехода, которое является шириной элемента
- fromNumber: начальное значение свойства перехода — 20px.
- toNumber: конечное значение свойства перехода составляет 200 пикселей.
var anim = {
target: document.getElementById('motionPath'),
type: 'css',
property: 'width',
fromNumber: 20,
toNumber: 200
}
Функция setAnimationsProgress()
function setAnimationsProgress(insTime) {
var elapsed = insTime / tween.duration;
var eased = tween.easing(elapsed);
var value = anim.fromNumber + (eased * (anim.toNumber - anim.fromNumber))
setProgressValue[anim.type](anim.target, anim.property, value);
tween.update(value);
}
Функция setAnimationsProgress() также является ядром анимации, которая объединяет функции времени и перехода для вычисленияt
Значение значения, соответствующее времени, а затем установите значение значения для атрибута целевого объекта перехода, а затем реализация setProgressValue для элементов DOM, установка атрибута ширины для установки атрибута, соответствующего стилю
var setProgressValue = {
css: function (t, p, v) {
t.style[p] = v + 'px'
},
plainkey: function (t, p, v) {
t[p] = v
}
}
Наконец, нужно только запустить функцию play(), будет реализована простая анимация, эффект будет следующим:
Если мы хотим изменить значение ключевого атрибута в объекте plain={key: 0} с 0 на 100, можем ли мы просто изменить параметр anim следующим образом:
var plain = {key: 0}
var anim = {
target: plain,
type: 'plainkey',
property: 'key',
fromNumber: 0,
toNumber: 200
}
Я не буду приводить рендеринг изменения значения ключа.Короче говоря, через такую простую конфигурацию решается, что CSS не может достичь подобных требований.Эффект цифрового изменения, упомянутого в начале статьи, прекрасно решен.
Последний вопрос: как должен быть реализован эффект цветового градиента формы веера в начале статьи?На самом деле, это также очень просто, что форма веера формируется путем сращивания нескольких маленьких форм веера, а затем устанавливается соответствующий цвет Цвет для достижения эффекта градиента?
Пример: измените цвет с #e8cf22 на #48b532, примените упомянутый выше принцип анимации перехода, формат rgb, соответствующий #e8cf22, — rgb(232, 207, 34), а формат rgb, соответствующий #48b532, — rgb(72, 181, 50)), затем измените значения R, G и B соответственно в соответствии с соответствующим начальным значением и соответствующим конечным значением (R: от 232 до 72, G: от 207 до 181, B: от 34). до 50), процесс перехода Соответствующее значение rgb в комбинации - это значение цвета, соответствующее его переходу. Это принцип перехода цвета и градиента. Следующее использованиеanimejsЭто библиотека для достижения, принцип тот же
HTML-код
<div id="motionPath"></div>
css-код
#motionPath {
color: blue;
height: 100px;
}
js-код
var oDev = document.getElementById('motionPath')
anime({
targets: '#motionPath',
duration: 6000,
backgroundColor: ['rgb(232, 207, 34)', 'rgb(72, 181, 50)']
easing: 'easeInOutQuad',
update: function (instance) {
oDev.innerHTML = instance.animations[0].currentValue;
}
});
Эффект следующий:
Подводя итог: после понимания того, как js реализует анимацию, давайте посмотрим на пример использования анимации css3, и рендеры не будут торчать. Следующий пример кода:
// div
<div class="animation"></div>
// css
.animation
{
width: 100px;
height: 100px;
background: red;
position: relative;
animation: myfirst 4s;
animation-timing-function: cubic-bezier(0.42,0,0.58,1);
}
@keyframes myfirst
{
0% {background:red; left:0px; top:0px;}
25% {background:yellow; left:200px; top:0px;}
50% {background:blue; left:200px; top:200px;}
75% {background:green; left:0px; top:200px;}
100% {background:red; left:0px; top:0px;}
}
/*
效果表现为:让一个长宽都是100px的div元素,在不同的时间阶段,结合过渡函数cubic-bezier(0.42,0,0.58,1)来进行颜色和位置的过渡变化,
那么我想问0%、25%、50%、75%、100%指什么呢,过渡函数cubic-bezier(0.42,0,0.58,1)是应用到整个4s的过渡周期还是每个阶段应用一次完整的过渡?
答案:n%指的是所占过渡时间duration的百分数,0%~25%也就是从0s到1s阶段,然后结合时间t关于过渡函数cubic-bezier(0.42,0,0.58,1)来计算相应的位置点值和颜色值
*/
наконец
Процесс реализации выше, если вы использовали ридерanimejsЯ также просмотрел исходный код этой библиотеки функций анимации. Вы обнаружите, что я дал только обзор со ссылкой на ее реализацию. Студенты, которые заинтересованы в ряде отличных функций в библиотеке функций, могут обратиться и изучить. очень рекомендуется. В настоящее время это звезда на GitHub. Достигнуто 30 000+
В ответ на некоторые требования, выдвинутые pm, до тех пор, пока вы четко знаете, к какому конкретному атрибуту перейти, вам нужно перейти из определенного начального состояния в заданное состояние, а затем каким образом (функция перехода) сделать переход, а затем объединить время переходаduration
, я считаю, что с такой идеей спрос будет решен легко
насчет нас
Передовая команда Kuaigou Taxi занимается обменом передовыми технологиями и регулярно публикует высококачественные статьи. Добро пожаловать, обратите внимание и лайкните.