提高mousemove事件触发的视差效果的性能
Improving performance of parallax effect triggered by mousemove event
我做了一个视差效果here inspired by this website。目前它监听 mousemove 事件并使用 CSS 转换来做视差。我还使用了 lodash 的 throttle 函数,所以事件不会经常被触发。
伪代码:
let parallax = (e) => {
// calculate deltas of mouse x and y from the midpoint
// multiplier = 0.01
// for every parallax image
// translate image (multiplier * dx, multiplier * dy)
// multiplier *= 0.8
}
document.addEventListener('mousemove', _.throttle(parallax, 10));
然而,它的性能仍然不是最佳的,我想知道我可以做些什么来改进它?
增加油门时间会导致非常明显的滞后。我也在研究使用 canvas 和 requestAnimationFrame,但我不确定它们的性能如何与使用 CSS 相提并论。
我重做了你的视差效果以使用 3d 定位和透视变化。
视角变化模拟改变你的观点。
物体应该有一个 z 位置,使它们相对或多或少地移动,就像在现实世界中一样
它现在应该 运行 更有效率,因为所有这些都是在单个 属性 更改中处理并在 GPU 上执行的
let bg = document.querySelector('.background');
let rect = bg.getBoundingClientRect();
let midX = rect.left + rect.width / 2;
let midY = rect.top + rect.height / 2;
let parallax = (e) => {
let dx = e.clientX - midX;
let dy = e.clientY - midY;
let mult = -0.5;
let perspective = `${dx * mult}px ${dy * mult}px`;
bg.style.perspectiveOrigin = perspective;
}
document.addEventListener("mousemove", parallax);
body {
width: 100%;
height: 100%;
overflow: hidden;
}
.background {
background-color: whitesmoke;
width: 400px;
height: 400px;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
perspective: 500px;
transform-style: preserve-3d;
}
img {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 200px;
margin: auto;
}
.one {
top: 100px;
width: 300px;
transform: translateZ(1px);
}
.two {
top: 0px;
width: 300px;
transform: translateZ(100px);
}
.text {
line-height: 400px;
width: 200px;
position: relative;
z-index: 1000;
text-align: center;
color: red;
transform-style: preserve-3d;
transform: translateZ(200px);
}
<div class="background" style="perspective-origin: -18.025px 14.15px;">
<h1 class="plax text">Hello.</h1>
<img class="plax two" src="http://www.etiennegodiard.com/wp-content/uploads/2017/06/YokaVendredi-copie-min.png">
<img class="plax one" src="http://www.etiennegodiard.com/wp-content/uploads/2017/04/Yokaombre5.png">
</div>
我做了一个视差效果here inspired by this website。目前它监听 mousemove 事件并使用 CSS 转换来做视差。我还使用了 lodash 的 throttle 函数,所以事件不会经常被触发。
伪代码:
let parallax = (e) => {
// calculate deltas of mouse x and y from the midpoint
// multiplier = 0.01
// for every parallax image
// translate image (multiplier * dx, multiplier * dy)
// multiplier *= 0.8
}
document.addEventListener('mousemove', _.throttle(parallax, 10));
然而,它的性能仍然不是最佳的,我想知道我可以做些什么来改进它?
增加油门时间会导致非常明显的滞后。我也在研究使用 canvas 和 requestAnimationFrame,但我不确定它们的性能如何与使用 CSS 相提并论。
我重做了你的视差效果以使用 3d 定位和透视变化。
视角变化模拟改变你的观点。
物体应该有一个 z 位置,使它们相对或多或少地移动,就像在现实世界中一样
它现在应该 运行 更有效率,因为所有这些都是在单个 属性 更改中处理并在 GPU 上执行的
let bg = document.querySelector('.background');
let rect = bg.getBoundingClientRect();
let midX = rect.left + rect.width / 2;
let midY = rect.top + rect.height / 2;
let parallax = (e) => {
let dx = e.clientX - midX;
let dy = e.clientY - midY;
let mult = -0.5;
let perspective = `${dx * mult}px ${dy * mult}px`;
bg.style.perspectiveOrigin = perspective;
}
document.addEventListener("mousemove", parallax);
body {
width: 100%;
height: 100%;
overflow: hidden;
}
.background {
background-color: whitesmoke;
width: 400px;
height: 400px;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
perspective: 500px;
transform-style: preserve-3d;
}
img {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 200px;
margin: auto;
}
.one {
top: 100px;
width: 300px;
transform: translateZ(1px);
}
.two {
top: 0px;
width: 300px;
transform: translateZ(100px);
}
.text {
line-height: 400px;
width: 200px;
position: relative;
z-index: 1000;
text-align: center;
color: red;
transform-style: preserve-3d;
transform: translateZ(200px);
}
<div class="background" style="perspective-origin: -18.025px 14.15px;">
<h1 class="plax text">Hello.</h1>
<img class="plax two" src="http://www.etiennegodiard.com/wp-content/uploads/2017/06/YokaVendredi-copie-min.png">
<img class="plax one" src="http://www.etiennegodiard.com/wp-content/uploads/2017/04/Yokaombre5.png">
</div>