Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Плавающий блок, замирающий над футером (https://javascript.ru/forum/dom-window/43757-plavayushhijj-blok-zamirayushhijj-nad-futerom.html)

Navaho 19.12.2013 12:40

Плавающий блок, замирающий над футером
 
Привет! Помогите разобраться. :)
Необходимо подключить скрипт для правого сайдбара как тут: http://sticky01.blogspot.ru/2013/09/4.html.

вот мой сss:

Код:


.sidebar{
    width:245px;
    margin-top:15px;
    margin-left:700px;
    height:1230px;
    padding:13px;
    font-size:14px;
    font-style:  italic;
    font-family: 'Arial';
    border: 2px solid #bab89a;
    position: fixed; 
    }
.sidebar .content .text{
    position: absolute;
}

вот JS, который я нашла тут: http://shpargalkablog.ru/2013/09/scroll-block.html


<script>
function offsetPosition(e) {
  var offsetTop = 0;
  do {offsetTop  += e.offsetTop;} while (e = e.offsetParent);
  return offsetTop;
}
var aside = document.querySelector('aside'),
    OP = offsetPosition(aside);

window.onscroll = function() { 

  // window.pageYOffset - прокрутка;
  // document.documentElement.scrollHeight - высота всего документа;
  // aside.offsetHeight - высота элемента
  if (window.pageYOffset > document.documentElement.scrollHeight - 9720 - aside.offsetHeight) {
    aside.className = 'button_bottom';
    aside.style.top = (document.documentElement.scrollHeight - 1230 - aside.offsetHeight - OP) + 'px';
  } else {
    aside.style.top = '0';
    aside.className = (OP < window.pageYOffset ? 'sidebar' : '');
  }

}
</script>


В html блок div class="sidebar" c контентом (текст и картинки)

Скопированный скрипт не работает. что необходимо изменить?

Navaho 19.12.2013 13:16

а что необходимо изменить в коде?

Navaho 19.12.2013 13:28

тогда почему у меня не работает?

Navaho 19.12.2013 13:32

мне надо надо ПОДКЛЮЧИТЬ скрипт К МОЕМУ КОДУ. а сам по-себе он работает, тут и не поспоришь)

Navaho 19.12.2013 13:33

есть еще (другие) знатоки? :)

рони 19.12.2013 13:57

:write: вариант фиксации блока перед футером ...
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>demo</title>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
  <style type='text/css'>
  body{padding:0px;margin:0px}
  *{margin:0}
  html,body{height:1000px}
  .wrapper{min-height:100%;height: auto !important;height:100%;margin:0 auto -170px}
  .footer,.push{height:270px}
  .footer{background:#F00}
  .sidebar{
    width:245px;
    margin-top:15px;
    margin-left:300px;
    height:500px;
    padding:13px;
    font-size:14px;
    font-style:  italic;
    font-family: 'Arial';
    border: 2px solid #bab89a;
    position: fixed;
    background-color: #FF0000;
     }
.sidebar .content .text{
    position: absolute;
}
  </style>
<script type='text/javascript'>
$(function () {
    var a = $(".sidebar"),
        c = a.offset(),
        d = a.outerHeight(!0),
        e = $(".footer").offset();
    $(document).scroll(function () {
        var b = $(this).scrollTop(),
            b = e.top - (b + d + c.top);
        0 < b ? a.css({
            background: "red",
            top: c.top
        }) : a.css({
            background: "green",
            top: c.top + b
        })
    })
});
</script>
</head>
<body>
<div class="sidebar"></div>
<div class="wrapper">
<p>Your website content here.</p>
<div class="push"></div>
</div>
<div class="footer">
  <p>Copyright (c) 2013</p>
</div>
</body>
</html>

Navaho 19.12.2013 14:10

рони, спасибо за ваш код) а с моим вариантом кода, можно что-то сделать? и без jquery

рони 19.12.2013 14:35

Navaho,
сделайте макет страницы в песочнице http://learn.javascript.ru/play или тут, так быстрее кто-то откликнется, сейчас можно только гадать по вашим фрагментам что и почему у вас неработает

рони 19.12.2013 15:35

Navaho,
Вариант фиксации блока без jquery на фреймворке Vanilla JS ... :dance:
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>demo</title>
  <style type='text/css'>
  body{padding:0px;margin:0px}
  *{margin:0}
  html,body{height:1000px}
  .wrapper{min-height:100%;height: auto !important;height:100%;margin:0 auto -170px}
  .footer,.push{height:270px}
  .footer{background:#F00}
  .sidebar{
    width:245px;
    margin-top:15px;
    margin-left:700px;
    height:500px;
    padding:13px;
    font-size:14px;
    font-style:  italic;
    font-family: 'Arial';
    border: 2px solid #bab89a;
    position: fixed;
    background-color: #FF0000;
     }
.sidebar .content .text{
    position: absolute;
}
  </style>
<script>
function offset(a) {
    for (var b = 0; a;) b += parseInt(a.offsetTop), a = a.offsetParent;
    return b
}
window.onload = function () {
    var a = document.querySelector(".sidebar"),
        b = offset(a),
        d = a.offsetHeight + 15, //    margin-top
        e = offset(document.querySelector(".footer"));
    window.onscroll = function () {
        var c = window.pageYOffset || document.documentElement.scrollTop,
            c = e - (c + d + b);
        0 < c ? a.style.top = b + "px" : a.style.top = b + c + "px"
    }
};
</script>
</head>
<body>
<div class="sidebar"></div>
<div class="wrapper">
<p>Your website content here.</p>
<div class="push"></div>
</div>
<div class="footer">
  <p>Copyright (c) 2013</p>
</div>
</body>
</html>

рони 19.12.2013 16:02

Navaho,
и наконец фиксация блока на чистом js улучшенный вариант ... :write:
изменение стилей блока происходит только в момент соединения/разьединения блока с футером
<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>demo</title>
  <style type='text/css'>
  body{padding:0px;margin:0px}
  *{margin:0}
  html,body{height:1000px}
  .wrapper{min-height:100%;height: auto !important;height:100%;margin:0 auto -170px}
  .footer,.push{height:270px}
  .footer{background:#F00}
  .sidebar{
    width:245px;
    margin-top:15px;
    margin-left:400px;
    height:500px;
    padding:13px;
    font-size:14px;
    font-style:  italic;
    font-family: 'Arial';
    border: 2px solid #bab89a;
    position: fixed;
    background-color: #00FF7F;

     }
.sidebar .content .text{
    position: absolute;
}
  </style>
<script>
 function offset(a) {
     for (var b = 0; a;) b += parseInt(a.offsetTop), a = a.offsetParent;
     return b
 }
 var s = !0;
 window.onload = function () {
     var a = document.querySelector(".sidebar"),
         b = offset(a),
         f = window.getComputedStyle ? getComputedStyle(a, "") : a.currentStyle,
         d = a.offsetHeight + parseInt(f.marginTop) || 0,
         e = offset(document.querySelector(".footer"));
     window.onscroll = function () {
         var c = window.pageYOffset || document.documentElement.scrollTop,
             c = e - (c + d + b);
         s != 0 < c && ((s = 0 < c) ? (a.style.top = b + "px", a.style.position = "fixed") : (a.style.top = e - d + "px", a.style.position = "absolute"))
     }
 };
</script>
</head>
<body>
<div class="sidebar"></div>
<div class="wrapper">
<p>Your website content here.</p>
<div class="push"></div>
</div>
<div class="footer">
  <p>Copyright (c) 2013</p>
</div>
</body>
</html>

js-js 19.12.2013 22:58

Navaho,
скиньте вашу веб страницу с css в .zip файл и загрузите в файлообменник, я напишу вам код

Navaho 23.12.2013 07:48

рони, спасибо! сейчас буду пробовать

Navaho 23.12.2013 07:54

js-js, "в файлообменник" это куда? а можно по электронке?

Navaho 23.12.2013 08:11

рони,
нет, не получается, сайдбар только съехал немного вниз...
скрипты не поддаются моему понимаю)))

рони 23.12.2013 13:44

Navaho,
сделайте макет страницы хотябы с css

Navaho 23.12.2013 13:54

рони,
моя страница подобна этой: http://all-blogers.com/yanal_coffee-imbir/
и сайбар такой же.
Только у меня еще есть расстояние для хэдера, т.е. сайдбар расположен вверху с отступом. Таком образом, надо предусмотреть момент, чтобы сайдбар при прокрутке приклеивался к верху окна браузера. И еще необходима внутренняя прокрутка сайдбара без появления скролла...

рони 23.12.2013 14:02

Цитата:

Сообщение от Navaho
моя страница подобна этой

неувидел я там ничего похожего

Roman S 26.12.2013 20:35

рони - а как реализовать что бы sidebar сразу цеплялся к футеру или к нижнему краю окна, если футер ушел ниже окна?

рони 26.12.2013 20:41

Roman S,
задайте bottom: 0px; для .sidebar

Roman S 26.12.2013 20:50

Если не менять размер окна, нормально работает. Но если изменить, он сразу сыпится и не понимает где низ футера или окна.

рони 26.12.2013 21:11

Цитата:

Сообщение от Roman S
Если не менять размер окна

для таких случаев есть метод job

Roman S 26.12.2013 21:23

Слишком мелкий для метода job.

Здесь скорее вопрос вполучении координатов границы div в катором находится sidebar и нижней границы окна.

рони 26.12.2013 21:57

Roman S,
молодец придумай код

Roman S 26.12.2013 22:08

координаты обьекта у нас есть, вопрос как узнать координаты нижней границы окна?

рони 26.12.2013 22:20

Цитата:

Сообщение от Roman S
узнать координаты нижней границы окна?

скролинг + размеры видимой части http://learn.javascript.ru/metrics-window

рони 26.12.2013 22:31

Roman S,
Кнопка наверх чтобы она не наползала на футер

Roman S 26.12.2013 23:27

Вот этот вариант, то что нужно!

sergiocharm 21.11.2014 18:59

Остановка блока при скроллинге
 
У меня стоит скрипт плавающего блока, где то в инете скачал.
<script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
<script type="text/javascript">
	$(function() {
		var offset = $("#fixed").offset();
		var topPadding = 20;
		$(window).scroll(function() {
			if ($(window).scrollTop() > offset.top) {
				$("#fixed").stop().animate({marginTop: $(window).scrollTop() - offset.top + topPadding});
			}
			else {$("#fixed").stop().animate({marginTop: 0});};});
	});
</script>


Ребят, подскажите как остановить блок при прокрутке вниз. Сейчас скролит до бесконечности и футер невозможно увидеть. Сайт http://allremont59.ru

рони 22.11.2014 12:23

sergiocharm,
$(function() {
     var offset = $("#fixed").offset();
     var topPadding = 20,
         bottomPadding = 210; //высота над которой остоновится
     $(window).scroll(function() {
         if ($(window).scrollTop() > offset.top) {
             if ($(document).height() - bottomPadding > $(window).scrollTop() + $("#fixed").height()) $("#fixed").stop().animate({
                 marginTop: $(window).scrollTop() - offset.top + topPadding
             });
         } else {
             $("#fixed").stop().animate({
                 marginTop: 0
             });
         };
     });

 });

anmast 23.11.2014 05:28

Помогите мне прижать так же как в Ваших примерах. Не получается что то. Пожалуйста

рони 23.11.2014 06:12

anmast,
:blink:

sergiocharm 25.11.2014 22:56

рони,
при заужении браузера блок не останавливается и лезет до бесконечности. как в этом случае поступить?

рони 26.11.2014 10:31

sergiocharm,
:) ещё вариант
$(function() {
      var elem = $("#fixed"), h = elem.offset().top ;
	  $(window).scroll(function(){
      var top = $(this).scrollTop();
      elem.css( {'top': top> h ? 20 : '', 'position': top > h ?   'fixed' : ''})})
 });

sergiocharm 27.11.2014 17:55

Спасибо! Поступил проще, убрал при маленьком разрешении

Jeff 06.09.2015 14:14

Вот пример, как сделать плавающий блок ;)

рони 06.09.2015 15:21

Цитата:

Сообщение от Jeff
Вот пример, как сделать плавающий блок

тема Плавающий блок, замирающий над футером
:-?

BETEPAH 06.09.2015 17:07

Jeff,
и не очень хорошая реализация. Если после загрузки страницы изменится смещение до "плавающего" блока (подгрузится что-то выше него, отобразится картинка, изменится ориентация экрана...) блок будет фиксироваться в неправильном положении скролла.

sergiocharm 28.01.2016 09:32

Цитата:

Сообщение от рони (Сообщение 342321)
sergiocharm,
$(function() {
     var offset = $("#fixed").offset();
     var topPadding = 20,
         bottomPadding = 210; //высота над которой остоновится
     $(window).scroll(function() {
         if ($(window).scrollTop() > offset.top) {
             if ($(document).height() - bottomPadding > $(window).scrollTop() + $("#fixed").height()) $("#fixed").stop().animate({
                 marginTop: $(window).scrollTop() - offset.top + topPadding
             });
         } else {
             $("#fixed").stop().animate({
                 marginTop: 0
             });
         };
     });

 });

Подскажите как остановить блок если окно браузера сужается и блок становится под текстом и не может дотянуться до футера? http://www.allremont59.ru/building-h...nt-stena-fasad

рони 28.01.2016 19:23

sergiocharm,
попробуйте так
$(function() {
    var offset = $("#fixed").offset();
    var topPadding = 20,
        bottomPadding = 210;
    $(window).scroll(function() {
        var max = $(document).height() - ($(window).height() - bottomPadding),
            scroll = $(window).scrollTop();
        if (scroll > offset.top && scroll < max) {
            if ($(document).height() - bottomPadding > scroll + $("#fixed").height()) $("#fixed").stop().animate({
                marginTop: scroll - offset.top + topPadding
            })
        } else $("#fixed").stop().animate({
            marginTop: 0
        })
    })
});

рони 29.01.2016 18:05

sergiocharm,
jQuery Plugin For Creating Sticky Elements While Scrolling


Часовой пояс GMT +3, время: 09:57.