Присвоить анимацию блоку, но поставить на паузу css js

polzunok.style.animation = 'progress ' + video.duration + 's linear infinite ';
polzunok.style.animationPlayState = 'paused';

Возможно ли сразу присвоить анимацию и в тоже время поставить на паузу, то есть одной строчкой, чтобы второй не было.


Ответы (2 шт):

Автор решения: Опан

Исходя из предыдущих вопросов допускаю, что хотите сделать прогрессбар на CSS для элемента видео. Можно заставить CSS-анимацию стартировать и останавливаться одновременно с командами play() и pause() для видео. Но такой прогрессбар не будет реагировать на перемотку в самом плеере и после таковой будет продолжать дальше двигаться с того же самого места:

<style>
#polzunok{
    width: 300px;
    height: 15px;
    background: red;
}
@keyframes progress{
    from{width: 0px;}
    to{width: 300px;}
}
</style>
<div id=polzunok></div><br />
<video id=video src='https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4' width="300" controls></vide o>
<script>
video.onloadeddata = () => polzunok.style.animation = 'progress ' + video.duration + 's linear infinite paused';
video.onplay = () => polzunok.style.animationPlayState = 'running';
video.onpause = () => polzunok.style.animationPlayState = 'paused';
</script>

К тому же невозможно таким способом с помощью клика на ползунок установить текущее место воспроизведения или хотя бы изменить ширину ползунка.

→ Ссылка
Автор решения: Опан

Если в коде предыдущего ответа добавить JS-управление, то оказывается можно восполнить все эти недочёты и заставить прогрессбар на CSS-анимации быть полнофункционально привязанным к видео:

<style>
#contayner{
    width: 300px;
    border-style: solid;
}
#polzunok{
    width: 0px;
    height: 15px;
    background: red;
}
</style>
<style></style>
<video id=video src='https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4' width="300" controls></video><br /><br />
<div id=contayner><div id=polzunok></div></div>
<script>
let progresswidth = 300; // ширина прогрессбара
const setstyle = () => document.querySelectorAll('style')[1].innerText = '@keyframes progress{from{width: '+video.currentTime/video.duration*progresswidth+'px;}to{width: ' + progresswidth + 'px;}}';
const widthpolzunok = () => polzunok.style.width = video.currentTime / video.duration * progresswidth + 'px';
video.onplay = () => {
    polzunok.style.animation = 'progress ' + (video.duration - video.currentTime) + 's linear infinite';
    setstyle();
}
video.onpause = () => {
    polzunok.style.animation = '';
    widthpolzunok();
}   
video.onseeked = () => {
    setstyle();
    widthpolzunok();
}
contayner.onclick = polzunok.onclick = (e) => {
    polzunok.style.width = e.pageX - 10 + 'px';
    video.currentTime = (e.pageX - 10) / progresswidth * video.duration;
}
</script>

И при этом даже не пришлось использовать ни setInterval(), ни requestAnimationFrame().

→ Ссылка