我正在尝试创建一个类似于Vice.com上的侧边栏的侧边栏。如果向下滚动,侧边栏将固定在某个点,然后当侧边栏到达站点底部附近的某个点时,它将继续向上滚动到站点的其余部分。
在我的网站上,我被困在第二部分,一旦它碰到底部附近,侧边栏就会继续向上滚动。确切地说,从底部290px
。
这是我到目前为止所做的:
的JavaScript
<script>
jQuery(window).scroll(function () {
var threshold = 20;
if (jQuery(window).scrollTop() >= 20)
jQuery('#sidebar').addClass('fixed');
else
jQuery('#sidebar').removeClass('fixed');
});
</script>
CSS
#sidebar {
margin: 0;
position: absolute;
right: 0;
width: 220px;
}
#sidebar.fixed {
margin-left: 720px;
position:fixed;
right: auto;
top: 173px;
}
如果固定侧边栏在触及底部附近的某个点时向上滚动,该怎么办?
编辑#1
以下是Adam的更新代码。我正在为具有不同阈值的页面使用条件语句。当我使用这个代码时没有任何反应,这意味着侧边栏没有添加fixed
类,因此正常向上滚动,好像代码甚至没有。另外,我在这一行if (scrollTop() >= 236) {
上收到一个控制台错误,说“数字不是函数”。
if (jQuery(document.body).hasClass("home")) {
jQuery(window).scroll(function () {
var sidebarHeight = jQuery('#sidebar').height(),
containerHeight = jQuery('#container').height() + 173,
scrollTop = jQuery(window).scrollTop(),
clientHeight = scrollTop + jQuery(window).height(),
threshold = 654;
if (scrollTop() >= 654) {
jQuery('#sidebar').addClass('fixed');
} else if (containerHeight - scrollTop <= sidebarHeight) {
jQuery('#sidebar').removeClass('fixed').addClass('bottom');
}
});
} else if (jQuery(document.body).hasClass("single") || jQuery(document.body).hasClass("page")) {
jQuery(window).scroll(function () {
var sidebarHeight = jQuery('#sidebar').height(),
containerHeight = jQuery('#container').height() + 173,
scrollTop = jQuery(window).scrollTop(),
clientHeight = scrollTop + jQuery(window).height(),
threshold = 20;
if (scrollTop() >= 20) {
jQuery('#sidebar').addClass('fixed');
} else if (containerHeight - scrollTop <= sidebarHeight) {
jQuery('#sidebar').removeClass('fixed').addClass('bottom');
}
});
} else {
jQuery(window).scroll(function () {
var sidebarHeight = jQuery('#sidebar').height(),
containerHeight = jQuery('#container').height() + 173,
scrollTop = jQuery(window).scrollTop(),
clientHeight = scrollTop + jQuery(window).height(),
threshold = 236;
if (scrollTop() >= 236) {
jQuery('#sidebar').addClass('fixed');
} else if (containerHeight - scrollTop <= sidebarHeight) {
jQuery('#sidebar').removeClass('fixed').addClass('bottom');
}
});
}
以下是所请求的HTML结构:
<!-- BEGIN #masthead-->
<div id="masthead">
<!-- #secondary-menu -->
<div id="secondary-menu">
<!-- .centered-menu -->
<div class="centered-menu">
<div class="latest-tweets"></div>
<div id="search-bar"></div>
<ul class="social-icons sf-js-enabled"></ul>
</div>
<!-- /.centered-menu -->
</div>
<!-- /#secondary-menu -->
<!-- BEGIN #header-->
<div id="header">
<!-- #header-inner -->
<div id="header-inner" class="clearfix">
<div id="logo"></div>
<!-- BEGIN #primary-menu -->
<div id="primary-menu" class="clearfix">
<!-- .left-menu -->
<div class="left-menu split-menu"></div>
<!-- /.left-menu -->
<!-- .right-menu -->
<div class="right-menu split-menu">
<div class="menu-menu-right-container"></div>
<!-- /.right-menu -->
<!-- END #primary-menu -->
</div>
</div>
<!-- /#header-inner -->
<!-- END #header -->
<!-- BEGIN #mobile-menu -->
<div id="mobile-menu">
<div id="mobile-inner"></div>
</div>
<!-- END #mobile-menu -->
</div>
<div id="categories-bar"></div>
</div>
<div id="masthead-space"></div>
<!-- END #masthead -->
<!-- BEGIN #wrapper-->
<div id="wrapper">
<!-- BEGIN #page-->
<div id="page">
<div id="main" class="clearfix">
<div id="container" class="clearfix">
<!--BEGIN #content -->
<div id="content">
<div id="sidebar"></div><!-- #sidebar -->
</div>
</div>
<!--END #main -->
</div>
<!--END #page -->
</div>
<!--END #wrapper -->
</div>
<!--BEGIN #bottom -->
<div id="bottom">
<!--BEGIN #footer -->
<div id="footer"></div>
</div>
答案 0 :(得分:1)
我的建议:
创建2个具有所需特征的CSS类,并在到达断点后切换两者,1必须在开始时处于活动状态。
<强> JS 强>
var changePoint = $('#reaching_the_top_of_this_element_activates_change').offset().top;
$(window).scroll(function () {
if ($(window).scrollTop() >= changePoint) {
$('#sidebar').removeClass('blackStatic');
$('#sidebar').addClass('redFixed');
}
else {
$('#sidebar').addClass('blackStatic');
$('#sidebar').removeClass('redFixed');
}
});
<强> CSS 强>
.blackStatic {
position: static;
background-color: black;
color: red;
}
.redFixed {
position: fixed;
top: 0;
background-color: red;
color: black;
}
答案 1 :(得分:0)
正如我在评论中所说,这可能是关闭的,因为我现在无法看到html的结构。但是这样的事情应该有效。我们得到scrollbar
,container
的高度(+标题的高度),以及用户或client
的可查看区域的高度。因此,使用数学,我们可以说当container
- scrollTop
小于scrollbar
的高度时,我们需要滚动条停止修复。此时我们删除固定类并添加只有1个属性的底层类。 bottom: 0
。现在只要滚动条位于容器内部并且容器具有position: relative
,它的底部就会固定到容器的底部。
使用Javascript:
jQuery(window).scroll(function(){
var sidebarHeight = jQuery('#sidebar').height(),
containerHeight = jQuery('#container').height() + 173,
scrollTop = jQuery(window).scrollTop(),
clientHeight = scrollTop + jQuery(window).height(),
threshold = 20;
if(scrollTop >= 20){
jQuery('#sidebar').addClass('fixed');
}else if(containerHeight - scrollTop <= sidebarHeight){
jQuery('#sidebar').removeClass('fixed').addClass('bottom');
}
});
CSS:
#sidebar.bottom {
bottom: 0;
}
如果这对您不起作用,请告诉我,并将您的问题更新为html,以便更好地满足您的需求。此外,您还必须处理用户向上滚动页面的问题,目前这不会解决,但不会很难添加。
答案 2 :(得分:0)
看看bootstrap-affix.js http://getbootstrap.com/2.3.2/javascript.html#affix
它完全符合您的要求,您可以使用html5数据属性来添加行为:
<div data-spy="affix" data-offset-top="200">...</div>
答案 3 :(得分:0)
尝试此代码(我根据您的标记使用了ID):
function sidebarScroll()
{
var tmpWindow = $(window),
wrapper = $('#wrapper').height(),
header = $('#header').height(),
sidebar = $('#sidebar'),
offsetTop = sidebar.offset().top,
offsetBottom;
tmpWindow.scroll(function(){
offsetBottom = (wrapper + header) - sidebar.height();
if (tmpWindow.scrollTop() < offsetTop) {
sidebar.removeClass('fixed bottom');
} else if (tmpWindow.scrollTop() > offsetBottom) {
sidebar.removeClass('fixed').addClass('bottom');
} else {
sidebar.removeClass('bottom').addClass('fixed');
}
});
}
sidebarScroll();
这是你需要的课程:
#wrapper {
position: relative;
}
#sidebar {
width: 220px;
position: absolute;
right: 0;
}
#sidebar.fixed {
position: fixed;
top: 0;
}
#sidebar.bottom {
position: absolute;
bottom: 0;
}
答案 4 :(得分:0)
你从亚当借来的代码被错误地复制了。您使用scrollTop()而不是scrollTop。 scrollTop设置为一个数字,所以基本上,你试图做20()(或者设置为scrollTop的任何数字)
编辑:为了减少代码的冗余,我重写了它只是为了通过三元if语句设置阈值:
jQuery(window).scroll(function () {
var sidebarHeight = jQuery('#sidebar').height(),
containerHeight = jQuery('#container').height() + 173,
scrollTop = jQuery(window).scrollTop(),
clientHeight = scrollTop + jQuery(window).height(),
threshold = (jQuery(document.body).hasClass("home"))?654:((jQuery(document.body).hasClass("single") || jQuery(document.body).hasClass("page"))?20:236);
});
答案 5 :(得分:0)
<div class="main">
</div>
<div class="foot">
</div>
<div id="float">
<div class="float_content_head">
I was sending javascript to display
</div><div class="float_content">
d my issue was that I was sending javascript to display console messages. Even when I looked at the file in my browser (not through the application) it showed exactly as I expected it to (eg the extra tags weren't showing), but there were showing in the html/text output and were trying to be parsed. Hope this helps someone!I had a similar problem, and my issue was that I was sending tags we
</div>
</div>
Css
<style type="text/css">
#float{
background: #fff;
position:absolute;
right:30px;
top:20px;
width:250px;
padding:10px;
border-radius: 6px;
-webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.43);
-moz-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.43);
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.43);
}
.float_content_head{
padding:10px;
border-bottom: 1px solid #efefef;
text-align:center;
}
.float_content{
padding-top:10px;
}
.main{
width: 800px;
height: 800px;
margin: 0 auto;
border:1px solid #efefef;
padding: 10px;
background:#ccc;
}
.foot{
width: 100%;
height: 800px;
margin: 0 auto;
border:1px solid #efefef;
padding: 10px;
background:#096;
}
#box p{
margin:0;
padding:0;
}
</style>
JS
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
var starting_position = $('#float').offset();
var top_padding = 50;
var bottom_limit = $('.foot').offset();
var box_height = $('#float').height() + 20;
$(window).scroll(function(){
var top_window = $(window).scrollTop();
if (top_window > starting_position.top && top_window < bottom_limit.top - box_height){
$('#float').stop().animate({top: top_window - starting_position.top + top_padding}, 400);
} else if (top_window > bottom_limit.top - starting_position.top - box_height){
$('#float').stop().animate({top: bottom_limit.top - starting_position.top - box_height }, 400);
} else { $('#float').stop().animate({top: 10 }, 400);
}
});
});
</script>
答案 6 :(得分:0)
听起来像this is what you're after(原谅我的身份证):
$(document).ready(function() {
// Get the inital position of the menu
var initialPos = $('#mainnav').offset().top;
//Bind scrolling or resizing
$(window).bind('scroll resize', function() {
// Get the distance from the top of the page to the top of the footer
var footerTop = $('#footer').length > 0 ? $('#footer').offset().top : $('#footer').offset().top;
// Get the distance from the top of the page to the bottom of the menu
var navBottom = $(window).scrollTop() + $('#mainnav').height() + 22;
// If the user scrolls further than the height of the header (this method allows for resizing with a max-width layout)
if ($(window).scrollTop() > initialPos) {
$('#mainnav').css({
'position': 'fixed',
// move the menu based on how far the user has scrolled, and if it exceed the height of the footer
'top': (footerTop - navBottom > 0 ? 0 : footerTop - navBottom) + 'px',
'left': ($('#wrapper02').offset().left - $(window).scrollLeft()) + 'px'
});
} else {
$('#mainnav').css({
'position': 'static'
});
}
});
});
答案 7 :(得分:0)
<style>
#wrap {
width:100%;
height:1000px;
}
#sidebar {
width:100px;
height:100px;
float:left;
background-color:black;
color:white;
vertical-align:middle;
text-align:center;
}
</style>
<script>
var offset = $("#sidebar").offset();
var topPadding = 15;
$(window).scroll(function () {
if ($(window).scrollTop() > offset.top) {
$("#sidebar").stop().animate({
marginTop: $(window).scrollTop() - offset.top + topPadding
});
} else {
$("#sidebar").stop().animate({
marginTop: 0
});
}
});
</script>
<div id='wrap'>
<div id="sidebar">Side Bar</div>
</div>
答案 8 :(得分:0)
一个选项是waypoints.js,但我认为你可以用一些简单的jQuery来做。航点可能适合您,可能不是......但它可以在这种情况下使用。所以这是一个选择。
Waypoints.js: http://imakewebthings.com/waypoints/