Javascript @滚动关键帧动画事件

Javascript @滚动关键帧动画事件,javascript,jquery,css-animations,keyframe,onscroll,Javascript,Jquery,Css Animations,Keyframe,Onscroll,我使用的是可变字体,希望在滚动时使用@keyframes设置动画,然后在用户停止滚动时不设置动画 我可以使动画工作,但是当你停止滚动时,动画会停止并捕捉回起始位置,这使它看起来非常跳跃 为了更平滑地完成,我想知道是否有一种方法,当用户停止滚动时,可以获取动画的当前位置,然后完成动画循环,然后停止,而不是立即捕捉回起始位置 因为我无法使用@font-face将变量font加载到JSFIDLE中,所以我将其放在这里: 这是js $(document).ready(function() {

我使用的是可变字体,希望在滚动时使用@keyframes设置动画,然后在用户停止滚动时不设置动画

我可以使动画工作,但是当你停止滚动时,动画会停止并捕捉回起始位置,这使它看起来非常跳跃

为了更平滑地完成,我想知道是否有一种方法,当用户停止滚动时,可以获取动画的当前位置,然后完成动画循环,然后停止,而不是立即捕捉回起始位置

因为我无法使用@font-face将变量font加载到JSFIDLE中,所以我将其放在这里:

这是js


    $(document).ready(function() {

    var scrollTimerId;

    $(window).scroll(function() {
        if (!scrollTimerId)
            $('body').addClass('scrolling');

        clearTimeout(scrollTimerId);
        scrollTimerId = setTimeout(function(){
            $('body').removeClass('scrolling');
            scrollTimerId = undefined;
        },150);
    });
});

还有css

@keyframes changewidth {
  0% {
    font-variation-settings: 'wght' 1;
  }

  100% {
    font-variation-settings: 'wght' 100;
  }
}

.scrolling {
  animation-duration: 0.5s;
  animation-name: changewidth;
  animation-iteration-count: infinite;
  animation-direction: alternate;
 animation-fill-mode: forwards;
}

body {
    font-family: "AG GX", Helvetica, sans-serif;
    font-weight: normal;
    font-style: normal;
    font-size: 2vw;
    line-height: 2vw;
    font-variation-settings: 'wght' 1;
    height: 300vh;
}

div {
  position: fixed;
}


提前谢谢

您面临的情况只是如何从动画中的任意点过渡到静态位置。
不幸的是,没有CSS定义的方法,所以我们必须借助javascript来处理这个问题

基本思想是手动触发该转换
getComputedStyle
可以为您提供动画当前的值,因此我们可以在元素的内联样式上设置它,然后在强制回流以转换到原始位置触发后立即删除它

不幸的是,Safari的行为异常,我们也必须切换transition属性,使此操作强制3次同步回流

下面是一个使用移动框的示例,因为它更容易设置为代码段:

const-box=document.getElementById('box');
onclick=e=>{
setProperty('transform',getComputedStyle(box.transform));
//将内联样式设置为当前值
box.classList.toggle('anim');//禁用动画
box.offsetWidth;//仅为Safari触发第一次回流
box.classList.toggle('transition');//切换转换
box.offsetWidth;//触发另一个回流,以便浏览器知道我们在哪里
box.style.removeProperty('transform');//返回初始位置
};
#框{
宽度:50px;
高度:50px;
背景:石灰;
}
.阿尼姆{
动画:移动2.5s无限;
}
.过渡{
转变:转变2s;
}
@关键帧移动{
from{transform:translate(0,0)rotate(0度);}/*Safari需要一个“from”*/
到{变换:平移(100vw,0)旋转(360度);}
}
单击以打开/关闭动画

我无法访问您的字体,因此我使用了css属性
颜色

为了跟踪动画的结束点,我使用了身体上的事件。逻辑是,

如果动画完成“奇数周期”,则更改
颜色和
动画方向,如果没有,则不执行任何操作

这是我补充的

@font-face {
    font-family: "AG GX";
    src: url('../fonts/AccidenzTestGX.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}

@keyframes changewidth {
  from, to {
    font-variation-settings: 'wght' 1;
  }

  50% {
    font-variation-settings: 'wght' 100;
  }
}

.scrolling {
  animation-duration: 0.5s;
  animation-name: changewidth;
  animation-iteration-count: infinite;
}

body {
    font-family: "AG GX", Helvetica, sans-serif;
    font-weight: normal;
    font-style: normal;
    font-size: 2vw;
    line-height: 2vw;
    height: 300vh;
    font-variation-settings: 'wght' 1;
    transition: font-variation-settings 0.5s;
}

div {
  position: fixed;
  }
}
此外,我还使用了
started
来检查动画是否已启动,并相应地只设置了一次属性
animation direction

$(文档).ready(函数(){
var-timerid;
var currColor='rgb(0,128,0)';
var animDir=‘替代’;
var=false;
var现在;
$('body').css('color',currColor);
$(窗口)。滚动(函数(){
如果(!已启动){
如果(!scrollTimerId)
$('body').addClass('scrolling');
$('.scrolling').css('animation-direction',animDir);
开始=真;
now=Date.now();
}
clearTimeout(scrollTimerId);
scrollTimerId=setTimeout(函数(){
$('body')。在('animationiteration',function()上{
如果(启动){
$('body').removeClass('scrolling');
scrollTimerId=未定义;
var cycles=Math.round((Date.now()-now)/1000);
如果(周期%2){
如果(currColor=='rgb(0,128,0)'{
currColor='rgb(255,0,0)';
animDir=‘交替反转’;
}否则{
currColor='rgb(0,128,0)';
animDir=‘交替’;
}
}
开始=错误;
$('body').css('color',currColor);
}
});
}, 500);
});
});
@关键帧颜色{
0% {
颜色:绿色;
}
100% {
颜色:红色;
}
}
.滚动{
动画持续时间:1s;
动画名称:彩色;
动画迭代次数:无限;
动画方向:交替;
动画填充模式:正向;
}
身体{
字体大小:正常;
字体风格:普通;
字体大小:2vw;
线高:2vw;
高度:300vh;
}
div{
位置:固定;
}

为了测试普通比率,我们需要一个与普通比率相同的总体收益率,这是一个必要的收益率。为了测试普通比率,我认为这是一项重要的研究
在库萨姆的监狱里,必须有一个真正的监狱

为了测试正常比例,在所有必要的情况下,视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥, 在我国,珊瑚礁和珊瑚礁在实验室中的分布情况与我国的实际情况类似 根据《宪法》的规定,非铁官方机构的非铁金属材料清除量应为消费者所需的材料量 et elibus idellahore volor serum volant

为了测试正常比率,在非正常情况下,视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥视锥
@font-face {
    font-family: "AG GX";
    src: url('../fonts/AccidenzTestGX.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}

@keyframes changewidth {
  from, to {
    font-variation-settings: 'wght' 1;
  }

  50% {
    font-variation-settings: 'wght' 100;
  }
}

.scrolling {
  animation-duration: 0.5s;
  animation-name: changewidth;
  animation-iteration-count: infinite;
}

body {
    font-family: "AG GX", Helvetica, sans-serif;
    font-weight: normal;
    font-style: normal;
    font-size: 2vw;
    line-height: 2vw;
    height: 300vh;
    font-variation-settings: 'wght' 1;
    transition: font-variation-settings 0.5s;
}

div {
  position: fixed;
  }
}
$(document).ready(function() {
  $(window).scroll(function() {
    $('body').addClass('scrolling');
    clearTimeout($.data(this, 'scrollTimer'));
    $.data(this, 'scrollTimer', setTimeout(function() {
      var computedStyle = $('body').css('font-variation-settings');
      $('body').removeClass('scrolling');
      $('body').css('font-variation-settings', computedStyle);
      setTimeout(function() {
        $('body').css('font-variation-settings', "'wght' 1");
      }, 500);
    }));
  });
});