Плавающий блок (или как его ещё называют двигающийся, фиксированный, прилипший) нужен на сайте для того, чтобы пользователь при прокрутке страницы видел один неподвижный элемент, в который чаще всего помещают рекламу (тизеры, баннеры или контекст).
Такая «плавающая» реклама заметно повышает число показов и переходов по ней, а соответственно и доход.
Рекламу Adsense помещать в фиксированный блок нельзя.
Увы, правила адсенса нам это запрещают. Тем не менее, многие владельцы сайтов игнорируют правила на свой страх и риск. Может быть, их за это даже не наказывают, но я бы не советовал рисковать.
Я размещаю в такие блоки РСЯ, свои тизеры/баннеры, а иногда вместо рекламы вывожу там похожие записи или какую-то полезную для посетителя информацию.
Давайте расскажу, какими способами можно сделать плавающий блок на своём сайте.
Задача: сделать последний блок в боковой колонке (сайдбаре) – плавающим. Причём, чтобы он прилипал только в тот момент, когда пользователь доходит до него скроллингом, а не сразу при открытии страницы. Также блок должен «отлипать», доходя до футера (т.е. не перекрывать его).
Самый рабочий способ
Существует много вариантов реализации прилипающего блока, но не все они работают корректно. Скажу из личного опыта: один и тот же метод установки блока может сработать на одном сайте, а на другом появятся косяки.
Ниже пример плавающего блока, который сработал практически на всех сайтах, где я его устанавливал. Косяков не было. Движок тоже не важен (DLE, WordPress, LiveStreet и др.).
В желаемом месте боковой колонки вставляем такой HTML-код:
<div class="inner">
Здесь вставляем тот код, который должен двигаться.
</div>
</div>
Далее создаем файл fixads.js и прописываем в него:
var sb_m = 20; /* отступ сверху и снизу */
var mb = 300; /* высота подвала с запасом */
var st = $(window).scrollTop();
var sb = $(".sticky-block");
var sbi = $(".sticky-block .inner");
var sb_ot = sb.offset().top;
var sbi_ot = sbi.offset().top;
var sb_h = sb.height();
if(sb_h + $(document).scrollTop() + sb_m + mb < $(document).height()) {
if(st > sb_ot) {
var h = Math.round(st - sb_ot) + sb_m;
sb.css({"paddingTop" : h});
}
else {
sb.css({"paddingTop" : 0});
}
}
});
В этом коде можно задать отступы сверху, снизу, а также высоту вашего подвала, т.е. ту высоту, на которой блоку нужно остановиться.
Теперь подкключаем JS. Для этого прописываем в секции HEAD:
Готово!
Самый простой способ (для WordPress)
Также безотказный метод, но при помощи установки плагина Q2W3 Fixed Widget (Sticky Widget). Работает без косяков.
Достоинства:
- не нужно разбираться/понимать HTML;
- простота и скорость установки.
Недостатки:
- лишняя нагрузка на сервер;
- не гибкий. Плавающим становится весь виджет (включая название и его оформление). Допустим, сделать этот блок иным цветом или размером будет сложно.
Как пользоваться:
- Скачиваем плагин.
- Устанавливаем.
- Активируем.
- Заходим в админке во вкладку: Дизайн -> Виджеты. Открываем тот виджет, который хотим сделать фиксированным.
- Ставим галочку возле «Зафиксировать виджет» и нажимаем кнопку «Сохранить».
Пример:
Готово!
Другие способы реализации скользящих блоков
Они мне показались менее удобными и не такими понятными, как два метода выше. Но всё же о них расскажу.
Вариант #1 (без jQuery)
В сайдбар вставляем:
Здесь вставляем тот код, который должен двигаться.
</aside>
Прописываем стили в HTML (лучше добавить сразу в CSS):
.sticky {
position: fixed;
z-index: 101;
}
.stop {
position: relative;
z-index: 101;
}
</style>
Теперь на страницу добавляем сам скрипт (лучше вынести в отдельный файл, как в «Самом рабочем способе»):
(function(){
var a = document.querySelector('#aside1'), b = null, P = 0; // если ноль заменить на число, то блок будет прилипать до того, как верхний край окна браузера дойдёт до верхнего края элемента. Может быть отрицательным числом
window.addEventListener('scroll', Ascroll, false);
document.body.addEventListener('scroll', Ascroll, false);
function Ascroll() {
if (b == null) {
var Sa = getComputedStyle(a, ''), s = '';
for (var i = 0; i < Sa.length; i++) {
if (Sa[i].indexOf('box-sizing') == 0 || Sa[i].indexOf('overflow') == 0 || Sa[i].indexOf('width') == 0 || Sa[i].indexOf('padding') == 0 || Sa[i].indexOf('border') == 0 || Sa[i].indexOf('outline') == 0 || Sa[i].indexOf('box-shadow') == 0 || Sa[i].indexOf('background') == 0) {
s += Sa[i] + ': ' +Sa.getPropertyValue(Sa[i]) + '; '
}
}
a.innerHTML = '<div style="'+s+'">'+a.innerHTML+'</div>';
b = a.children[0];
a.style.height = b.getBoundingClientRect().height + 'px';
a.style.padding = '0';
a.style.border = '0';
}
var Ra = a.getBoundingClientRect(),
R = Math.round(Ra.top + b.getBoundingClientRect().height - document.querySelector('footer').getBoundingClientRect().top + 0); // селектор блока, при достижении верхнего края которого нужно открепить прилипающий элемент; Math.round() только для IE; если ноль заменить на число, то блок будет прилипать до того, как нижний край элемента дойдёт до футера
if ((Ra.top - P) <= 0) {
if ((Ra.top - P) <= R) {
b.className = 'stop';
b.style.top = - R +'px';
} else {
b.className = 'sticky';
b.style.top = P + 'px';
}
} else {
b.className = '';
b.style.top = '';
}
}
})()
</script>
Готово!
Вариант #2 (с jQuery)
Прописываем HTML-код в боковой колонке:
Здесь вставляем тот код, который должен двигаться.
</div>
Подключаем скрипт. Перед </body> вставляем:
(function($) {
$.lockfixed("#sidebar",{offset: {top: 10, bottom: 10}});
})(jQuery);
</script>
Создаём файл jquery.lockfixed.js и в него прописываем:
a,function(k){if(!h||!document.activeElement||"INPUT"!==document.activeElement.nodeName){var d=0,d=a.outerHeight();k=a.outerWidth();var m=e(document).height()-b.offset.bottom,f=e(window).scrollTop();"fixed"!=a.css("position")&&(g=a.offset().top,c=parseInt(a.css("marginTop"),10),l=a.css("top"));f>=g-(c?c:0)-b.offset.top?(d=m<f+d+c+b.offset.top?f+d+c+b.offset.top-m:0,h?a.css({marginTop:parseInt((c?c:0)+(f-g-d)+2*b.offset.top,10)+"px"}):a.css({position:"fixed",top:b.offset.top-d+"px",width:k+"px"})):
a.css({position:n,top:l,width:k+"px",marginTop:(c?c:0)+"px"})}})}}})})(jQuery);
Подключаем скрипт в секцию <head>, добавляя вот такую строчку:
Если не подключена библиотека jQuery, то подключить и ее можно добавив ещё одну строчку в <head>:
Готово!
Важно! Если ваш шаблон адаптивный, то сразу проверяйте как скользящий блок работает в мобильной версии и при других размерах экрана (иногда блоки могут наезжать на основной текст или вообще его перекрывать).
Пример плавающего блока вы можете наблюдать у меня на блоге:
Вот, собственно, и все способы, которые я использую на своих сайтах. Если вы знаете еще какие-то поделитесь в комментариях.
Спасибо, как раз недавно думал об этом, хочу добавить в скользящий блок полезные ссылки для пользователей)
Не пошел первый способ, html код нужно в виджет в сайдбаре вставлять? Все выводится, но не двигается
Разобрался, конфликт с темой, есть собственный скролл))))
Вообще способ с плагином попроще, он не нагружает сайт, плюс спокойно можно делать отступы.
Жаль этого поста не было пару месяцев назад, когда я несколько дней мудохался с 1 сайтом, где хотел сделать такой блок, в инете кучу всего перелопатил и ничего «из коробки» не подходило, пришлось шаманить с js+css методом тыка))
Полезный пост! У меня стоит плагин для ВП с примера — он как раз перекрывает футер.
Там в настройках плагина можно выставить высоту, чтобы футер не перекрывался!
Статья про кодинг. очень неожиданно
До первого стука можно))
Ну дык, если там не адсенс, то что в таком случае надо нарушать для стука? Для своих баннеров/тизеров то, что надо.
Один минус — устанавливать можно только для основной версии, а не для мобильной
А зачем он в мобильной версии? Там же места мало итак.
Девырь, твою дивизию! Куда исчез? Что с блогом? Каждый день захожу в надежде на новый пост. Как жизнь? Жив, здоров? Где находишься территориально, в Украине?
Благодарочка за скрипт. Как раз на днях мудохался с реализацией, так с jQuery был конфликт версий с тем что уже есть на сайте, а простым js вариант очень удобный. Так что спасибо за труд
Тебе не надоело уже? Сидишь какие-то картинки смотришь, сайты какие-то. вроде взрослый мужик. Народ, вы чего? Пора взрослеть уже, устройтесь на нормальную работу — шофёром или на завод.
Страну надо поднимать, а не сидя дома в игрульки играть. Стыдно должно быть.
Не надоело. Ни стыда, ни совести — ничего лишнего
Вот этот блок лучше вынести за пределы onScroll, потому что значения будут вычисляться при каждом движении скроллом, и это может привести к эффекту мерцания при прокручивании страницы, да и браузер может подвиснуть
Скину ссылку, как я делал http://sheensay.ru/fixed-scroll
Спасибо за дополнения
Плагином конечно намного проще, но кодом намного лучше. Когда надумаю себе делать такой блок, то буду знать где искать информацию. Спасибо.
У меня на сайтах зафиксирован таким образом блок Adsense. Сейчас перечитал актуальные правила, ничего про это не нашел. Выходит разрешили все таки?? Если не запрещено, значит разрешено)
http://searchengines.guru/showpost.php?p=12601539&postcount=16
Ещё есть желание рисковать?
но это было более двух лет назад — 04.02.2014.
могли же правила за два года поменяться. я лично ничего не нашел в правилах. может кто в правилах нашел запрет?
https://support.google.com/adsense/answer/1346295#Unnatural_attention_to_ads
Спасибо очень полезная и хорошая статья
А как его прилепить к низу а не к верху? чтоб дойдя до низа он крепился в низ браузера.
Сколько не общался с людьми/заказчиками, сначала очень даже им нравится идея про блоки. А после реализации через пару недель просят убрать, ибо злит эта плавающая назойливая бяка. Меня, кстати , тоже…
А я привык к ним уже — совсем не раздражает.
Как раз искал решение для установки баннера на сайт под СРА, спасибо за информацию.
Но подобные блоки тоже стоит тестировать, сильно навязчивые будут отвлекать внимание от текста.
У способа «Самый рабочий способ» возникает эффект мерцания(дерганья) при прокручивании, попытался вынести переменные за пределы функции как выше советовал Sheens, но не хватило мозга — первый раз возился c js.
Установил вариант #2 (с jQuery), но у него тоже есть глючёк (не существенный впрочем) — если загрузить страницу, не прокручивая страницу вниз свернуть браузер в окно и затем уменьшить окно до маленького экрана (чтобы заблокировался показ блока для мобильных), потом разворачиваем окно браузера и «липкий» блок прилипает кверху перекрывая сайдбар и больше не отлипает.
Пытался адаптировать по себя способ предложенный Sheens, но при загрузки страниц липкий блок появлялся и прилипал раньше времени перекрывая сайдбар, а при обновлении страниц все начинало работать как надо, так и нашел причину и решил остановиться на варианте #2 (с jQuery).
Я последний раз на сайте тоже делал способом 2, и тоже есть такая проблема, как ты описал. Но вероятность того, что кто-то из посетителей будет проделывать подобные манипуляции — мала. Так что я решил оставить все так.
Спасибо, полезно )
А РСЯ разрешает такие блоки?
Да.
Интересная информация. Но такой блок может вызывать раздражение посетителей, тут надо очень осторожно действовать, чтобы не спугнуть
Чет не заработал не один из способов, пришлось плагин ставить.
А не подскажете как плагин называется, с помощью которого можно плавающие блоки реализовать? Заранее спасибо)
Все. нашел)
Сделал по варианту «Самый рабочий способ» — всё работает. Подскажите, как сделать, чтобы на мобильных устройствах плавающий блок не работал?
Нужно изменить значение свойства position на моб.устройствах.
В CSS это можно сделать примерно так:
#aside1 — нужно заменить на свое имя элемента.
Спасибо. Имя элемента по первому способу — это «sticky-block»?
Если по первому, то так:
Спасибо, буду пробовать!!!
Огромное Вам СПАСИБО! Двое суток искал подходящий скрипт, везде какой-нибудь косяк находился. Ваш поставил, настроил, запустил … без проблем!
Интересная вещь! Мне больше всего понравился первый вариант, будет стараться)))))
А мне иногда мешает плавающий блок, особенно, когда он очень яркий %)
Что за тупость со стороны администрации данного сайта, дать html который скопировать нельзя, а копируется в буфер только источник!
Решение: запретить использовать данному сайту в браузере использование js. может кому надо…
полезный скрипт, спасибо за информацию
А как сделать что бы на Похожие публикации не наезжало?
Сделал по 1 способу, но сильно трясется при скроле, как это исправить?