在页脚停止固定位置

IT技术 javascript jquery css scroll fixed
2021-02-07 22:38:17

我正在寻找解决在页面页脚停止固定对象的流行问题的方法。

我基本上在屏幕的左下角有一个固定的“共享”框,我不希望它在页脚上滚动,所以我需要它10px在页脚上方停止

我在这里以及其他人都看过其他问题。我能找到的最接近/最简单的演示是http://jsfiddle.net/bryanjamesross/VtPcm/但我无法让它适应我的情况。

这是共享框的 html:

    <div id="social-float">
        <div class="sf-twitter">
            ...
        </div>

        <div class="sf-facebook">
            ...
        </div>

        <div class="sf-plusone">
            ...
        </div>
    </div>

...和 ​​CSS:

#social-float{
position: fixed;
bottom: 10px;
left: 10px;
width: 55px;
padding: 10px 5px;
text-align: center;
background-color: #fff;
border: 5px solid #ccd0d5;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
display: none;
}

页脚是#footer,它没有固定的高度,如果这有什么不同的话。

如果有人可以帮助我为此创建一个简单的 jQuery 解决方案,我将不胜感激!

6个回答

现场演示

首先,每次滚动页面时检查其偏移量

$(document).scroll(function() {
    checkOffset();
});

如果它在页脚之前低于 10 像素,并使其位置绝对。

function checkOffset() {
    if($('#social-float').offset().top + $('#social-float').height() 
                                           >= $('#footer').offset().top - 10)
        $('#social-float').css('position', 'absolute');
    if($(document).scrollTop() + window.innerHeight < $('#footer').offset().top)
        $('#social-float').css('position', 'fixed'); // restore when you scroll up
}

请注意,它#social-float的父节点应该是页脚的兄弟节点

<div class="social-float-parent">
    <div id="social-float">
        something...
    </div>
</div>
<div id="footer">
</div>

祝你好运 :)

仍然闪烁:(这是正在发生的事情的截屏,如果有帮助的话:youtu.be/aNnTARjYPOc
2021-03-21 22:38:17
哦,抱歉,这是因为位置样式自修复以来一直处于切换状态。尝试使用 '>=' 更改运算符 '>'
2021-03-27 22:38:17
@ user984008 如果您在像我的小提琴一样更改代码后遇到同样的问题,请让我展示您的标记和 css。然后我想我可以修复这个错误。
2021-03-27 22:38:17
感谢您的回复。现在,当它滚动到页脚时,该框只会闪烁。我需要在 CSS 中更改某些内容吗?
2021-04-10 22:38:17
似乎您的浮动 div 的父级包含页脚...我为您制作了 jsfiddle 并检查了我的答案。它粘得很好,但当我向上滚动时它没有恢复。所以我添加了一些代码来解决它。这是小提琴:jsfiddle.net/Kkv7X,我将再次编辑我的答案:)
2021-04-10 22:38:17

我刚刚在我正在开发的网站上解决了这个问题,并认为我会分享它,希望它可以帮助某人。

我的解决方案需要从页脚到页面顶部的距离 - 如果用户滚动得比这更远,它会将侧边栏拉回负边距。

$(window).scroll(() => { 
  // Distance from top of document to top of footer.
  topOfFooter = $('#footer').position().top;
  // Distance user has scrolled from top, adjusted to take in height of sidebar (570 pixels inc. padding).
  scrollDistanceFromTopOfDoc = $(document).scrollTop() + 570;
  // Difference between the two.
  scrollDistanceFromTopOfFooter = scrollDistanceFromTopOfDoc - topOfFooter;

  // If user has scrolled further than footer,
  // pull sidebar up using a negative margin.
  if (scrollDistanceFromTopOfDoc > topOfFooter) {
    $('#cart').css('margin-top',  0 - scrollDistanceFromTopOfFooter);
  } else  {
    $('#cart').css('margin-top', 0);
  }
});
精彩的回答。当我向下滚动时,它对我的​​滚动间谍有帮助,它与页脚重叠。非常感谢先生..
2021-04-03 22:38:17
很棒的答案!真的很容易做(之前的JS解决方案在你不知道的时候有点吓人 ><" )。非常感谢!
2021-04-05 22:38:17
这非常有效。最佳答案是不行,因为我的侧边栏父级不是页脚 div 的兄弟姐妹。这个答案对 div 的堆栈顺序不那么挑剔。
2021-04-11 22:38:17
完美运行。
2021-04-13 22:38:17

这是@Sang 解决方案,但没有 Jquery。

var socialFloat = document.querySelector('#social-float');
var footer = document.querySelector('#footer');

function checkOffset() {
  function getRectTop(el){
    var rect = el.getBoundingClientRect();
    return rect.top;
  }
  
  if((getRectTop(socialFloat) + document.body.scrollTop) + socialFloat.offsetHeight >= (getRectTop(footer) + document.body.scrollTop) - 10)
    socialFloat.style.position = 'absolute';
  if(document.body.scrollTop + window.innerHeight < (getRectTop(footer) + document.body.scrollTop))
    socialFloat.style.position = 'fixed'; // restore when you scroll up
  
  socialFloat.innerHTML = document.body.scrollTop + window.innerHeight;
}

document.addEventListener("scroll", function(){
  checkOffset();
});
div.social-float-parent { width: 100%; height: 1000px; background: #f8f8f8; position: relative; }
div#social-float { width: 200px; position: fixed; bottom: 10px; background: #777; }
div#footer { width: 100%; height: 200px; background: #eee; }
<div class="social-float-parent">
    <div id="social-float">
        float...
    </div>
</div>
<div id="footer">
</div>

我最近遇到了同样的问题,也在此处发布了我的解决方案: 使用位置时防止元素显示在页脚顶部:固定

您可以利用positionjQuery 的元素属性实现解决方案,在默认值 ( staticfor divs)fixedabsolute. 您还需要一个用于固定元素的容器元素。最后,为了防止固定元素越过footer,这个容器元素不能是footer的父元素。

javascript 部分涉及计算固定元素与文档顶部之间的像素距离,并将其与滚动条相对于窗口对象的当前垂直位置(即上方隐藏在可见区域的像素数)进行比较页面)每次用户滚动页面。当向下滚动时,固定元素即将消失在上方时,我们将其位置更改为固定并粘在页面顶部。

当我们滚动到底部时,这会导致固定元素越过页脚,尤其是在浏览器窗口很小的情况下。因此,我们将计算页脚距文档顶部的像素距离,并将其与固定元素的高度加上滚动条的垂直位置进行比较:当固定元素即将越过页脚时,我们将将其位置更改为绝对位置并停留在底部,就在页脚上方。

这是一个通用示例。

HTML 结构:

<div id="content">
    <div id="leftcolumn">
        <div class="fixed-element">
            This is fixed 
        </div>
    </div>
    <div id="rightcolumn">Main content here</div>
    <div id="footer"> The footer </div>
</div>  

CSS:

#leftcolumn {
    position: relative;
}
.fixed-element {
    width: 180px;
}
.fixed-element.fixed {
    position: fixed;
    top: 20px;
}
.fixed-element.bottom {
    position: absolute;
    bottom: 356px; /* Height of the footer element, plus some extra pixels if needed */
}

JS:

// Position of fixed element from top of the document
var fixedElementOffset = $('.fixed-element').offset().top;
// Position of footer element from top of the document.
// You can add extra distance from the bottom if needed,
// must match with the bottom property in CSS
var footerOffset = $('#footer').offset().top - 36;

var fixedElementHeight = $('.fixed-element').height(); 

// Check every time the user scrolls
$(window).scroll(function (event) {

    // Y position of the vertical scrollbar
    var y = $(this).scrollTop();

    if ( y >= fixedElementOffset && ( y + fixedElementHeight ) < footerOffset ) {
        $('.fixed-element').addClass('fixed');
        $('.fixed-element').removeClass('bottom');          
    }
    else if ( y >= fixedElementOffset && ( y + fixedElementHeight ) >= footerOffset ) {
        $('.fixed-element').removeClass('fixed');           
        $('.fixed-element').addClass('bottom');
    }
    else {
        $('.fixed-element').removeClass('fixed bottom');
    }

 });

这对我有用-

HTML -

<div id="sideNote" class="col-sm-3" style="float:right;">

</div> 
<div class="footer-wrap">
        <div id="footer-div">
        </div>      
</div>

CSS -

#sideNote{right:0; margin-top:10px; position:fixed; bottom:0; margin-bottom:5px;}

#footer-div{margin:0 auto; text-align:center; min-height:300px; margin-top:100px; padding:100px 50px;}

jQuery -

function isVisible(elment) {
    var vpH = $(window).height(), // Viewport Height
        st = $(window).scrollTop(), // Scroll Top
        y = $(elment).offset().top;

    return y <= (vpH + st);
}

function setSideNotePos(){
    $(window).scroll(function() {
        if (isVisible($('.footer-wrap'))) {
            $('#sideNote').css('position','absolute');
            $('#sideNote').css('top',$('.footer-wrap').offset().top - $('#sideNote').outerHeight() - 100);
        } else {
            $('#sideNote').css('position','fixed');
            $('#sideNote').css('top','auto');
        }
    });
}

现在像这样调用这个函数 -

$(document).ready(function() {
    setSideNotePos();
});

PS - Jquery 函数是从关于 stackoverflow 的另一个类似问题的答案中复制的,但它对我来说并不完全有效。因此,我将其修改为这些功能,如下所示。我认为你的 div 的位置等属性将取决于 div 的结构,他们的父母和兄弟姐妹是谁。

当 sideNote 和 footer-wraps 都是直接兄弟时,上述函数有效。