javascript - jQuery 后台定位 vs CSS 动画定位的 bug 和效率

标签 javascript jquery html performance

我目前在一个网站上工作,其中舞台/英雄有一组带有循环背景图像(文本图像)的 div,我正在使用 jQuery 来设置它们的位置动画以呈现“海洋”的外观图像在屏幕上移动。

var position = 0;

setInterval(function () { 
    position -= 1;
    $(".sub-image-1").css({ "background-position":+ position +"px 0px" }) 
}, 20 );

setInterval(function () { 
    position -= 1;
    $(".sub-image-2").css({ "background-position":+ position +"px 0px" }) 
}, 140 );

setInterval(function () { 
    position -= 1;
    $(".sub-image-3").css({ "background-position":+ position +"px 0px" }) 
}, 200 );
.stage-image {
    width:100vh;
    height:30vh;
}

.stage-sub-image { 
    position:absolute; top:0;
    width:100%;
    height:100%;
    background-repeat:repeat-x;
} 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="stage-image">
  <div class="stage-sub-image sub-image-1" style="background:url(https://upload.wikimedia.org/wikipedia/commons/c/ca/Triple-Spiral-4turns_green_transparent.png)"></div>
  <div class="stage-sub-image sub-image-2" style="background:url(https://upload.wikimedia.org/wikipedia/commons/b/be/Blender3D_Lisc_lipy-Transparent.png)"></div>
  <div class="stage-sub-image sub-image-3" style="background:url(https://cdn0.iconfinder.com/data/icons/ball/256/transparent.png)"></div>
</div>

我很好奇是否有更好的方法来解决这种浏览器密集度较低的问题。我觉得 setInterval 在这种情况下会给网站增加很多不必要的开销。有没有更好的方法来处理这样的事情?除了性能问题,通过 JS 完成的动画非常不稳定,我希望效果更流畅。

这是我目前拥有的 CodePen:

https://codepen.io/stufu/pen/GvJdxq

更新

@FuriousD 在下面给出了一个使用 CSS 来实现这一点的好建议,虽然这更接近我所希望的,但 CSS 动画会在到达背景位置的末端时导致跳跃。

这是一个基于他们的答案的 Codepen,但在动画完成后有一个“跳跃”的新问题:

codepen.io/stufu/pen/YxXaLR

最佳答案

您可以使用 CSS 动画。请注意,图像的宽度 (-250px) 需要硬编码到动画中,但这可以动态生成:

var containers = $('.stage-sub-image');
var containerWidth = $(containers[0]).width();
var styleElem = document.createElement('style');
var animClass = 'animateMe';

document.body.append(styleElem);

styleElem.innerHTML =
  '@keyframes animBg {' +
    'from { background-position: 0px top; }' +
    'to { background-position: -' + containerWidth + 'px top }' +
  '}' +
  '.' + animClass + ' { animation: animBg 10s linear infinite; background-size: 100% auto; }';


containers.addClass(animClass);
.stage-sub-image {
  width: 200px;
  height: 130px;
  background-color: #909;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="stage-image">
    <div class="stage-sub-image" style="background-image:url(http://via.placeholder.com/250x130)"></div>
    <div class="stage-sub-image" style="background-image:url(http://via.placeholder.com/250x130)"></div>
    <div class="stage-sub-image" style="background-image:url(http://via.placeholder.com/250x130)"></div>
</div>

关于javascript - jQuery 后台定位 vs CSS 动画定位的 bug 和效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45340512/

相关文章:

javascript - 为什么else语句要在if语句之后执行?

javascript - 无法使用 Javascript 为 div #box 设置动画

jquery - 获取 SPAN 标签的 ID,并根据单击的标签向文本框字段添加一些值

javascript - jQuery:一次展开一个列表项

javascript - 我从 .val()-function 得到空字符串 '' 或 'undefined'

javascript - 通过部分属性值获取元素

javascript - 如何避免仅在 Android 上出现 Phonegap 应用程序黑屏?

javascript - 为什么我的 $scope 在我的 Controller 中无法访问 - Angular JS?

javascript - 部署 QML 应用程序时找不到 SQLite 数据库

javascript - 浏览器网络摄像头访问/WebRTC - 如何确定最大分辨率和宽高比?