当Div One的高度击中底部时,它将不再滚动,反之亦然,以便向上滚动。
这将导致侧边栏始终可见。在您提出要求之前,我已经尝试了所有定位类型以使其工作,从而导致许多尝试失败。
我的现场演示可以在这里看到:http://rafflebananza.com/admin/newadmin.html#
注意我试图简化JSFiddle,但我的数学似乎并没有相同。请建议我是否应将我的所有页面分到那里,或者为将来需要相同帮助的访问者提供什么。
滚动包装器会将侧边栏滚动到仅指向x(x是侧边栏高度)然后停止但会继续允许滚动内容。滚动备份反之亦然。
var scrollTop = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop,
position = document.body.scrollTop;
function scrollD() {
var scroll = document.body.scrollTop;
if (scroll > position) {
// Scrolling Down Functions
} else {
// Scrolling Up Functions
}
position = scroll;
}
答案 0 :(得分:1)
更新了符合OP要求的答案。
我以当前状态下载了您的网站,并对您的代码进行了以下更改:
var scrollY = 0;
$(window).scroll(function() {
var sideNav = $('.SideNav'); // The side navigation
var wScrollY = $(this).scrollTop(); // Current scroll position of Window
var navHeight = sideNav.height(); // Height of the Navigation
var StageHeight = $(window).height() - 46; // The display space
if(sideNav.height() > StageHeight) { // Do the following if the side navigation is higher than the display space
var spaceLeft = sideNav.height() - StageHeight; // spaceLeft -> how many pixel left before fixing navigation when scrolling
if(scrollY < wScrollY) { // Scroll direction is down
if (wScrollY >= spaceLeft) // If scroll top > space left -> fixate navigation at the bottom, otherwise scroll with the content
sideNav.css({top:46-spaceLeft+wScrollY});
if (wScrollY <= 46) // Set top strict to 46. Sometimes there is white space left, caused by the scroll event.
sideNav.css({top:46});
} else { // Scroll direction is up
var sideNavTop;
if (sideNav.offset().top < 0) {
sideNavTop = Math.pow(sideNav.offset().top); // if top is negative, make it positive for comparison
} else {
sideNavTop = sideNav.offset().top;
}
if (sideNavTop > (46+wScrollY)) // Fixate the header if top of navigation appears
sideNav.css({top:46+wScrollY});
}
} else {
sideNav.css({top:46+wScrollY}); // Fixate always
}
scrollY = wScrollY;
});
这将让您滚动侧面导航直到结束。然后注意。如果向上滚动,它仍将被固定,直到您到达导航必须滚动回其原始位置的点。
您可以在此处查看已修改的版本:http://pastebin.com/Zkx4pSKe
只需将原始代码复制到空白的html页面并试用即可。
它有点乱,也许不是最好的解决方案,但它确实有效。
答案 1 :(得分:1)
好的,你走了:
var $sidebar = $('.sidebar'),
$window = $(window),
previousScroll = 0;
$window.on('scroll', function (e) {
if ($window.scrollTop() - previousScroll > 0) {
$sidebar.css({
'top': Math.max($window.scrollTop() + $window.height() - $sidebar.outerHeight(true), parseInt($sidebar.css('top'))) + 'px'
});
} else {
$sidebar.css({
'top': Math.min($window.scrollTop(), parseInt($sidebar.css('top'))) + 'px'
});
}
previousScroll = $window.scrollTop();
});
答案 2 :(得分:0)
我可能错误地误解了您想要的结果,但您可以看看这是否适合您:
.SideNav {
position: fixed; // you currently have this as position:absolute;
}
答案 3 :(得分:0)
您既不需要包装元素也不需要jQuery。我假设您正在使用包装器,因为您希望将顶部条放在那里。我认为通过使用简单的三个div可以有更好的方法。
fixed
(始终可见)且全宽。fixed
(始终可见),顶栏高度的上边距。以下是示例代码(http://jsfiddle.net/zckfwL4p/):
<强> HTML 强>
<div id="top_bar"></div>
<div id="side_bar">links here</div>
<div id="content"></div>
<强> CSS 强>
body {
margin:0px;
padding:0px;
}
#side_bar {
width:50px;
position: fixed;
left:0px;
top:20px;
background-color:blue;
}
#top_bar {
position:fixed;
height:20px;
left:0px;
right:0px;
background-color:red;
}
#content {
position:relative;
padding-left:55px;
padding-top:25px;
}