Bootstrap — одна из наиболее широко распространенных интерфейсных сред с открытым исходным кодом. Включите Bootstrap в свой проект, и вы сможете быстро создавать адаптивные веб-страницы. Если вы пытались использовать Masonry вместе с виджетом «Вкладки Bootstrap» , один из многих компонентов JavaScript, предлагаемых Bootstrap, скорее всего, вы наткнулись на какое-то раздражающее поведение.
На сайте масонства мы читаем, что масонство это…
библиотека макетов JavaScript. Он работает, располагая элементы в оптимальном положении в зависимости от доступного вертикального пространства, вроде каменщика, подгоняющего камни к стене.
Я так и сделал, и в этой статье рассказывается, что это за проблема, и что вы можете сделать, чтобы решить ее.
Объяснение вкладок начальной загрузки
Компонент Bootstrap Tabs включает в себя два ключевых связанных элемента: элемент навигации с вкладками и несколько панелей содержимого. При загрузке страницы к первой панели применяется класс .active
Это позволяет панели быть видимой по умолчанию. Этот класс используется через JavaScript для переключения видимости панели с помощью событий, инициируемых навигационными ссылками с вкладками: если присутствует .active
Если у вас есть какой-то веб-контент, который лучше всего представить в отдельных блоках, а не втиснуть все в одно место, компонент вкладок Bootstrap может пригодиться.
Почему масонство?
В некоторых случаях содержимое внутри каждой панели подходит для отображения в адаптивном макете сетки. Например, ряд продуктов, услуг и элементов портфолио — это типы контента, которые могут отображаться в формате сетки.
Однако, если ячейки сетки не имеют одинаковую высоту, может произойти что-то вроде того, что вы видите ниже.
Широкий разрыв разделяет две строки контента, и макет кажется нарушенным.
В настоящее время Bootstrap решает проблему равной ширины с новым компонентом карты, основанным на Flexbox. Для добавления столбцов одинаковой ширины достаточно просто добавить класс card-deck
в группу компонентов карты .
Если вы хотите, чтобы ваши карты были неравномерной длины, вы можете использовать CSS3 Multi Column Layout . (В конце концов, даже если есть некоторые ошибки поддержки браузера , в целом это довольно хорошо.) Это лежит в основе новой опции столбцов карт, которая поставляется в комплекте с компонентом карты. Однако, если вам все еще нравится приятная анимация, которую предоставляет библиотека JavaScript Masonry из коробки, и ее широкая совместимость с браузерами, JavaScript в этом случае по-прежнему является жизнеспособным вариантом.
Настройка демонстрационной страницы
Запуск и запуск демонстрационной страницы помогает показать, что интеграция вкладок Bootstrap с Masonry не так проста, как можно было ожидать.
Демонстрационная страница этой статьи основана на начальном шаблоне , доступном на веб-сайте Bootstrap.
Ниже приведен скелет разметки для компонента вкладок Bootstrap:
<ul class="nav nav-tabs" id="myTab" role="tablist">
<!-- nav item 1 -->
<li class="nav-item">
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a>
</li>
<!-- nav item 2 -->
<li class="nav-item">
<a class="nav-link" id="profile-tab" data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a>
</li>
<!-- nav item 3 -->
<li class="nav-item">
<a class="nav-link" id="contact-tab" data-toggle="tab" href="#contact" role="tab" aria-controls="contact" aria-selected="false">Contact</a>
</li>
</ul>
Классы nav nav-tabs
Значение атрибута href
Например, значение href
#home
id="home"
div
id
home
Также обратите внимание, как Bootstrap обращает внимание на атрибуты доступности, такие как role
aria-controls
Вот фрагмент кода, иллюстрирующий структуру содержимого с вкладками:
<!-- content 1 -->
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<h3>Tab 1 Content</h3>
<div class="card-group">
<!-- first card -->
<div class="card">
<img class="card-img-top" src="path/to/img" alt="Card image cap">
<div class="card-body">
<h5 class="card-title">Card title</h5>
<p class="card-text">Card text here.</p>
<p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
</div>
</div>
<!-- second card -->
<div class="card">
<!-- card markup here -->
</div&lgt;
<!-- third card -->
<div class="card">
<!-- card markup here -->
</div>
</div>
</div>
Просто добавьте аналогичную структуру для каждого раздела с вкладками, соответствующего элементам вкладок, которые вы кодировали выше.
Для полного кода, ознакомьтесь с демонстрацией CodePen .
Добавление библиотеки масонства
Вы можете скачать Masonry с официального сайта, нажав на кнопку Download masonry.pkgd.min.js .
Чтобы избежать проблем с макетом, автор библиотеки рекомендует использовать Masonry вместе с плагином imagesLoaded .
Для работы масонству не нужна библиотека jQuery . Тем не менее, поскольку компоненты Bootstrap JavaScript уже используют jQuery, я облегчу себе жизнь и инициализирую Masonry способом jQuery.
Вот фрагмент кода для инициализации Masonry с использованием jQuery и imagesLoaded:
var $container = $('.masonry-container');
$container.imagesLoaded( function () {
$container.masonry({
columnWidth: '.card',
itemSelector: '.card'
});
});
Приведенный выше код кэширует div
$container
Затем Masonry инициализируется в $container
Опция columnWidth
Здесь он установлен на ширину одного элемента карты, используя его имя класса. Опция itemSelector
Здесь также установлен один элемент карты.
Пришло время проверить код.
К сожалению! Что случилось со скрытыми панелями?
На веб-странице, которая не использует вкладки Bootstrap, приведенный выше код работает как шарм. Однако в этом случае вы скоро поймете, что происходит какое-то забавное поведение.
Во-первых, это нормально, потому что сетка внутри активной активной вкладки по умолчанию отображается правильно:
Однако, если вы нажмете на навигационную ссылку с вкладками, чтобы раскрыть содержимое скрытой панели, вот что происходит:
Изучение исходного кода показывает, что масонство сработало так, как и ожидалось, но положение каждого элемента рассчитывается неправильно: все элементы сетки складываются друг на друга, как колода карт.
И это еще не все. Изменение размера окна браузера приводит к правильному позиционированию элементов сетки.
Давайте исправим ошибку макета
Так как неожиданная ошибка компоновки становится очевидной после нажатия на навигационную ссылку с вкладками, давайте посмотрим на события, инициируемые вкладками Bootstrap, более внимательно.
Список событий довольно короткий. Вот.
- show.bs.tab запускается на вкладке show, но до показа новой вкладки
- selected.bs.tab запускается на вкладке шоу после того, как вкладка была показана
- hide.bs.tab запускается, когда должна быть показана новая вкладка (и, таким образом, предыдущая активная вкладка должна быть скрыта)
- hidden.bs.tab запускается после показа новой вкладки (и, таким образом, предыдущая активная вкладка скрыта).
Поскольку макет Masonry портится после показа вкладки, перейдите к событию shown.bs.tab
Вот код, который вы можете разместить чуть ниже предыдущего фрагмента:
$('a[data-toggle=tab]').each(function () {
var $this = $(this);
$this.on('shown.bs.tab', function () {
$container.imagesLoaded( function () {
$container.masonry({
columnWidth: '.card',
itemSelector: '.card'
});
});
});
});
Вот что происходит в коде выше:
Функция jQuery .each()
по каждой навигационной ссылке с вкладками и прослушивает событие shown.bs.tab
Когда происходит событие, панель становится видимой, и масонство повторно инициализируется после завершения загрузки всех изображений.
Проверьте код
Если вы следили за этим, запустите демонстрацию в браузере или попробуйте демонстрацию CodePen ниже, чтобы проверить результат:
Нажмите на навигационную ссылку с вкладками и обратите внимание, как на этот раз элементы сетки размещаются равномерно внутри каждой панели содержимого. Изменение размера браузера заставляет элементы правильно перемещаться с приятным эффектом анимации.
Вот и все, работа сделана!
Вывод
В этой статье я показал, как интегрировать компонент Bootstrap Tabs с библиотекой Masonry JavaScript.
Оба скрипта просты в использовании и достаточно мощные. Однако соберите их вместе, и вы столкнетесь с досадными ошибками макета, влияющими на скрытые вкладки. Как показано выше, хитрость заключается в повторной инициализации библиотеки Masonry после того, как каждая панель становится видимой.
С этим решением в вашем наборе инструментов, достижение отличных плиточных макетов будет проще простого.
Удачной загрузки!
Если у вас есть основы Bootstrap за поясом, но вы не знаете, как поднять свои навыки Bootstrap на следующий уровень, ознакомьтесь с нашим курсом «Создайте свой первый сайт с Bootstrap 4», чтобы быстро и весело познакомиться с мощью Bootstrap.