Статьи

Получение вкладок Bootstrap, чтобы хорошо играть с масоном

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#homeid="home"dividhome

Также обратите внимание, как Bootstrap обращает внимание на атрибуты доступности, такие как rolearia-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.