Bootstrap 3 - Affix
На этом уроке мы познакомимся с плагином Bootstrap affix и научимся его добавлять к элементам веб-страницы.
Предназначение плагина Affix
Плагин Bootstrap Affix предназначен для "прикрепления" элемента веб-страницы к краям окна браузера. "Прикреплённый" элемент при прокрутке веб-страницы будет оставаться в определённом месте и находиться в поле зрения пользователя. Плагин affix позволяет также выключать это "прикрепление", т.е. работать в режиме переключателя (т.е. выключать или включать прикрепление элемента к краям окна браузера). Реализуется этот принцип посредством изменения значения CSS свойства position
элемента веб-страницы из static
в fixed
.
Плагин affix очень часто применяют к социальным иконкам на сайте, которые при прокрутке веб-страницы всегда располагаются в определённом месте и доступны для просмотра пользователю.
Плагин affix можно использовать с помощью атрибутов Data или с помощью написания собственных сценариев на языке JavaScript . В том или другом случае вы должны предусмотреть CSS стили для позиционирования и настройки ширины вашего контента, к которому добавлен плагин affix.
Позиционирование Affix с помощью CSS
Плагин affix может переключаться между тремя классами, каждый из которых представляет определенное состояние: .affix
, .affix-top
, и .affix-bottom
.
Принцип работы плагина Affix:
- Изначально плагин добавляет класс
.affix-top
или.affix-bottom
, чтобы определить самое верхнее или самое нижнее положение элемента. На этом шаге CSS позиционирование элемента не требуется. - При прокрутке страницы элемент смещается вместе с текстом, но его смещение ограничено значением атрибута
data-offset-top-*
илиdata-offset-bottom-*
. После достижения этого ограничения плагин заменяет класс.affix-top
или.affix-bottom
на.affix
и устанавливает элементу CSS свойствоposition
со значениемfixed
(т.е. фиксированное позиционирование), которое "прикрепляет" элемент. - В этой точке необходимо соответствующее свойство CSS
top
илиbottom
, чтобы определить позицию элемента, к которому добавлен плагин Affix, в области просмотра веб-страницы.
Добавление Affix с помощью атрибутов Data
Плагин Affix можно добавить к любому элементу веб-страницы с помощью атрибута data-spy="affix"
. После этого с помощью атрибута data-offset-
установите величину смещения, которая определяет момент прикрепления элемента к верхнему или нижнему краю окна браузера.
<!-- Добавление Affix к элементу div с помощью атрибута data-spy="affix", и смещения с помощью атрибута data-offset-top --> <div data-spy="affix" data-offset-top="20"> ... </div>
Добавление Affix с помощью JavaScript
Вы также можете добавить плагин Affix к элементам, используя сценарий на языке JavaScript. Для этого Вам необходимо вызвать для элемента веб-страницы, используя её идентификатор или имя класса, метод Bootstrap affix()
.
<!-- Сценарий на языке JavaScript --> <script> // #myAffix - идентификатор элемента к которому необходимо // добавить Affix $('#myAffix').affix({ // установка смещений с помощью параметра offset offset: { top: 100, bottom: function () { // возвращает значение высоты // элемента веб-страницы с классом .footer return (this.bottom = $('.footer').outerHeight(true)) } } }) </script> ... <!-- Добавление Affix к элементу div с помощью JavaScript --> <div id="myAffix"> ... </div>
Параметры плагина Affix
Параметры могут быть установлены с помощью атрибутов Data или JavaScript. Для атрибутов Data добавьте имя параметра к data-
(например: data-offset-top=100
).
Параметр | Описание |
---|---|
offset |
Тип: number | function | object . Значение по умолчанию: 10 . Задаёт величину смещения элемента в пикселях от краёв экрана. Данное значение является контрольной точкой, при которой плагин переключает элемент веб-страницы из одного состояния в другое и наоборот, т.е. включает или выключает "прикрепление" элемента. Величина смещения вычисляется на основании позиции прокрутки. Если Вы зададите в качестве смещения одно значение, то оно будет применяться в обоих направлениях (верх и вниз).Например: offset:{top: 20} или offset:{top:20,bottom:10}
Если Вам необходимо динамически вычислить значение смещения, то используйте функцию. |
target |
Тип: селектор | узел | элемент jQuery . Значение по умолчанию: объект window . Этот параметр предназначен для указания элемента, к которому необходимо добавить плагин Affix. |
События плагина Affix
События для плагина Affix представлены в следующей таблице.
Событие | Описание |
---|---|
affix.bs.affix |
Это событие срабатывает перед "прикреплением" элемента к верхнему или нижнему краю окна браузера. |
affixed.bs.affix |
Это событие срабатывает после "прикрепления" элемента к верхнему или нижнему краю окна браузера. |
affix-top.bs.affix |
Это событие срабатывает перед выключением "прикрепления" элемента, т.е когда класс .affix заменяется на .affix-top . |
affixed-top.bs.affix |
Это событие срабатывает после выключения "прикрепления" элемента к , т.е когда класс .affix заменяется на .affix-top . |
affix-bottom.bs.affix |
Это событие срабатывает перед выключением "прикрепления" элемента, т.е когда класс .affix заменяется на .affix-bottom . |
affixed-bottom.bs.affix |
Это событие срабатывает после выключения "прикрепления" элемента к , т.е когда класс .affix заменяется на .affix-bottom . |
Пример кода с событием affixed.bs.affix
<script type="text/javascript"> $(document).ready(function(){ $("#myNav").affix({ offset: { top: 200 } }); $("#myNav").on('affixed.bs.affix', function(){ alert("Меню навигации была прикреплена. Теперь она не прокручивается вместе со страницей."); }); }); </script> <div class="container"> <div class="row"> <div class="col-xs-3"> <div id="myNav" class="list-group"> <a href="#section1" class="list-group-item">Раздел1</a> <a href="#section2" class="list-group-item">Раздел2</a> <a href="#section3" class="list-group-item">Раздел3</a> </div> </div> <div class="col-xs-9"> <section id="section1"> <h2>Раздел 1</h2> <p>Содержание раздела 1...</p> </section> <section id="section2"> <h2>Раздел 2</h2> <p>Содержание раздела 2...</p> </section> <section id="section3"> <h2>Раздел 3</h2> <p>Содержание раздела 3...</p> </section> </div> </div> </div>

Пример совместного использования плагинов Affix и ScrollSpy
На следующем примере продемонстрирована возможность совместного использования плагинов ScrollSpy и Affix. Плагин ScrollSpy используется для отслеживания раздела, в котором сейчас находится пользователь и подсвечивания этого раздела в меню. А плагин Affix в этом примере используется для прикрепления этого меню при прокручивании страницы. Посмотреть пример совместного использования этих плагинов можно с помощью нижерасположенной ссылки.

Несколько дней мучаюсь и не понимаю что не так делаю.
В bootstrap 3 и js знания минимальные.
Пытаюсь настроить в prestashop 1.6 плавающие блоки.
Плагин affix идет по умолчанию в коробке престы.
У меня такой вид
Собственно сам скрипт
Блоки плавают, все в порядке, не исчезают, ничего.
Задача стоит чтобы плавающие останавливались на нижнем крае НО они постоянно уходят ниже в footer, а не останавливаются.
Пробовал использовать пример из статьи выше
Результат такой же.
Подскажите, пожалуйста, что я не так делаю? В какую сторону смотреть?
Не совсем понятны ваши действия.
Рассмотрим код:
В этом коде значения top и bottom определяет величину так называемой прокрутки в пикселях соответственно от верхнего края и нижнего края браузера, в пределах которой этот элемент не открепляется от своего положения. Если у вас эта величина динамическая, то соответственно её нужно вычислять с помощью JavaScript. Например, если перед affix элементом расположен блок, высота которого не постоянная и зависит от его содержимого. Если же она фиксированная, то просто вычисляем значение и устанавливаем его.
Для состояния фиксации affix элемента в нижнем положении (т.е. когда ему назначается класс affix-bottom) к нему необходимо добавить стили, например:
В этом состоянии ему нет смысла устанавливать CSS свойство bottom со значением auto, т.к. ему установлено свойство top и свойство bottom будет игнорироваться.
Действительно, величины у меня динамические. Сначала обычное меню горизонтальное, потом оно крепится к верху и я получаю 110px его высоту, ну и +20px чтобы плавающие блоки не прилипали вплотную.
Сейчас выставил так
и добавил class к sidebar
чтобы не прыгало на левую сторону.
Плавающий div останавливается на расстоянии 620, но при это когда я прокручиваю на начало страницы, этот блок стоит внизу до тех пор пока я не дойду до верха, тогда он перепрыгивает в top на своё место.
Не хватает знаний у меня.
Александр, подскажите, как мне заставить плавать и вверх и вниз.
Может напутал что-то в css?
Также интересует вопрос как отключить работу affix на маленьких экранах.
Сейчас прилипает как положено к футеру с
Однако в при прокрутке обратно на верх он ведет себя также как и описывал раньше
Я пользуюсь Prestashop 1.6 и мне кажется что ошибка может возникать также из основных стилей шаблона.
Подскажите пожалуйста как быть в такой ситуации?
смастерил. очень старался.
кажется что я нагородил со стилями
Подскажите в чем дело. Affix перестает работать (добавлять класс «affix» ) на мониторах (мобильных) меньше 700px. Раньше все работало нормально. Смотрел в разных браузерах. lab-auto.parallax-design.ru/
Спасибо.
codepen.io/sergey-dragun/pen/zbVOrr
есть ли решение?
Спасибо
Например, это можно выполнить установив фиксированной колонки определённую высоту и CSS свойство overflow-y со значением scroll.
Если высоту фиксированной колонки не нужно вычислять, то её можно установить с помощью CSS (например, height: 150px). Для адаптивных сайтов это необходимо выполнить с использованием медиа запросов.
Если же высота должна как-то вычисляться, то это действие выполняется с помощью кода JavaScript.
подскажите есть такой пример
codepen.io/sergey-dragun/pen/eXGQzN
radikal.ru/lfp/b.radikal.ru/b41/1903/30/53b41c0d2219.png/htm
При нажатии на кнопку 'Click'
выпадает доп блок, что влечет за собой смену размера style=«top
и левый блок смещаться, подскажите можно ли это пофиксить
Добавьте в функцию вызов метода affix('checkPosition'). Данный метод предназначен для пересчитывания состояние affix на основе размеров, положения и прокрутки соответствующих элементов.
Проконсультируйте пожалуйста.
Во вложении разметка.
Вопросы следующий:
1. секция, которая должна контролироваться аффикс-ом должна быть поверх секции заголовка, если ей приписываем , то аффикс как-бы и не существует. Как это можно победить?
2. если у секции, которая должна контролироваться аффикс-ом убрать , то аффикс
начинает работать но скачками, то-есть:
2.1. при прокрутке вниз, — чуть чуть скролла и она прыжком прилипает к верху,
2.2. при прокрутке обратно — прыжком перемещается на первоначаьное место после того, как докрутили до начала страницы.
Хотелось бы чтобы она прокручивалась вместе с секцией заголовка без таких скачков, то-есть если крутим вниз, — то она прилипала к верху только когда дойдет до верха при прокрутке, и при прокрутке вниз — отлипала, когда докрутили до секции с заголовком. (как в оригинальном примере affix.html)
3. А как проконтролировать бэкграунд секции, которая контролируется аффиксом, то есть когда прилипла надо прозрачность выставить в 1, а когда отлипла вернуть в исходную?
Архив
Ну и соответственно если убрать style… то секция, которая должна аффикс-ом контролироваться — стает не поверх секции с заголовком, а под ним.
Вам необходимо написать функцию, которая будет вычислять высоту viewport и выставлять её в качестве значения параметра offset-top. При этом вручную инициализировать affix блок не надо.
Меню:
JavaSript код:
Теперь оно ее помещает под секцию-заголовок и плавненько, как надо крутит, а как ее начальную позицию поднять на 95 пикселей вверх, чтобы эта секция была поверх секции-заголовка.
Ну и соответственно, как сделать смену ее бэкграунда в зависимости от того, прилеплена она кверху или не прилеплена.
CSS-код:
JS:
CSS стили, которые необходимо добавить элементам, указаны с помощью атрибута style.
Спасибо вам большое за уроки.
Можно как-то определить в каком сейчас состоянии находится панель в прилепленном или нет?
Суть в том, что просто при загрузке страницы, я выставляю прозрачный, бэкграунд через ну и, соответственно меняю этот бэкграунд (убираю прозрачность, добавляю картинку на бэкграунд и выставляю background-blend-mode) при срабатывании события affixed.bs.affix и обратно при affixed-top.bs.affix.
Все работает, все меняется, но возникает нюанс, если поскроллить страницу, а потом обновить, то #nav остается прилепленной, но ей выставляется background:rgba(102,51,204,0.3).
То есть надо узнать при загрузке/перезагрузке страницы в каком состоянии находится #nav и после этого выставлять для нее css, возможно-ли это?
Определить состояние affix элемента можно так:
Например:
Код JavaScript, который будет устанавливать необходимую ширину блоку affix:
CSS-код:
1) Когда прокручиваешь скролл, плагин ScrollSpy все ровно отслеживает, но когда нажимаешь на разделы он почему то возвращает сектор к самому вверху и при нажатии на предпоследний активный пункт перепрыгивает на последний пункт, хотя data-offset=`90`. Конечно можно к сектору присвоить padding-top: 90px; но тогда пляшет верстка. Наверняка есть решение из коробки, на сайте Bootstrap я решения не нашел.
2) И ни как не получается настроить ширину блока, при прокрутке она меняется. Получается отрегулировать в определенном разрешении, но в других все равно прыгает. Спасибо!
Подскажите, как отключить аффикс при открытии подменю в навбаре — на очень мелких устройствах подменю полностью не влазит и нижние пункты нельзя выбрать из-за прибитого навбара
Но если у кого есть несложный вариант подобной конструкции — поделитесь
Например, так:
Либо вычислить максимальную высоту устройства и установить данный параметр (max-height) с помощью JavaScript.
надо что бы меню закреплялось на верху страницы как только страница опускается, но при этом меню
1. прикрепляется, вроде так и надо
2. но становится прозрачным, нажать на кнопки нельзя
3. при опускании страницы во время прикрепления меню, страница прыгает, на размер самого меню, видимо идет вырезание
как решить эти проблемы. спасибо.
HTML-код
Если хотите привести готовую страницу или много кода, то это лучше сделать на специальном сервисе, например jsfiddle.net. В комментариях этого делать не стоит.
Третья проблема существует из-за того, что блок navbar (affix) при прокручивании выпадает из основного потока и становится fixed. Это приводит к тому, что блоки основного потока перемещаются вверх на 70px (высота navbar 50px + margin navbar 20px). Т.е. как бы блок affix исчезает и появляется отдельно над ними.
Чтобы это убрать, необходимо написать скрипт:
кнопки пропадают (становятся прозрачными) когда меню прилепляется к верху.
jsfiddle.net/h8qfkuhm/2/
Необходимо добавить в CSS следующее:
При прокручивании сверху вниз в какой-то момент левый блок фиксируется, но, поскольку он по высоте больше чем разрешение экрана, можно ли сделать чтобы при достижении скролла высоты в 50% экрана и продолжении скролла вниз левый блок прокрутился вниз до достижении нижней его границы нижнего угла монитора?
HTML-код:
CSS-код:
Изначально у меня используется для меню
affix работает, но дело в том, что меню прижимается к левому краю (а хочется, чтобы меню было на всю ширину, только прилипало), как это сделать?
Как минимум так:
Пример совместного использования плагинов Affix и ScrollSpy
Очень нужен сейчас для работы
Код CSS:
Для этого у меню необходимо убрать у навигационного меню класс .navbar-fixed-top.
После этого добавить к меню data-атрибуты affix:
Кроме этого надо ещё задать стили CSS для меню, когда оно будет находиться в режиме affix:
наблюдается следующая проблема: внизу экрана Affix начинает накрываться текстом, формами и т.д. Как решить эту проблему?
И за одно вопрос Как установить
по центру.
text-align: center;- не работает?
Спасибо за столь полезный сайт и за возможный ответ.
Для этого Вам необходимо установить значение bottom. Можно использовать либо какую-то фиксированную величину (например 500px) или вычислять данное значение с помощью функции.
Кроме этого необходимо ещё прописать стили CSS для .affix-bottom (т.е. когда Ваш affix блок будет достигать bottom). Обычно для этого класса задают свойство position (как минимум) и другие:
Для выравнивания элемента по центру, попробуйте применить к нему класс .center-block.
Прочитал вашу статью о прилипающем меню. Bootstrap только начал изучать и в java я пока не силен. Но никак не могу сделать это проклятое прилипающее меню на bootstrap с помощью плагинов scrollspy.js и affix.js. На странице их подключил, но при прокрутке (меню-которое надо закрепить) выскакивает и стоит слева по середине страницы.
Прошу вас помочь. Вот код меню. Посмотрите пожалуйста что я делаю не так.
Не очень понятно, про какое меню идёт речь.
Если Вы хотите использовать стандартное меню bootstrap, то его можно прикрепить к верхнему краю с помощью добавления класса navbar-fixed-top к элементу nav. В этом случае affix не нужен. Кроме этого стандартного класса nav-fixed-top нет. Т.е. код меню будет такой: