我一直致力于苹果风格的图像序列滚动器从codepen:https://codepen.io/jasprit-singh/pen/LYxzQjB
我希望JS将滚动高度基于一个div,它是画布的父级,这样我就可以在这一节之前和之后有内容,而不会在它进入视口之前起作用。
我认为const html = document.documentElement;
是问题所在,因为它阅读的是<html>
的全部内容,而不是我想要选择的父div。但是,我不知道如何更改它。
我试过用const html = document.getElementById("wrap1");
替换const html = document.documentElement;
,但这只是停止一切工作,没有控制台错误。
我做错了什么/我需要改变什么?
先谢了!
const html = document.documentElement;
const canvas = document.getElementById("hero-lightpass");
const context = canvas.getContext("2d");
const frameCount = 148;
const currentFrame = index =>
(`https://www.apple.com/105/media/us/airpods-pro/2019/1299e2f5_9206_4470_b28e_08307a42f19b/anim/sequence/large/01-hero-lightpass/${index.toString().padStart(4, '0')}.jpg`);
const preloadImages = () => {
for (let i = 1; i < frameCount; i++) {
const img = new Image();
img.src = currentFrame(i);
}
};
const img = new Image();
img.src = currentFrame(1);
canvas.width = 1158;
canvas.height = 770;
img.onload = function() {
context.drawImage(img, 0, 0);
};
const updateImage = index => {
img.src = currentFrame(index);
context.drawImage(img, 0, 0);
}
window.addEventListener('scroll', () => {
const scrollTop = html.scrollTop;
const maxScrollTop = html.scrollHeight - window.innerHeight;
const scrollFraction = scrollTop / maxScrollTop;
const frameIndex = Math.min(frameCount - 1, Math.ceil(scrollFraction * frameCount));
requestAnimationFrame(() => updateImage(frameIndex + 1));
});
preloadImages();
#wrap1 {
position: relative;
z-index: 1;
margin: 0;
padding: 0;
background: #000;
}
#wrap {
height: 500vh;
}
canvas {
position: fixed;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
max-width: 100vw;
max-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
<div class="wrap1" id="wrap1">
<div class="wrap" id="wrap">
<canvas id="hero-lightpass"></canvas>
</div>
</div>
1条答案
按热度按时间hwamh0ep1#
从我自己的Angular 来看,首先,我们可以将
overflow-y: auto
添加到父对象中,然后我们可以将const html = document.documentElement;
更改为您提到的父对象(const html = document.getElementById("wrap1");
),然后我们还需要将scroll侦听器添加到父对象中:将window.addEventListener('scroll', () => {
更改为html.addEventListener('scroll', () => {
。完成所有这些操作后,图像动画应该基于父滚动条工作,如下所示:注意:我也添加和删除了一些CSS,以便它看起来与代码片段相似。