gpt4 book ai didi

javascript - 使用 JS mousemove 性能更改 CSS 属性

转载 作者:技术小花猫 更新时间:2023-10-29 11:41:53 30 4
gpt4 key购买 nike

我有一个 jQuery 函数更改 mousemove 上三个元素的 background-position 属性,这似乎会导致一些性能问题。

需要注意的是,这些元素的背景图片都是SVG。

示例代码:

$(window).on('mousemove', function(event) {
window.requestAnimationFrame(function() {

$banner.find('.pattern').each(function(key) {

var modifier = 20 * (key + 1);

$(this).css({
'background-position': (event.pageX / modifier)+'px '+(event.pageY / modifier)+'px'
});

});

});
});

在这里查看我的工作代码:https://codepen.io/thelevicole/project/full/DarVMY/

我正在使用 window.requestAnimationFrame() 并且每个元素上还有 will-change: background-position; css 属性。

您可能会说,这种影响是滞后的。它似乎在更大的窗口尺寸上变得更糟。

我很确定问题是由于背景图像使用 SVG 而不是 PNG 引起的。我使用 SVG 的原因是因为高像素密度屏幕。

如果有人能就我如何在不使用 PNG 的情况下提高 FPS 提供一些见解,那就太好了。谢谢。

最佳答案

成功。我的解决方案是结合各种建议。

我现在正在更改每个元素的转换属性,但在执行此操作时遇到了另一个问题。我在这些相同的元素上有一个转换关键帧动画,而 JS 应用的样式被忽略了。

为了解决这个问题,我嵌套了关键帧动画元素并使用 JS 来转换父元素。

我已应用@CristianTraìna 的建议将 window.requestAnimationFrame() 移到我的 mousemove

之外

您可以在我的原始链接中看到更新:https://codepen.io/thelevicole/project/full/DarVMY/

遗憾的是,CodePen 不允许对元素进行版本控制。


最终工作代码

(function($) {
'use strict';

var $banner = $('section.interactive');
if ($banner.length) {
var $patterns = $banner.find('.pattern');

var x = 0,
y = 0;

// Bind animation to cursor
$(window).on('mousemove', function(event) {
x = event.pageX;
y = event.pageY;
});

/**
* Tell the browser that we wish to perform an animation
* @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame
*/
window.requestAnimationFrame(function animation() {

// Loop each pattern layer
$patterns.each(function(key) {

// Modify the x,y coords per element to give "depth"
var modifier = 20 * (key + 1);

// Move background position
$(this).css({
'transform': 'translate('+(x / modifier)+'px, '+(y / modifier)+'px)'
});

});

window.requestAnimationFrame(animation);

});


}

})(jQuery);
section.interactive {
position: relative;
height: 100vh;
background-image: linear-gradient(45deg, #6ac8ea 0%, #5de2c1 100%);
}

section.interactive .layers {
overflow: hidden;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.15) 0%, transparent 40%, transparent 60%, rgba(0, 0, 0, 0.1) 100%);
}

section.interactive .layers .pattern {
position: absolute;
top: -10px;
left: -10px;
bottom: -10px;
right: -10px;
background-position: top left;
will-change: background-position;
background-size: 1000px 1000px;
}

section.interactive .layers .pattern .inner {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}

section.interactive .layers .pattern.pattern-1 .inner {
background-image: url("http://www.inrialpes.fr/sed/people/boissieux/VEAD/out_Stars.svg");
filter: blur(2px);
opacity: 0.3;
z-index: 1;
animation: Floating 10s infinite;
animation-delay: 2s;
background-size: 800px 800px;
}

section.interactive .layers .pattern.pattern-2 .inner {
background-image: url("http://www.inrialpes.fr/sed/people/boissieux/VEAD/out_Stars.svg");
filter: blur(1px);
opacity: 0.4;
z-index: 2;
animation: Floating 10s infinite;
animation-delay: 1s;
background-size: 900px 900px;
}

section.interactive .layers .pattern.pattern-3 .inner {
background-image: url("http://www.inrialpes.fr/sed/people/boissieux/VEAD/out_Stars.svg");
opacity: 0.4;
z-index: 3;
animation: Floating 10s infinite;
background-size: 1000px 1000px;
}

@keyframes Floating {
0% {
transform: translate(-10px, 10px);
}
50% {
transform: translate(10px, -10px);
}
100% {
transform: translate(-10px, 10px);
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Animation performance</title>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css">
<link rel="stylesheet" href="styles.processed.css">
</head>
<body>
<section class="interactive">
<div class="layers">
<div class="pattern pattern-3">
<div class="inner"></div>
</div>
<div class="pattern pattern-2">
<div class="inner"></div>
</div>
<div class="pattern pattern-1">
<div class="inner"></div>
</div>
</div>
</section>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</body>
</html>

关于javascript - 使用 JS mousemove 性能更改 CSS 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472506/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com