Как зафиксировать блок или меню на сайте
Как сделать на сайте фиксированное плавающее меню или блок.
Существует множество решений. Да и написать можно самому, если разбираешься в JavaScript и jQuery.
Фиксированное верхнее меню на сайте
Наверно, самое изящное и простое решение на jQuery. Код для примера:
$(function(){ $(window).scroll(function() { var top = $(document).scrollTop(); if (top < 100) $(".floating").css({top: '0', position: 'relative'}); else $(".floating").css({top: '10px', position: 'fixed'}); }); });
Этот код нужно вставить в отдельный js-файл или прямо в разметку, обрамив в тег <script>код</script>.
Разберём, что здесь такое. Итак функция $(window).scroll (function () {}); мониторит скроллирование окна. Переменной top присваивается значение отступа прокрутки сверху $(document).scrollTop ();. Далее проверяется, если значение top меньше 100 пикселов, то элементу с классом .floating присваиваются CSS-стили: относительное позиционирование и отступ сверху — 0 пикселов. Если при прокрутке страницы значение top больше или равно 100 пикселам, то элементу .floating присваиваются стили: фиксированная позиция и отступ сверху — 10 пикселов.
Теперь при прокрутке страницы меню всегда будет сверху.
Фиксированное меню в сайдбаре WordPress
Для WordPress существует интересный плагин
Если Вы хотите сделать именно плавающее меню на WordPress, то смело используйте этот плагин.
Фиксированный блок/меню в сайдбаре сайта на jQuery
Если Вы хотите сделать не только плавающее меню, но и блок с любым содержанием фиксированным, то для этого Вам потребуется немного модифицировать тот код, который приведён выше.
$(document).ready(function(){ var br = $.browser; $(window).scroll(function() { var top = $(document).scrollTop(); if (top < 61) { $("#sidebar").css({top: '0', position: 'relative', marginLeft: '25px'}); } else if ((!br.msie) || ((br.msie) && (br.version > 7))) { $("#sidebar").css({top: '22px', position: 'fixed', marginLeft: '535px'}); } else if ((br.msie) && (br.version <= 7)) { $("#sidebar").css({top: '22px', position: 'fixed', marginLeft: '25px'}); } }); });
Этот код точно такой же, но добавлен стиль margin-left. Это сделано для того, чтобы фиксированный элемент поставить на то место, на котором он должен находится. Дополнительно в данном примере также осуществлена проверка для браузера Internet Explorer 7, т.к. он не корректно обрабатывает значение position: fixed;.
Не забывайте подключать библиотеку jQuery!
Кстати, о библиотеке... Начиная с версии 1.9, jQuery не поддерживает функцию $.browser. Поэтому, чтобы использовать эту конструкцию, можно отдельным файлом подключить эту функцию:
(function() { var matched, browser; // Использовать jQuery.browser не одобряется. // Подробнее: http://api.jquery.com/jQuery.browser // jQuery.uaMatch поддерживается для совместимости jQuery.uaMatch = function( ua ) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; }; matched = jQuery.uaMatch( navigator.userAgent ); browser = {}; if ( matched.browser ) { browser[ matched.browser ] = true; browser.version = matched.version; } // Chrome is Webkit, but Webkit is also Safari. if ( browser.chrome ) { browser.webkit = true; } else if ( browser.webkit ) { browser.safari = true; } jQuery.browser = browser; jQuery.sub = function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }; })();
Фиксированный блок в сайдбаре WordPress
Ещё одна альтернатива, но гораздо более эффективная:
Имеет много настроек, но, в то же время, достаточно прост в использовании.
Первым делом подключаем jQuery и сам плагин:
<!-- jQuery -->
<script type="text/javascript" src="jquery.js"></script>
<!-- hcSticky script -->
<script type="text/javascript" src="jquery.hcsticky.js"></script>
Затем для элемента, который должен быть плавающим, вызываем метод:
$('#sidebar').hcSticky();
Всё. Теперь блок будет плавающим.
Этот плагин очень полезен особенно в том случае, если Вы хотите зафиксировать высокий блок. Но при прокрутке он не должен вылезать за дозволенные пределы, например наползать на футтер.
Если использовать варианты, которые были описаны выше, то блоки/меню будут наползать на низ сайт, особенно, когда последний имеет большую высоту.
В плагине hcsticky предусмотрена возможность, так сказать, останавливать плавающий блок на определённом расстоянии от низа сайта. Пример:
$(document).ready(function() { $('#sidebar').hcSticky({ top: 25, bottomEnd: 155, noContainer: true }); });
Где:
- top — отступ от верха окна браузера во время прокрутке
- bottomEnd — отступ от нижней границы сайта, когда сайт прокручен до самого низа
- noContainer — при значении true элемент позиционируется относительно документа
Created/Updated: 25.05.2018