Подтвердить что ты не робот

Остановить фиксированное положение нижнего колонтитула

Я ищу решение популярной проблемы остановки фиксированного объекта на нижнем колонтитуле страницы.

В левом нижнем углу экрана в основном есть фиксированный "общий" ящик, и я не хочу, чтобы он просматривал нижний колонтитул, поэтому мне нужно, чтобы он остановился около 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 для этого, я бы очень признателен!

4b9b3361

Ответ 1

Живая демонстрация

сначала, проверьте его смещение каждый раз, когда вы прокручиваете страницу

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

и сделать его положение абсолютным, если оно было опущено под 10px перед нижним колонтитулом.

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>

удачи:)

Ответ 2

Я только что решил эту проблему на сайте, над которым я работаю, и решил поделиться им в надежде, что это кому-нибудь поможет.

Мое решение берет расстояние от нижнего колонтитула до верхней части страницы - если пользователь прокрутил дальше, чем это, он поднимает боковую панель с отрицательным полем.

$(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);
  }
});

Ответ 3

Вот решение @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>

Ответ 4

Недавно я столкнулся с этой проблемой, разместил здесь мое решение: Предотвращение отображения элемента сверху нижнего колонтитула при использовании позиции: исправлено

Вы можете получить решение, используя свойство position элемента с jQuery, переключение между значением по умолчанию (static для divs), fixed и absolute. Вам также понадобится элемент контейнера для вашего фиксированного элемента. Наконец, чтобы предотвратить перемещение фиксированного элемента нижнего колонтитула, этот элемент контейнера не может быть родителем нижнего колонтитула.

Часть 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');
    }

 });

Ответ 5

Это сработало для меня -

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 будут зависеть от того, как структурированы divs, кто их родители и братья и сестры.

Вышеуказанная функция работает, когда обе стороны и нижние колонтитулы являются прямыми братьями и сестрами.

Ответ 6

Я пошел с модификацией ответа @user1097431:

function menuPosition(){
// distance from top of footer to top of document
var footertotop = ($('.footer').position().top);
// distance user has scrolled from top, adjusted to take in height of bar (42 pixels inc. padding)
var scrolltop = $(document).scrollTop() + window.innerHeight;
// difference between the two
var difference = scrolltop-footertotop;

// if user has scrolled further than footer,
// pull sidebar up using a negative margin
if (scrolltop > footertotop) {
    $('#categories-wrapper').css({
       'bottom' : difference
   });
}else{
    $('#categories-wrapper').css({
       'bottom' : 0
   });
 };
};

Ответ 7

$(window).scroll(() => {
    const footerToTop = $('.your-footer').position().top;
    const scrollTop = $(document).scrollTop() + $(window).height();
    const difference = scrollTop - footerToTop;
    const bottomValue = scrollTop > footerToTop ? difference : 0;
    $('.your-fixed-element').css('bottom', bottomValue);
});

Ответ 8

Теперь вы можете использовать

#myObject{
  position:sticky;
}

Надеюсь это поможет..

Ответ 9

Я внес некоторые изменения во второй по популярности ответ, поскольку обнаружил, что это работает лучше для меня. Изменения используют window.innerHeight, поскольку он более динамичен, чем добавление вашей собственной высоты для навигации (выше используется + 570). это позволяет коду динамически работать на мобильных устройствах, планшетах и компьютерах.

$(window).scroll(() => {
            //Distance from top fo document to top of footer
            topOfFooter = $('#footer').position().top;
             // Distance user has scrolled from top + windows inner height
             scrollDistanceFromTopOfDoc = $(document).scrollTop() + window.innerHeight;
             // Difference between the two.
             scrollDistanceFromTopOfFooter = scrollDistanceFromTopOfDoc - topOfFooter; 
            // If user has scrolled further than footer,
              if (scrollDistanceFromTopOfDoc > topOfFooter) {
                // add margin-bottom so button stays above footer.
                $('#floating-button').css('margin-bottom',  0 + scrollDistanceFromTopOfFooter);
              } else  {
                // remove margin-bottom so button goes back to the bottom of the page
                $('#floating-button').css('margin-bottom', 0);
              }
            });

Ответ 10

Чистый раствор CSS

<div id="outer-container">
    <div id="scrollable">
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam in vulputate turpis. Curabitur a consectetur libero. Nulla ac velit nibh, ac lacinia nulla. In sed urna sit amet mauris vulputate viverra et et eros. Pellentesque laoreet est et neque euismod a bibendum velit laoreet. Nam gravida lectus nec purus porttitor porta. Vivamus tempor tempus auctor. Nam quis porttitor ligula. Vestibulum rutrum fermentum ligula eget luctus. Sed convallis iaculis lorem non adipiscing. Sed in egestas lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc dictum, lacus quis venenatis ultricies, turpis lorem bibendum dui, quis bibendum lacus ante commodo urna. Fusce ut sem mi, nec molestie tortor. Mauris eu leo diam. Nullam adipiscing, tortor eleifend pellentesque gravida, erat tellus vulputate orci, quis accumsan orci ipsum sed justo. Proin massa massa, pellentesque non tristique non, tristique vel dui. Vestibulum at metus at neque malesuada porta et vitae lectus.
    </div>
    <button id="social-float">The button</button>
</div>
<div>
Footer
</div>
</div>

И здесь css

#outer-container {
    position: relative;
}

#scrollable {
    height: 100px;
    overflow-y: auto;
}

#social-float {
    position: absolute;
    bottom: 0px;
}