javascript - 阻止使用 css / js 向上滚动超过某个 div
问题描述
我试图弄清楚如何限制访问者向上滚动以停止在 div2,而不是网页顶部。
该网页有几个主要部分:
<div1>tease</div>
<div2>hero</div>
<div3>info</div>
<div4>specs</div>
<div5>prices</div>
<footer></footer>
div1
纯粹是为了让访问者好奇的营销预告片,他们只需要看到一次。理想情况下,我们希望能够在访问者沿着页面向下移动到div3
. 然后当他们向上滚动时,页面停止,顶部的英雄,好像挑逗不存在。
我们尝试在向下滚动时简单地隐藏 div,但这会导致页面以巨大的内容偏移重绘(挑逗填充了 100% 的视口高度,并具有最大高度值)。这种 UI 转变是不可取的。触发隐藏页脚底部的 div 将避免重绘移位,但大多数访问者不会一直滚动到页脚底部。
我们研究了使用 css 动画来缓慢降低 的高度div1
,但由于重绘,它再次使 UI 生涩。
我正在寻找一种使用 css 和 javascript 执行此操作的方法。不想为一种营销技巧加载 jQuery。谢谢。
解决方案
我们通过使英雄图像(div 2)具有粘性并向信息(div 3)添加上边距来解决这个难题。
通过使英雄图像具有粘性,它在到达视口顶部时冻结,因此不会受到关闭挑逗(div 1)引起的重绘的影响。我们使用 InterectionObserver 观察 div 3 到达视口并触发 div 1 的关闭并向 div 3 添加上边距。
// close tease and push div 3 down to avoid content jump
const target = $('div3');
function handleIntersection(entries) {
entries.map((entry) => {
if (entry.isIntersecting) {
$('div1').style.display = 'none';
$('div3').style.marginTop = '100vh';
} else { }
});
}
const observer = new IntersectionObserver(handleIntersection);
observer.observe(target);
如果有人在他们的浏览器上观看滚动条,他们会注意到它在重绘期间移动,但视口中的信息保持静止。
我们决定通过 js 添加上边距,因为我们不希望网页上出现巨大的空白,以供少数可能禁用 javascript 的访问者使用。
推荐阅读
- html - cdk-virtual-scroll-viewport 有没有办法从底部元素开始而不滚动?
- java - 从一组 Java Pojo 类创建 JSON 结构
- php - 在 prestashop 中的自定义模块上创建自定义控制器后台
- javascript - 如何提醒用户更改未保存
- wso2esb - 如何在 WSO2 DataMapper 中实现 javascript 的“JSONObject.hasOwnProperty(keyName)”函数的工作
- java - 当每个用户通过他/她的凭据登录时,他/她都有自己列出的数据
- javascript - 需要通过登录实现Power Bi报告到角度应用程序
- nginx - Nginx托管多个域名的多个网页?
- c++ - 需要在 qt c++ 应用程序中找到崩溃问题的建议
- android - 如何从 Kotlin 的片段中传递上下文?