gpt4 book ai didi

javascript - Javascript ES6 中调整窗口大小问题

转载 作者:行者123 更新时间:2023-12-03 01:57:14 25 4
gpt4 key购买 nike

在我之前的post中我请求帮助修复某些部分,同时在没有框架的 Vanilla ES6 中滚动。

简单的 HTML 结构:

<header class="forewords"><h1>Lorem some</h1>
</header>

<div class="wrapper">
<section class="project" id="item1">this is section 1</section>
<section class="project" id="item2">this is section 2</section>
<section class="project" id="item3">this is section 3</section>
</div>

<footer class="endings"><h1>Lorem something.</h1>
</footer>

这是完成这项工作的核心函数:

function pinElement() {

// Reset all styles
projects.forEach((project) => {
document.body.style.paddingTop = 0;
project.classList.remove('fixed');
});

// Get the index of the project that is closest to top
const valueClosestToScrollY = Math.max.apply(Math, projectsOffsetTop.filter((offsetTop) => offsetTop <= window.scrollY));
const idx = projectsOffsetTop.indexOf(valueClosestToScrollY);


// Otherwise, we set the appropriate styles and classes
if (window.scrollY >= projectsOffsetTop[idx]) {
document.body.style.paddingTop = `${projectsHeight[idx]}px`;
projects[idx].classList.add('fixed');
}

};

window.addEventListener('scroll', pinElement);

现在我在调整窗口大小时遇到​​问题。

我添加了一个事件监听器,以便在有人调整窗口大小时更新元素的偏移和高度值。

function updateProjectsOffsetTop() {
projectsOffsetTop = projects.map(project => project.offsetTop);
projectsHeight = projects.map(project => project.offsetHeight);
};

window.addEventListener('resize', updateProjectsOffsetTop);

如果我在开始滚动之前调整窗口大小,则效果很好。但如果我在开始滚动后调整窗口大小,一切都会崩溃。

我无法找到实时更新值并将其传递给滚动函数的方法。如果可能的话,我想用 Vanilla ES6 来解决这个代码,因为我正在尝试从该规范开始学习 Javascript。

我知道也许这是一个简单的问题,但我是来学习的:)

提前致谢,并找到附件中完整的 JS Fiddle。

const projects = Array.from(document.querySelectorAll('.project'));
let projectsOffsetTop = projects.map(project => project.offsetTop);
let projectsHeight = projects.map(project => project.offsetHeight);

function updateProjectsOffsetTop() {
projectsOffsetTop = projects.map(project => project.offsetTop);
projectsHeight = projects.map(project => project.offsetHeight);
};


function pinElement() {

// Reset all styles
projects.forEach((project) => {
document.body.style.paddingTop = 0;
project.classList.remove('fixed');
});

// Get the index of the project that is closest to top
const valueClosestToScrollY = Math.max.apply(Math, projectsOffsetTop.filter((offsetTop) => offsetTop <= window.scrollY));
const idx = projectsOffsetTop.indexOf(valueClosestToScrollY);


// Otherwise, we set the appropriate styles and classes
if (window.scrollY >= projectsOffsetTop[idx]) {
document.body.style.paddingTop = `${projectsHeight[idx]}px`;
projects[idx].classList.add('fixed');
}

};

window.addEventListener('resize', updateProjectsOffsetTop);
window.addEventListener('scroll', pinElement);
html {
box-sizing: border-box;
}

*, *::before, *::after {
box-sizing: inherit;
margin: 0;
padding: 0;
}

header, footer {
width: 100%;
padding: 10%;
background-color: grey;
position: relative;
}

.project {
width: 100%;
height: 100vh;
position: relative;
display: flex;
justify-content: center;
align-items: center;
top: 0;
}

#item1 {background-color: yellow;}
#item2 {background-color: blue;}
#item3 {background-color: red;}


.fixed {
position: fixed;
}
<header class="forewords"><h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum soluta ipsam quaerat cupiditate neque, necessitatibus amet nihil perferendis sunt minus! Exercitationem nulla inventore, aut beatae magnam, totam et minus hic.</h1>
</header>

<div class="wrapper">
<section class="project" id="item1">this is section 1</section>
<section class="project" id="item2">this is section 2</section>
<section class="project" id="item3">this is section 3</section>
</div>

<footer class="endings"><h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repudiandae vel, perferendis ullam totam recusandae sed repellendus cum! Molestiae, aut ut sequi eos quidem nam quo est, ad tempora inventore odit.</h1>
</footer>

最佳答案

当您运行updateProjectsOffsetTop时并有一个 <section>已设置为position: fixed该固定元素的 offsetTop 始终为 0。

当您调整大小(滚动后)并获取新的偏移量时,任何元素的偏移量当前为 fixed将为零。因此破坏了你的逻辑 valueClosestToScrollY稍后。

您只需清除 fixed 即可解决此问题元素,设置偏移量,然后重新运行 pinElement()如下;

function updateProjectsOffsetTop() {
projects.forEach((project) => {
document.body.style.paddingTop = 0;
project.classList.remove('fixed');
});
projectsOffsetTop = projects.map(project => project.offsetTop);
projectsHeight = projects.map(project => project.offsetHeight);
pinElement();
};

这可能不完全是您想要实现的方式,但这就是问题所在。

const projects = Array.from(document.querySelectorAll('.project'));
let projectsOffsetTop = projects.map(project => project.offsetTop);
let projectsHeight = projects.map(project => project.offsetHeight);

function updateProjectsOffsetTop() {
projects.forEach((project) => {
document.body.style.paddingTop = 0;
project.classList.remove('fixed');
});
projectsOffsetTop = projects.map(project => project.offsetTop);
projectsHeight = projects.map(project => project.offsetHeight);
pinElement();
};


function pinElement() {

// Reset all styles
projects.forEach((project) => {
document.body.style.paddingTop = 0;
project.classList.remove('fixed');
});

// Get the index of the project that is closest to top
const valueClosestToScrollY = Math.max.apply(Math, projectsOffsetTop.filter((offsetTop) => offsetTop <= window.scrollY));
const idx = projectsOffsetTop.indexOf(valueClosestToScrollY);


// Otherwise, we set the appropriate styles and classes
if (window.scrollY >= projectsOffsetTop[idx]) {
document.body.style.paddingTop = `${projectsHeight[idx]}px`;
projects[idx].classList.add('fixed');
}

};

window.addEventListener('resize', updateProjectsOffsetTop);
window.addEventListener('scroll', pinElement);
html {
box-sizing: border-box;
}

*, *::before, *::after {
box-sizing: inherit;
margin: 0;
padding: 0;
}

header, footer {
width: 100%;
padding: 10%;
background-color: grey;
position: relative;
}

.project {
width: 100%;
height: 100vh;
position: relative;
display: flex;
justify-content: center;
align-items: center;
top: 0;
}

#item1 {background-color: yellow;}
#item2 {background-color: blue;}
#item3 {background-color: red;}


.fixed {
position: fixed;
}
<header class="forewords"><h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum soluta ipsam quaerat cupiditate neque, necessitatibus amet nihil perferendis sunt minus! Exercitationem nulla inventore, aut beatae magnam, totam et minus hic.</h1>
</header>

<div class="wrapper">
<section class="project" id="item1">this is section 1</section>
<section class="project" id="item2">this is section 2</section>
<section class="project" id="item3">this is section 3</section>
</div>

<footer class="endings"><h1>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Repudiandae vel, perferendis ullam totam recusandae sed repellendus cum! Molestiae, aut ut sequi eos quidem nam quo est, ad tempora inventore odit.</h1>
</footer>

关于javascript - Javascript ES6 中调整窗口大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50182382/

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