使固定元素在相对父级的底部停止滚动

时间:2015-11-02 12:34:21

标签: css scroll parent fixed relative

我有一个简单的例子:

<div id="main">
    <div id="wrap">
        <div id="fixed"></div>
    </div>
</div>

风格:

#main {
    display:inline-block;
    position:relative;
    float:left;
    width:100%;
    height:2000px;
    background-color:#000;
}


#wrap {
    display:inline-block;
    float:left;
    height:200px;
    width:100%;
    background-color:#f00;
}

#fixed {
    height:50px;
    position:fixed;
    left:0px;
    background-color:#ccc;
    top:0px;
    width:100%;
    display:inline-block;
    float:left;
}

当它到达#wrap的底部时,如何使用top来固定停止滚动? (如果可能,不使用javascript)

现在它一直位于屏幕顶部。

示例: http://jsfiddle.net/fo2pogku/1/(更新)

3 个答案:

答案 0 :(得分:3)

你需要jquery。我担心你不能只用css做到这一点。

你可以添加这个css:

.relative {
    position:relative;
}

并在使用:

滚动换行高度(200px)时将该类添加到“已修复”
$(window).scroll(function () {
            if ($(window).scrollTop() > 200) {
                $(".fixed").addClass("relative");
            } else {
                $(".fixed").removeClass("relative");
            }

        });

<强> JSFIDDLE

答案 1 :(得分:1)

如果没有JS,你就无法做到这一点。一种可能的解决方案是在页面滚动上绑定事件。

只要页面滚动到#wrap的底部,#fixed div就会变为绝对位置(而非固定位置)

$(window).scroll( function() {
    var wrapBottom = $('#wrap').position().top+$('#wrap').outerHeight(true),
        scrollPos = $(window).scrollTop();
    if( scrollPos > wrapBottom ) {
        $('#fixed').css( {'position':'absolute','top':wrapBottom+'px'});
    }
    else {
        $('#fixed').css( {'position':'fixed','top':'0px'});        
    } 
});

UPDATED FIDDLE

答案 2 :(得分:1)

在约会时间与父级平滑滚动:

$(window).on('scroll', function (e) {
    var fixed = $('#fixed');
    
    // Class identifier for scrolling with the parent
    var scrollClass = 'not-so-fixed';
    
    // get bottom position of #wrap
    var posBottom = fixed.parent().position().top + fixed.parent().outerHeight()- fixed.outerHeight();
    
    // Check scroll position
    if ($(this).scrollTop() > posBottom)
       fixed.addClass(scrollClass);
    else
     	fixed.removeClass(scrollClass);
});
body, html {margin: 0}
#main {
    display:inline-block;
    position:relative;
    float:left;
    width:100%;
    height:2000px;
    background-color:#000;
}


#wrap {
    display:inline-block;
    float:left;
    height:200px;
    width:100%;
    background-color:#f00;
    position: relative;
}

#fixed {
    height:50px;
    position:fixed;
    left:0px;
    background-color:#ccc;
    top:0px;
    width:100%;
    display:inline-block;
    float:left;
}

#fixed.not-so-fixed {
    position: absolute;
    top: auto;
    bottom: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main">
    <div id="wrap">
        <div id="fixed"></div>
    </div>
</div>