javascript - Sticky Bootstrap 列应以父/内容结尾
问题描述
我已经看到了这个问题的各种形式,但没有什么能真正帮助我解决部分粘性侧边栏/引导列的行为。让我从问题本身开始。
我的页面顶部附近有一个大图像。由于页面复杂,我使用的是 Bootstrap 列网格。图像跨越,比方说,10 列,我在左侧留下了 2 列,属于同一行,以存储侧边栏。这也允许我垂直对齐图像旁边的侧边栏。
现在,侧边栏,即现在的 Bootstrap 列,应该是粘性的,并且一旦滚动条经过,应该保持与视口垂直对齐。您可以在小提琴中看到它有点“跳跃”而不是平滑过渡。
另一个问题是粘性元素/列应该只在其父/容器可见时保持粘性。这意味着它应该过渡/相对于该容器的末尾。现在我只设法让它保持粘性直到页面结束。它应该停在红线上方(如小提琴所示)。
到目前为止,这是我的 jQuery 逻辑。
$(document).ready(function(){
$(window).scroll(function(){
var elem = $("#refScroller").offset().top - ($("#refScroller").height() / 2);
var windowvalue = $(window).scrollTop();
if (elem <= windowvalue) {
$("#wannabeSticky").addClass("sticky");
}
else {
$("#wannabeSticky").removeClass("sticky");
}
});
});
我真的很感激一些想法和提示,因为这已经困扰了我两天。如果可能的话,我希望保留 Bootstrap 网格结构,但请随时提出任何建议,即使是那些将侧边栏描述为纯绝对 div 的人,只要粘性有效。
提前致谢!
编辑:我知道这里已经存在类似的问题,但似乎我无法让 JS 逻辑适用于我的情况。
解决方案
所以,又花了一天的时间,我似乎找到了一个不错的 jQuery 版本,可以完成工作。有我更新的小提琴。
$(document).ready(function(){
var passedMobileNavi = false;
function stickySocialNavi(reference, valueExtracted) {
var refTop = $(reference).offset().top - valueExtracted;
var scrollTop = $(window).scrollTop();
return (refTop <= scrollTop);
}
$(window).scroll(function() {
if (stickySocialNavi($("#refScroller"), $("#refScroller").height())) {
if (!passedMobileNavi) {
passedMobileNavi = true;
$("#wannabeSticky").addClass("sticky");
}
}
else {
passedMobileNavi = false;
$("#wannabeSticky").removeClass("sticky");
}
if (stickySocialNavi($("#end"), $(window).height())) {
var var1 = $(window).scrollTop(),
var2 = $("#end").offset().top,
var3 = $(window).height();
var calculateOffset = (var2 - var3) - var1;
$("#wannabeSticky").css("top", "calc(50% + " + calculateOffset + "px)");
}
else {
$("#wannabeSticky").css("top", "50%");
}
});
});
为了开始粘性,我取了参考点(它旁边的非移动元素)和它的高度。只要滚动条越过参考点的中心,粘性元素就会获得固定位置。
由于stick元素居中,当到达其容器的末端时,它会获得额外的顶部偏移值。它仍然是固定的,但它的 top 属性的值采用了滚动差异,因此慢慢地将它描绘到容器的末端。
我不知道这是否是最优雅、最直接或易于实施/理解的解决方案,但它对我有用。
推荐阅读
- istio - Traslate nginx 入口规则与片段到 Istio
- javascript - Chrome 扩展程序 | 动态创建 manifest.json
- r - ROCR 中预测函数的标签错误
- python - pygame中的文本输入
- reactjs - 如何将 Reactjs 构建文件夹部署到 jboss 服务器
- flask - 如何在 Flask 中进行 API 调用?
- reporting-services - 报表服务器:如果参数 = null 或空白,如何选择所有内容(启用多个值)
- c# - 如何在 asp.net mvc 核心中覆盖控制器的名称?
- node.js - 如何在 Node js 中构建电子邮件功能?
- php - 调用未定义的方法 App\UserShiftPattern::userWorkScheduleList()