从页面底部固定侧边栏滚动290px?

J82*_*J82 11 javascript css wordpress jquery sidebar

我正在尝试创建一个类似于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>
Run Code Online (Sandbox Code Playgroud)

CSS

#sidebar {
  margin: 0;
  position: absolute;
  right: 0;
  width: 220px;
}
#sidebar.fixed {
  margin-left: 720px;
  position:fixed;
  right: auto;
  top: 173px;
}
Run Code Online (Sandbox Code Playgroud)

如果固定侧边栏在触及底部附近的某个点时向上滚动,如何才能使其向上滚动?


编辑#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');
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

以下是所请求的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>
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 0

正如我在评论中所说,这可能会被关闭,因为我现在看不到 html 的结构。但这样的事情应该有效。我们得到 的高度scrollbarcontainer+标题的高度),以及用户或 的可视区域的高度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');
    }
});
Run Code Online (Sandbox Code Playgroud)

CSS:

#sidebar.bottom {
    bottom: 0;
}
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,请告诉我,并更新您的问题以获取 html,以便可以更满足您的需求。此外,您还必须处理用户向后滚动页面的情况,这目前还没有考虑到,但添加起来并不困难。