Я написал эффект CSS-анимации/параллакса, который работает с animation-timeline
, и мне нравится результат.
Это код
[data-section-id = "66d153c7fa59f85ae17bdd36"] video {
position : absolute;
top : 0;
height: 66vh!important;
translate: 0 0vh;
animation: parallax 1s linear both;
animation-timeline: scroll(root);
animation-range: cover 30% cover 66%;
}
@keyframes parallax {
from {
translate : 0 0vh;
}
to {
translate: 0 -33vh;
}
}
Элемент видео находится в контейнере с 33vh
, и при прокрутке сверху вниз он должен анимировать положение с помощью перевода, чтобы достичь конца экрана.
Поскольку на данный момент он не работает в Safari и Mozilla, я хочу использовать этот опросник https://github.com/flackr/scroll-timeline, чтобы сделать его кроссбраузерным.
Информация о плагине предполагает, что я могу заставить CSS-анимацию работать кроссбраузерно, но, судя по моим тестам, она работает только с помощью JavaScript. Поэтому я хочу преобразовать приведенную выше анимацию прокрутки CSS в JavaScript.
Вот где я сейчас
var videoElement = document.querySelector('[data-section-id = "66d339fcaa91932c1202ad7e"] video');
var scrollTimeline2 = new ScrollTimeline({
source: document.documentElement,
axis: "block",
orientation: 'block'
});
videoElement.animate(
{ transform: ["translateY(0)", "translateY(-33vh)"]},
{
duration: 1000,
fill: 'both',
timeline: scrollTimeline2
}
);
Это создает небольшой эффект параллакса, но не такой, как в коде CSS.
Я думаю, что мне нужно указать rangeStart и rangeEnd для второго аргумента (объекта) .animate
, но я не могу определить формат.
Я попробовал это, но это мешает работе всего эффекта параллакса.
videoElement.animate(
{ transform: ["translateY(0)", "translateY(-33vh)"]},
{
duration: 1000,
fill: 'both',
timeline: scrollTimeline2,
rangeStart: "cover 30%",
rangeEnd: "cover 66%",
}
);
Из документации Animate https://developer.mozilla.org/en-US/docs/Web/API/Element/animate#rangeend формат должен быть действительным.
Может кто-нибудь помочь, пожалуйста?
@JaromandaX они говорят о полифиле.
После многих проб и ошибок и просмотра документации я пришел к этому
var videoElement = document.querySelector('[data-section-id = "66d339fcaa91932c1202ad7e"] video');
var scrollTimeline2 = new ScrollTimeline({
source: document.documentElement,
axis: "block",
orientation: 'block'
});
videoElement.animate(
{ transform: ["translateY(0)", "translateY(-33vh)"]},
{
duration: 1000,
fill: 'both',
timeline: scrollTimeline2,
rangeStart: (function() {
if ( new ScrollTimeline() instanceof AnimationTimeline ) {
return {
rangeName: 'cover',
offset: CSS.percent('70'),
}
} else {
return new CSSUnitValue(70, 'percent')
}
})(),
rangeEnd: (function() {
if ( new ScrollTimeline() instanceof AnimationTimeline ) {
return {
rangeName: 'cover',
offset: CSS.percent('100'),
}
} else {
return new CSSUnitValue(100, 'percent')
}
})()
}
);
В браузерах, поддерживающих ScrollTimeline
, я использовал объект для rangeStart
и rangeEnd
. Они не работают с полифиллом.
Для браузеров, которым нужен полифилл, я использовал функцию CSSUnitValue()
, которая также происходит из полифилла, но присутствует в браузерах, которые его поддерживают.
Причина, по которой я проверяю, используется ли полифилл с new ScrollTimeline() instanceof AnimationTimeline
, заключается в том, что когда я использую CSSUnitValue
для встроенной поддержки, в конечном результате он ведет себя по-другому. В моем случае очень небольшой эффект параллакса.
вы упоминаете «кроссбраузерность» — но вы используете только семейство Chromium
animation-timeline
иScrollTimeline
Экспериментальные функции — так что вам придется подумать еще раз