gpt4 book ai didi

javascript - 使用 JavaScript 回到 CSS 位置粘性元素?

转载 作者:行者123 更新时间:2023-12-03 06:45:55 25 4
gpt4 key购买 nike

我有一个页面,其中所有部分都填满了整个屏幕并使用 CSS position: sticky; 定位以达到分层效果。看这里:

https://codesandbox.io/s/ecstatic-khayyam-cgql1?fontsize=14&hidenavigation=1&theme=dark

这一切都很好,正如预期的那样。

然而,问题来自于使用 JavaScript 在这些区域之间导航。如果您尝试使用菜单,您会看到链接将在我们尚未完全访问的部分上起作用(因此不是“粘性”),但不允许您“返回”页面。

我相信这是 el.getBoundingClientRect() 的问题一旦一个元素变得“粘性”,它的最高值基本上总是为零。

在这里,我使用了一个名为 Jump.js 的小型库。跳来跳去,但即使在 vanilla JS 中,这个问题仍然是一样的,因为问题是元素变得粘滞时计算的结果。

有什么方法可以在每个部分粘上之前找到它的原始位置?至少这样我可以通过手动设置滚动位置来导航用户。

我正在使用 Vue.js,但这不会影响手头的与 CSS 和 JS 相关的问题。

应用程序.vue

<template>
<main id="app">
<ul class="menu">
<li @click="goTo('A')">Section A</li>
<li @click="goTo('B')">Section B</li>
<li @click="goTo('C')">Section C</li>
<li @click="goTo('D')">Section D</li>
<li @click="goTo('E')">Section E</li>
</ul>
<SectionItem id="A" color="red"/>
<SectionItem id="B" color="green"/>
<SectionItem id="C" color="blue"/>
<SectionItem id="D" color="orange"/>
<SectionItem id="E" color="purple"/>
</main>
</template>

<script>
import jump from "jump.js";
import SectionItem from "./components/SectionItem.vue";

export default {
name: "App",
components: {
SectionItem
},
methods: {
goTo(id) {
jump(`#${id}`, {
duration: 300
});
}
}
};
</script>

SectionItem.vue
<template>
<div :id="id" class="SectionItem" :style="styles">
<p>I am section item: {{ id }}</p>
</div>
</template>

<script>
export default {
name: "SectionItem",
props: {
id: {
type: String,
required: true
},
color: {
type: String,
required: true
}
},
computed: {
styles() {
return {
backgroundColor: this.color
};
}
}
};
</script>

<style>
.SectionItem {
position: sticky;
top: 0;
width: 100%;
min-height: 100vh;
padding: 20px;
color: white;
border: 10px solid white;
}
</style>

我正在寻找任何合理的解决方案,让自动滚动在两个方向上工作。非常感谢您的时间。

最佳答案

这是您的goTo方法应该看起来:

goTo(id) {
const el = document.querySelector(`#${id}`);
el.style.position = "static";
requestAnimationFrame(() => {
jump(`#${id}`, {
duration: 300
});
el.style.removeProperty('position');
});
}

here .

代码应该是不言而喻的:将元素的位置设置为 static使用内联样式,因此计算正确完成并在下一个动画帧中删除内联样式位置属性,因此元素显示为应用程序其余部分(在本例中,由 CSS)设置。由于它只发生在单帧中,因此人眼无法察觉。

注意:我只是快速写了一些东西来演示修复 - 它可能可以写得更像“vue like”(考虑使用 refs)。

另一个注意事项:如果您对切换框架的元素位置感到不舒服,并且希望以不那么激进的方式(朝向渲染的元素)进行切换,另一种方法是克隆整个 dom(没有事件),然后做同样的事情我建议的东西,但是在克隆上。获得值后,您可以删除克隆并将其传递到实际页面。显然,克隆应该有 position: absolute; width 100%; visibility: hidden; top: 0并成为 <body> 的直系祖先.总的来说,我相信它会更重(就内存使用而言),但就实际页面而言,它会不那么激进(它会避免任何副作用)——所有布局、绘画和渲染都会正确完成(就像你滚动)。副作用是指边缘情况,例如触发任何潜在监听器到视口(viewport)交集、附加插件、滚动监听器等...

关于javascript - 使用 JavaScript 回到 CSS 位置粘性元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60233414/

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