JavaScript. Начало работы · Bootstrap. Версия v4.0.0
Запустите Bootstrap с нашими дополнительными плагинами JavaScript построенными на jQuery. Узнайте о каждом плагине, наших данных и программных API-интерфейсах и т.п.
Индивидуальные или компилированные
Плагины можно подключать по одному (файлами *.js
) или все сразу – с помощью bootstrap.js
или «облегченного» bootstrap.min.js
(не подключайте оба сразу).
Зависимости
Некоторые плагины и компоненты CSS зависят от других плагинов. Если вы подключаете плагины по одному, проверьте существование зависимостей в документации. Также заметим, что все плагины зависят от jQuery (т.е. в файле HTML jQuery надо подключать перед плагинами). Загляните сюда bower.json
для получения информации по поддерживаемым версиям jQuery.
Всплывающие подсказки (по наведению) и «всплывающие окна» (по клику мыши) зависят от библиотеки Popper.js.
Дата-атрибуты
все плагины Bootstrap можно подключить и настроить в HTML через дата-атрибуты Bootstrap «предпочитает» этот метод использования функционала JS. Удостоверьтесь, что в одном элементе используется лишь один набор атрибутов (т.е., не получится запустить всплывающие подсказки и «всплывающие окна» из одной кнопки).
HTML5 спроектирован с возможностью расширения данных ассоциированных с каким-либо элементом, но в то же время не обязательно имеющих определенного значения. data-* attributes позволяют нам хранить дополнительную информацию на стандартных, семантических элементах HTML, не загрязняя имя класса.
Однако иногда может понадобиться выключить эту способность. Для выключения API атрибута, «открепите» все обработчики событий документа, лежащие в пространстве имен data-api
:
$(document).off('.data-api')
Или, чтобы сделать это с определенным плагином, просто пропишите его название как пространство имен, наряду с пространством имен data-api
:
$(document).off('.alert.data-api')
События
Bootstrap предлагает ряд собственных событий для уникальных действий большинства плагинов. В целом, эти события обозначаются инфинитивом и прошедшей формой причастия – где инфинитив (например, show
) запускается в начале события, а его причастие (например, shown
) – по окончанию события.
Все события неопределенной формы работают с функционалом preventDefault()
. Это дает возможность остановить выполнение действия до его начала.
$('#myModal').on('show.bs.modal', function (e) {
if (!data) return e.preventDefault() // stops modal from being shown
})
Алгоритмическое API
Мы решили дать вам возможность использовать все плагины Bootstrap прямиком через JS API. Все свободно распространяемые API – это отдельные методы «цепочки вызовов», возвращающие набор параметров, над которыми производилось действие.
$('.btn.danger').button('toggle').addClass('fat')
Всем методам следует передавать или аргументы, т.е. строку, которая вызывает какой-либо метод, или ничего не передавать (что вызовет действие плагина, заложенное по умолчанию).
$('#myModal').modal() // initialized with defaults
$('#myModal').modal({ keyboard: false }) // initialized with no keyboard
$('#myModal').modal('show') // initializes and invokes show immediately
Также, у каждого плагина может быть вызван конструктор через свойство Constructor
: $.fn.popover.Constructor
. Если вам нужен экземпляр определенного плагина, извлеките его непосредственно из элемента: $('[rel="popover"]').data('popover')
.
Асинхронные функции и библиотека «переходов»
Все методы алгоритмических API асинхронны и возвращают пользователю значение после того, как «переход» начат и до того, как «переход» закончен.
Чтобы выполнить действие по завершению «перехода», вы можете отследить соответствующее событие.
$('#myCollapse').on('shown.bs.collapse', function (e) {
// Action to execute once the collapsible area is expanded
})
Вызов метода на динамическом, изменяющемся компоненте будет проигнорирован.
$('#myCarousel').on('slid.bs.carousel', function (e) { $('#myCarousel').carousel('2') // Will slide to the slide 2 as soon as the transition to slide 1 is finished }) $('#myCarousel').carousel('1') // Will start sliding to the slide 1 and returns to the caller $('#myCarousel').carousel('2') // !! Will be ignored, as the transition to the slide 1 is not finished !!
Установки по умолчанию
Вы можете изменить их для плагина, изменяя объект плагина Constructor.Default
:
$.fn.modal.Constructor.Default.keyboard = false // changes default for the modal plugin's `keyboard` option to false
Конфликты
Иногда необходимо использовать плагины BS с другими UI – фреймворками. Тогда могут возникнуть проблемы в пространствах имен. В этом случае вы можете вызвать метод .noConflict
на плагине, значение которого вы хотите переназначить.
var bootstrapButton = $.fn.button.noConflict() // return $.fn.button to previously assigned value
$.fn.bootstrapBtn = bootstrapButton // give $().bootstrapBtn the Bootstrap functionality
Версии
Версия каждого плагина jQuery может быть узнана через свойство конструктора плагина VERSION
. Например, для плагина всплывающих подсказок:
$.fn.tooltip.Constructor.VERSION // => "4.0.0"
В BS4 нет т.н. fallback’a (т.е. «резервных» стилей для случая «глобальной поломки» верстки на старых браузерах), когда отключен JS
Банальный пример того, как все сейчас рисуют скругленные края у элементов:
#roundbox { -webkit-border-radius: 5px; /* Safari */ -moz-border-radius: 5px; /* Firefox */ -o-border-radius: 5px; /* Opera */ border-radius: 5px; }
В случае, если браузер пользователя не поддерживает CSS3, он увидит просто прямоугольник, обладающий всей необходимой функциональность. То есть отобразится базовый вид элемента — это и есть fallback (резервная) страховка.
Плагины Bootstrap частично не смогут «подстроить» функциональность вашего сайта в соответствии с параметрами отображения старого браузера, если юзер зайдет на него с такового, или в случае «уничтожения» или «зависания» части кода т.е. на старых браузерах BS4 может не сработать, если там отключен JS. Если вы хотите подсказать юзеру, что делать в таком случае, используйте тэг
для пояснений о пере-включении JS.
Сторонние библиотеки
Официально BS4 не поддерживает сторонние JS библиотеки, такие как Prototype или UI-jQuery. Несмотря на использование .noConflict
и группированных по функциональности обработчиков событий, при подключении сторонних библиотек могут возникнуть проблемы при компиляции.
Util
Весь JS в Bootstrap зависит от util.js
, который должен подключаться среди прочих JS-файлов, кроме случаев, когда вы пользуетесь компилированным или «облегченным» bootstrap.js
– потому что в этом случае он уже подключен.
util.js
содержит полезные функции и базовый справочник для событий transitionEnd
и эмулятор «переходов» CSS. Этот файл используется другими плагинами для проверки существования поддержки.
Отступы. Утилиты · Bootstrap. Версия v4.0.0
Bootstrap включает широкий диапазон сокращений откликов и полезных классов для изменения внешнего вида элемента.
Как это устроено
Назначайте «отзывчивые» значения margin
или padding
элементу или поднабору его сторон с помощью удобных классов. Сюда входит поддержка индивидуальных свойств, всех свойств и вертикальных и горизонтальных свойств. Классы созданы дефолтной карте Sass, и варьируются от .25rem
до 3rem
.
Замечание
Утилиты отступов, которые работают на всех брейкпойнтах – от xs
до xl
– не имеют аббревиатуры брейкпойнта в названии. Это сделано потому, что те классы применяются, начиная с min-width: 0
и выше, и т.о. не привязаны к медиа-запросам. Названия остающихся брейкпойнтов, однако, содержит в себе аббревиатуры брейкпойнтов.
Классы названы по формату
для xs
и {property}{sides}-{breakpoint}-{size}
для sm
, md
, lg
и xl
.
Где свойство – это одно из:
m
— для классов, которые задаютmargin
p
— для классов, которые задаютpadding
Где свойство – это одно из:
t
— для классов, которые задаютmargin-top
илиpadding-top
b
— для классов, которые задаютmargin-bottom
илиpadding-bottom
l
— для классов, которые задаютmargin-left
илиpadding-left
r
— для классов, которые задаютmargin-right
илиpadding-right
x
— для классов, которые задают и*-left
и*-right
y
— для классов, которые задают и*-top
и*-bottom
- blank — для классов, которые задают
margin
илиpadding
для всех 4-х сторон элемента
Где размер – это один из:
0
— для классов, которые удаляютmargin
илиpadding
назначая его равны0
1
— (по умолчанию) для классов, которые устанавливаютmargin
илиpadding
к значению, равному$spacer * .25
2
— (по умолчанию) для классов, которые устанавливаютmargin
илиpadding
к значению, равному$spacer * .5
3
— (по умолчанию) для классов, которые устанавливаютmargin
илиpadding
к значению, равному$spacer
4
— (по умолчанию) для классов, которые устанавливаютmargin
илиpadding
к значению, равному$spacer * 1.5
5
— (по умолчанию) для классов, которые устанавливаютmargin
илиpadding
к значению, равному$spacer * 3
auto
— для классов, которые устанавливаютmargin
как auto
(Вы можете добавить больше размеров, добавляя разделы в карту Sass $spacers
.)
Примеры
Вот несколько понятных примеров этих классов:
.mt-0 {
margin-top: 0 !important;
}
.ml-1 {
margin-left: ($spacer * .25) !important;
}
.px-2 {
padding-left: ($spacer * .5) !important;
padding-right: ($spacer * .5) !important;
}
.p-3 {
padding: $spacer !important;
}
Горизонтальное центрирование
В дополнение, Bootstrap также включает класс .mx-auto
для горизонтального выравнивания блока блока содержимого фиксированной ширины – т.е. контент, которому заданы display: block
и набор width
с помощью установки горизонтальных марджинов как auto
.
Центрированный элемент
<div>
Центрированный элемент
</div>
Обновление. Содержание · Bootstrap. Версия v4.0.0
Reboot — коллекция специфических изменений элементов CSS в едином файле, обеспечиваещая Bootstrap элегантную, простую и последовательную основу для быстрого начала работы.
Reboot — переводится как «перезагрузка», унифицирует отображение базовых стилей в браузерах (например переводит все единицы измерения в rem
)
Подходы
Reboot основан на файле normalize.css (для лучшего отображения унифицирует стили которые в этом нуждаются), который позволяет обеспечить многие элементы HTML некоторым набором стилей, используя только селекторы элемента. Дополнительная стилизация реализуется только посредством классов. Например, мы «перезагружаем» стили некоего элемента <table>
для более простого вертикального выравнивания (baseline – вертикальный «ритм» контента, или иной), а потом применяем классы <table>
, .table-bordered
и т.д.
Вот наши рекомендации и причины для использования Reboot:
- Приведите настройки браузера по умолчанию к использованию единиц
rem
вместоem
при масштабируемом расположении контента. - Избегайте
margin-top
’a. Вертикальные отступы могут «рушиться», приводя к нежелательным результатам. Однако важнее тот факт, что одно направлениеmargin
«марджина» — это более простая «ментальная модель» (более просто использовать). - Для более удобного масштабирования на разных устройствах, в блочных элементах должны использоваться единицы
rem
дляmargin
марджинов. - Старайтесь минимально объявлять свойства
font
, вместо чего используйтеinherit
, где только возможно.
Страницы по умолчанию
Элементы <html>
и <body>
обновлены чтобы обеспечить лучшие «глобальные» умолчания страниц. Подробнее:
- Свойство
box-sizing
глобально объявлено какborder-box
для каждого элемента – включая*::before
и*::after
. Это гарантирует, что объявленная ширина элемента никогда не будет превышена из-за паддинга или границы.font-size
не объявлен по умолчанию в<html>
, но он предполагается как16px
(как в умолчаниях браузера).font-size: 1rem
применяется к<body>
для легкого отзывчивого масштабирования печатания текста через медиа-запросы и одновременно учитывая предпочтения юзера, а также обеспечивая более гибкий подход.
<body>
также устанавливает глобальные значенияfont-family
,line-height
иtext-align
, которые наследуются позже некоторыми элементами форм для предотвращения несоответствия шрифтов.- Для безопасности
<body>
имеет объявленныйbackground-color
, который стремится к#fff
.
Веб-шрифты по умолчанию (Helvetica Neue, Helvetica, Arial) интегрированы в Bootstrap 4 и заменены «стаком (набором) нативных шрифтов» для оптимального рендеринга текста на любой машине или устройстве под любой ОС. Подробнее можно прочитайте о «родных шрифтах» в данной статье.
$font-family-sans-serif:
// Safari for OS X and iOS (San Francisco)
-apple-system,
// Chrome < 56 for OS X (San Francisco)
BlinkMacSystemFont,
// Windows
"Segoe UI",
// Android
"Roboto",
// Basic web fallback
"Helvetica Neue", Arial, sans-serif,
// Emoji fonts
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !default;
Этот font-family
применен к <body>
и автоматически наследуется глобально во всем Bootstrap. Для изменения глобального font-family
обновите карту $font-family-base
и перекомпилируйте BS4.
Заголовки и параграфы
Из всех элементов заголовков: <h2>
и <p>
— удалены margin-top
. Для удобного «спейсинга» заголовкам добавлен margin-bottom: margin-bottom: .5rem
, а параграфам — margin-bottom: margin-bottom: 1rem
.
Заголовок | Пример |
---|---|
|
h2. Заголовок Bootstrap |
|
h3. Заголовок Bootstrap |
|
h4. Заголовок Bootstrap |
|
h5. Заголовок Bootstrap |
|
h5. Заголовок Bootstrap |
|
h6. Заголовок Bootstrap |
Списки
Из всех списков <ul>
, <ol>
и <dl>
— удален margin-top
, а margin-bottom
установлен в 1rem
. Вложенные списки без margin-bottom
.
- Lorem ipsum dolor sit amet
- Consectetur adipiscing elit
- Integer molestie lorem at massa
- Facilisis in pretium nisl aliquet
- Nulla volutpat aliquam velit
- Phasellus iaculis neque
- Purus sodales ultricies
- Vestibulum laoreet porttitor sem
- Ac tristique libero volutpat at
- Faucibus porta lacus fringilla vel
- Aenean sit amet erat nunc
- Eget porttitor lorem
- Lorem ipsum dolor sit amet
- Consectetur adipiscing elit
- Integer molestie lorem at massa
- Facilisis in pretium nisl aliquet
- Nulla volutpat aliquam velit
- Faucibus porta lacus fringilla vel
- Aenean sit amet erat nunc
- Eget porttitor lorem
Для более легкой стилизации, удобной иерархии и лучшего спейсинга, у списков описания (<dl>
) обновлены марджины margin
. У <dd>
значение margin-left
стало 0
, а margin-bottom: .5rem
. <dt>
стали жирными.
<dl>
прекрасно подходит для определений терминов:
- Description lists
- A description list is perfect for defining terms.
- Euismod
- Vestibulum id ligula porta felis euismod semper eget lacinia odio sem.
- Donec id elit non mi porta gravida at eget metus.
- Malesuada porta
- Etiam porta sem malesuada magna mollis euismod.
Пре-форматированный текст
У элемента <pre>
удален margin-top
, а единицами измерения его margin-bottom
стали rem
.
.example-element { margin-bottom: 1rem; }
Таблицы
Таблицы слегка адаптированы — изменен <caption>
, сдвинуты границы, и теперь таблицы имеют последовательное выравнивание text-align
. Дополнительные изменения для границ, паддинга и еще кое-чего – в классе .table
.
Заголовок | Заголовок | Заголовок | Заголовок |
---|---|---|---|
Ячейка | Ячейка | Ячейка | Ячейка |
Ячейка | Ячейка | Ячейка | Ячейка |
Ячейка | Ячейка | Ячейка | Ячейка |
Формы
Различные элементы форм «перезагружены» для приобретения ими более простых «базовых» стилей. Вот несколько самых заметных изменений:
- У
<fieldset>
убраны границы, паддинги и марджины; так что теперь они могут быть легко использованы как «обертки» для отдельных форм ввода или групп форм ввода. - Элементы
<legend>
, как и<fieldsets>
, тоже изменены, и теперь отображаются как сортируемый заголовок. - Элементы
<label>
получили значениеdisplay: inline-block
для возможности применения марджинаmargin
. - К элементам
<input>
,<select>
,<textarea>
и<button>
по большому счету, адресуется лишь normalize.css, но Reboot также удаляет их марджинmargin
и устанавливаетline-height: inherit
. - Элементы
<textarea>
изменены – теперь их можно изменять в размере лишь вертикально, потому что горизонтальное изменение часто «ломает» разметку страницы.
Эти изменения (и еще) показаны внизу.
Элементы misc
Адрес
Элемент <address>
обновлен – теперь вместо дефолтного браузерного font-style
: italic
стоит normal
. line-height
теперь наследуется и добавлен margin-bottom: 1rem
. Элемент <address>
добавлены для контактной информации ближайшего «наследника» (или описания работы в целом). Сохраняйте форматирование добавлением <br>
в конец строк.
1355 Market St, Suite 900
San Francisco, CA 94103
P: (123) 456-7890 Full Name
[email protected]
Цитата
По умолчанию, марджин margin
элемента blockquotes составляет 1em 40px
, так что мы «скинули» его до 0 0 1rem
для большей «кучности» при работе с другими элементами.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.
Someone famous in Source Title
Строчные элементы
Базовые стили элемента <abbr>
созданы так, что они «заставляют» его выделяться среди параграфа текста.
Резюме
Курсор cursor
по умолчанию всегда стремится к курсору текста text
, так что мы переназначили его на «указатель» pointer
для обозначения возможности взаимодействия с объектом по клику.
Подробнее о деталях.
Еще подробностиВот еще подробности о деталях.
HTML5 добавляет новый глобальный атрибут — [hidden]
, который не отображается по умолчанию имеет значение display: none
. Позаимствовав эту идею из PureCSS, мы добавили в нее !important ([hidden] { display: none !important; }
), чтобы избежать случайного «перекрытия» этого свойства и показа скрытого [hidden]
. Хотя [hidden]
не имеет встроенной поддержки в IE10, явное объявление его в вашем CSS решает эту проблему для данного браузера.
<input type="text" hidden>
[hidden]
несовместим с методами $(...).hide()
и $(...).show()
jQuery. Поэтому мы пока не особенно одобряем использование [hidden]
с другими методами управления свойством элементов display
.
Чтобы лишь скрыть видимость элемента без его «исчезания» из разметки, т.е. без изменения свойства display
, используйте вместо [hidden]
класс .invisible
.
Навигация. Компоненты · Bootstrap. Версия v4.0.0
Документация и примеры использования навигационных компонентов Bootstrap.
Основы
Навигация в Bootstrap имеет общую для подобного типа элементов разметку, от базового класса .nav
до активных и «выключенных» состояний. Заменяйте классы-модификаторы для переключения между стилями.
Базовый компонент класса .nav
создан на флексбоксе, что обеспечивает хорошую базу для создания всех типов навигационных компонентов. В него входят несколько стилей, которые «перебивают» остальные (для работы со списками), добавлены паддинги ссылок для увеличения «зоны клика», и базовые стили «выключенных» состояний.
В базовый компонент класса .nav
не включено какое-либо состояние .active
. Следующие примеры включают класс, главным образом для демонстрации, что данный конкретный класс не подключает какие-либо специальные стили.
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Классы используются везде, так что ваша разметка может быть сверх-гибкой. Используйте <ul>
как показано выше, или создайте свои; скажем, на основе элемента <nav>
. Из-за того, что .nav
использует display: flex
, ссылки в навигационной панели ведут себя, как если бы были элементами такой же панели, но с меньшим количеством кода.
<nav>
<a href="#">Active</a>
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Disabled</a>
</nav>
Доступные стили
Изменяйте стиль компонентов .nav
классами-модификаторами и обычными классами. Смешивайте их и настраивайте как надо, или создайте свои.
Горизонтальное выравнивание
Изменяйте горизонтальное выравнивание вашего навигационного элемента с утилитами флексбокса. По умолчанию навигационные панели выровнены по левому краю, но вы можете легко это изменить на центр или правый край.
Центрировано классом .justify-content-center
:
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
По правому краю классом .justify-content-end
:
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Вертикально
Располагайте вашу навигацию по вертикали, изменяя направление элемента flex классом .flex-column
. Надо расположить ее вертикально лишь на некоторых брейкпойнтах? Используйте отзывчивые версии (например .flex-sm-column
).
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Как всегда – вертикальная навигация доступна и без <ul>
.
<nav>
<a href="#">Active</a>
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Disabled</a>
</nav>
Вкладки
«Забирает» базовый элемент навигации с верха и добавляет класс .nav-tabs
для создания «вкладочного» интерфейса, Используйте их для создания зоны с поддержкой содержимого в виде вкладок с плагином JavaScript.
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Подушки
На том же коде HTML, но с используйте класс .nav-pills
:
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Наполняйте и выравнивайте по центру
Заставьте содержимое вашего .nav
расширяться на полную доступную ширину с помощью одного-двух классов-модификаторов. Для пропорционального заполнения всего доступного пространства элементами класса .nav-item
, используйте класс nav-fill. Заметьте, что всё горизонтальное место занято, но не каждый элемент навигационной панели имеет одинаковую ширину.
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a href="#">Longer nav link</a>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Используя навигацию на основе <nav>
, удостоверьтесь, что включаете .nav-item
в ссылки.
<nav>
<a href="#">Active</a>
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Disabled</a>
</nav>
Для создания элементов равной ширины используйте класс .nav-justified
. Всё горизонтальное пространство будет занято ссылками навигационной панели, но, в отличие от примера с .nav-fill
выше, каждый элемент навигационной панели будет одинаковой ширины.
<nav>
<a href="#">Active</a>
<a href="#">Longer nav link</a>
<a href="#">Link</a>
<a href="#">Disabled</a>
</nav>
По аналогии с примером с .nav-fill
, где использована навигация на основе <nav>
, удостоверьтесь, что включили класс .nav-item
в ссылки.
<nav>
<a href="#">Active</a>
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Disabled</a>
</nav>
Работа с гибкими классами
Если вам нужна «отзывчивая» навигационная панель, рассмотрите использование классов флексбокса. Более подробные в спецификации, они предлагают более широкую настройку по отзывчивым брейкпойнтам. В примере ниже наша навигационная панель будет расположена по вертикали на самом маленьком брейкпойнте, затем обретет горизонтальную разметку, которая, начиная с большего брейкпойнта, займет всю доступную ширину.
<nav>
<a href="#">Active</a>
<a href="#">Link</a>
<a href="#">Link</a>
<a href="#">Disabled</a>
</nav>
Доступность
Если вы пользуетесь навигационными элементами для создания навигационной панели, добавьте role="navigation"
в наиболее подходящий для этого родительский контейнер <ul>
, или оберните элементом <nav>
всю навигацию. Не добавляйте атрибут role
в сам <ul>
, т.к. это может помешать вспомогательным технологиям распознать этот элемент как список.
Заметьте, что навигационные панели, даже если они стилизованы как вкладки классами .nav-tabs
, не должны содержать role="tablist"
, role="tab"
или role="tabpanel"
. Это атрибуты подходят лишь для динамических интерфейсов вкладок, как описано в WAI ARIA Authoring Practices. Смотрите, например, про поведение JavaScript c динамическими интерфейсами вкладок в этой секции.
Выпадающие элементы
Добавляйте меню с выпадающими элементами, используя совсем немного HTML и плагин выпадающих элементов JavaScript.
Вкладки с выпадающими элементами
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div>
<a href="#">Action</a>
<a href="#">Another action</a>
<a href="#">Something else here</a>
<div></div>
<a href="#">Separated link</a>
</div>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Подушки с выпадающими элементами
<ul>
<li>
<a href="#">Active</a>
</li>
<li>
<a data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div>
<a href="#">Action</a>
<a href="#">Another action</a>
<a href="#">Something else here</a>
<div></div>
<a href="#">Separated link</a>
</div>
</li>
<li>
<a href="#">Link</a>
</li>
<li>
<a href="#">Disabled</a>
</li>
</ul>
Поведение JavaScript
Используйте плагин JavaScript вкладок — подключите его индивидуально или через компилированный bootstrap.js
— для расширения наших навигационных вкладок и «подушек» и создания вкладочных панелей локального содержимого, или даже выпадающие меню.
Если вы подключаете наши файлы JS, вам потребуется util.js
.
Интерфейсы динамически переключаемых вкладок, как описано в WAI ARIA Authoring Practices, требуют атрибутов role="tablist"
, role="tab"
, role="tabpanel"
и дополнительного атрибута aria-
для возможности передачи их структуры, функциональности и текущего состояния юзерам вспомогательных технологий (таких как экранные читалки).
Заметьте, что интерфейсы динамически переключаемых вкладок не должны содержать выпадающие меню, т.к. это вызовет проблемы с usability и доступностью. С точки зрения удобства для пользователя тот факт, что триггер-элемент текущей отображаемой вкладки не виден немедленно (т.к. он находится внутри закрытого выпадающего меню), может вызвать неудобство. С точки зрения доступности пока еще не существует проверенного способа обозначить и передать такой тип элементов в паттерне стандарте WAI ARIA, что означает, что этот тип элементов нельзя сделать доступным для юзеров вспомогательных технологий.
Raw denim you probably haven’t heard of them jean shorts Austin. Nesciunt tofu stumptown aliqua, retro synth master cleanse. Mustache cliche tempor, williamsburg carles vegan helvetica. Reprehenderit butcher retro keffiyeh dreamcatcher synth. Cosby sweater eu banh mi, qui irure terry richardson ex squid. Aliquip placeat salvia cillum iphone. Seitan aliquip quis cardigan american apparel, butcher voluptate nisi qui.
Food truck fixie locavore, accusamus mcsweeney’s marfa nulla single-origin coffee squid. Exercitation +1 labore velit, blog sartorial PBR leggings next level wes anderson artisan four loko farm-to-table craft beer twee. Qui photo booth letterpress, commodo enim craft beer mlkshk aliquip jean shorts ullamco ad vinyl cillum PBR. Homo nostrud organic, assumenda labore aesthetic magna delectus mollit. Keytar helvetica VHS salvia yr, vero magna velit sapiente labore stumptown. Vegan fanny pack odio cillum wes anderson 8-bit, sustainable jean shorts beard ut DIY ethical culpa terry richardson biodiesel. Art party scenester stumptown, tumblr butcher vero sint qui sapiente accusamus tattooed echo park.
<ul role="tablist">
<li>
<a data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a>
</li>
<li>
<a data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a>
</li>
<li>
<a data-toggle="tab" href="#contact" role="tab" aria-controls="contact" aria-selected="false">Contact</a>
</li>
</ul>
<div>
<div role="tabpanel" aria-labelledby="home-tab">...</div>
<div role="tabpanel" aria-labelledby="profile-tab">...</div>
<div role="tabpanel" aria-labelledby="contact-tab">...</div>
</div>
Если вам необходимо, то можно работать с разметкой на основе <ul>
, как показано выше, или с любой произвольной «рулоной собственной» разметкой. Обратите внимание, что если вы используете <nav>
, вам не следует добавлять к ней role="tablist"
, так как это переопределит собственную роль элемента в качестве ориентира навигации. Вместо этого переключитесь на альтернативный элемент (в приведенном ниже примере, простой <div>
) и оберните вокруг него <nav>
.
Et et consectetur ipsum labore excepteur est proident excepteur ad velit occaecat qui minim occaecat veniam. Fugiat veniam incididunt anim aliqua enim pariatur veniam sunt est aute sit dolor anim. Velit non irure adipisicing aliqua ullamco irure incididunt irure non esse consectetur nostrud minim non minim occaecat. Amet duis do nisi duis veniam non est eiusmod tempor incididunt tempor dolor ipsum in qui sit. Exercitation mollit sit culpa nisi culpa non adipisicing reprehenderit do dolore. Duis reprehenderit occaecat anim ullamco ad duis occaecat ex.
Nulla est ullamco ut irure incididunt nulla Lorem Lorem minim irure officia enim reprehenderit. Magna duis labore cillum sint adipisicing exercitation ipsum. Nostrud ut anim non exercitation velit laboris fugiat cupidatat. Commodo esse dolore fugiat sint velit ullamco magna consequat voluptate minim amet aliquip ipsum aute laboris nisi. Labore labore veniam irure irure ipsum pariatur mollit magna in cupidatat dolore magna irure esse tempor ad mollit. Dolore commodo nulla minim amet ipsum officia consectetur amet ullamco voluptate nisi commodo ea sit eu.
<nav>
<div role="tablist">
<a data-toggle="tab" href="#nav-home" role="tab" aria-controls="nav-home" aria-selected="true">Home</a>
<a data-toggle="tab" href="#nav-profile" role="tab" aria-controls="nav-profile" aria-selected="false">Profile</a>
<a data-toggle="tab" href="#nav-contact" role="tab" aria-controls="nav-contact" aria-selected="false">Contact</a>
</div>
</nav>
<div>
<div role="tabpanel" aria-labelledby="nav-home-tab">...</div>
<div role="tabpanel" aria-labelledby="nav-profile-tab">...</div>
<div role="tabpanel" aria-labelledby="nav-contact-tab">...</div>
</div>
Плагин вкладок работает также с «подушками».
Consequat occaecat ullamco amet non eiusmod nostrud dolore irure incididunt est duis anim sunt officia. Fugiat velit proident aliquip nisi incididunt nostrud exercitation proident est nisi. Irure magna elit commodo anim ex veniam culpa eiusmod id nostrud sit cupidatat in veniam ad. Eiusmod consequat eu adipisicing minim anim aliquip cupidatat culpa excepteur quis. Occaecat sit eu exercitation irure Lorem incididunt nostrud.
Ad pariatur nostrud pariatur exercitation ipsum ipsum culpa mollit commodo mollit ex. Aute sunt incididunt amet commodo est sint nisi deserunt pariatur do. Aliquip ex eiusmod voluptate exercitation cillum id incididunt elit sunt. Qui minim sit magna Lorem id et dolore velit Lorem amet exercitation duis deserunt. Anim id labore elit adipisicing ut in id occaecat pariatur ut ullamco ea tempor duis.
<ul role="tablist">
<li>
<a data-toggle="pill" href="#pills-home" role="tab" aria-controls="pills-home" aria-selected="true">Home</a>
</li>
<li>
<a data-toggle="pill" href="#pills-profile" role="tab" aria-controls="pills-profile" aria-selected="false">Profile</a>
</li>
<li>
<a data-toggle="pill" href="#pills-contact" role="tab" aria-controls="pills-contact" aria-selected="false">Contact</a>
</li>
</ul>
<div>
<div role="tabpanel" aria-labelledby="pills-home-tab">...</div>
<div role="tabpanel" aria-labelledby="pills-profile-tab">...</div>
<div role="tabpanel" aria-labelledby="pills-contact-tab">...</div>
</div>
И с вертикальными «подушками».
Cillum ad ut irure tempor velit nostrud occaecat ullamco aliqua anim Lorem sint. Veniam sint duis incididunt do esse magna mollit excepteur laborum qui. Id id reprehenderit sit est eu aliqua occaecat quis et velit excepteur laborum mollit dolore eiusmod. Ipsum dolor in occaecat commodo et voluptate minim reprehenderit mollit pariatur. Deserunt non laborum enim et cillum eu deserunt excepteur ea incididunt minim occaecat.
Culpa dolor voluptate do laboris laboris irure reprehenderit id incididunt duis pariatur mollit aute magna pariatur consectetur. Eu veniam duis non ut dolor deserunt commodo et minim in quis laboris ipsum velit id veniam. Quis ut consectetur adipisicing officia excepteur non sit. Ut et elit aliquip labore Lorem enim eu. Ullamco mollit occaecat dolore ipsum id officia mollit qui esse anim eiusmod do sint minim consectetur qui.
Fugiat id quis dolor culpa eiusmod anim velit excepteur proident dolor aute qui magna. Ad proident laboris ullamco esse anim Lorem Lorem veniam quis Lorem irure occaecat velit nostrud magna nulla. Velit et et proident Lorem do ea tempor officia dolor. Reprehenderit Lorem aliquip labore est magna commodo est ea veniam consectetur.
Eu dolore ea ullamco dolore Lorem id cupidatat excepteur reprehenderit consectetur elit id dolor proident in cupidatat officia. Voluptate excepteur commodo labore nisi cillum duis aliqua do. Aliqua amet qui mollit consectetur nulla mollit velit aliqua veniam nisi id do Lorem deserunt amet. Culpa ullamco sit adipisicing labore officia magna elit nisi in aute tempor commodo eiusmod.
<div role="tablist" aria-orientation="vertical">
<a data-toggle="pill" href="#v-pills-home" role="tab" aria-controls="v-pills-home" aria-selected="true">Home</a>
<a data-toggle="pill" href="#v-pills-profile" role="tab" aria-controls="v-pills-profile" aria-selected="false">Profile</a>
<a data-toggle="pill" href="#v-pills-messages" role="tab" aria-controls="v-pills-messages" aria-selected="false">Messages</a>
<a data-toggle="pill" href="#v-pills-settings" role="tab" aria-controls="v-pills-settings" aria-selected="false">Settings</a>
</div>
<div>
<div role="tabpanel" aria-labelledby="v-pills-home-tab">...</div>
<div role="tabpanel" aria-labelledby="v-pills-profile-tab">...</div>
<div role="tabpanel" aria-labelledby="v-pills-messages-tab">...</div>
<div role="tabpanel" aria-labelledby="v-pills-settings-tab">...</div>
</div>
Используя атрибуты
Вы можете задействовать навигацию по вкладке или «подушке» без JavaScript, а просто добавив data-toggle="tab"
или data-toggle="pill"
к элементу. Используйте эти атрибуты в .nav-tabs
или .nav-pills
.
<!-- Nav tabs -->
<ul role="tablist">
<li>
<a data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a>
</li>
<li>
<a data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a>
</li>
<li>
<a data-toggle="tab" href="#messages" role="tab" aria-controls="messages" aria-selected="false">Messages</a>
</li>
<li>
<a data-toggle="tab" href="#settings" role="tab" aria-controls="settings" aria-selected="false">Settings</a>
</li>
</ul>
<!-- Tab panes -->
<div>
<div role="tabpanel" aria-labelledby="home-tab">...</div>
<div role="tabpanel" aria-labelledby="profile-tab">...</div>
<div role="tabpanel" aria-labelledby="messages-tab">...</div>
<div role="tabpanel" aria-labelledby="settings-tab">...</div>
</div>
Через JavaScript
Задействуйте переключаемые вкладки через JavaScript (каждая вкладка задействуется индивидуально):
$('#myTab a').on('click', function (e) {
e.preventDefault()
$(this).tab('show')
})
Их можно активировать несколькими методами:
$('#myTab a[href="#profile"]').tab('show') // Select tab by name
$('#myTab li:first-child a').tab('show') // Select first tab
$('#myTab li:last-child a').tab('show') // Select last tab
$('#myTab li:nth-child(3) a').tab('show') // Select third tab
Эффект появления
Чтобы вкладки постепенно появлялись, добавьте класс .fade
в каждый элемент класса .tab-pane
. Первая вкладка .tab-pane
также должна иметь класс .show
, чтобы первоначальный контент был видимым.
<div>
<div role="tabpanel" aria-labelledby="home-tab">...</div>
<div role="tabpanel" aria-labelledby="profile-tab">...</div>
<div role="tabpanel" aria-labelledby="messages-tab">...</div>
<div role="tabpanel" aria-labelledby="settings-tab">...</div>
</div>
Методы
Асинхронные методы и переходы
Все методы API асинхронны и запускают переход. Они возвращаются функции, вызвавшей их, с началом перехода, но до его конца. Плюс, вызов метода к компоненту, выполняющему переход, будет проигнорирован.
Смотрите документацию.
$().tab
Активирует вкладку и контейнер содержимого. Вкладка должна иметь data-target
или href
, «нацеленные» на контейнер-узел в DOM.
<ul role="tablist">
<li>
<a data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a>
</li>
<li>
<a data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a>
</li>
<li>
<a data-toggle="tab" href="#messages" role="tab" aria-controls="messages" aria-selected="false">Messages</a>
</li>
<li>
<a data-toggle="tab" href="#settings" role="tab" aria-controls="settings" aria-selected="false">Settings</a>
</li>
</ul>
<div>
<div role="tabpanel" aria-labelledby="home-tab">...</div>
<div role="tabpanel" aria-labelledby="profile-tab">...</div>
<div role="tabpanel" aria-labelledby="messages-tab">...</div>
<div role="tabpanel" aria-labelledby="settings-tab">...</div>
</div>
<script>
$(function () {
$('#myTab li:last-child a').tab('show')
})
</script>
.tab(‘show’)
Выбирает данную вкладку и показывает связанную с ней «подушку». Любая другая вкладка, которая была выбрана до этого, становится «невыбранной» и ее «подушка» прячется. Возвращается к функции-вызову до того, как модальный элемент показан или скрыт (т.е. до того, как произойдет событие shown.bs.tab
).
$('#someTab').tab('show')
.tab(‘dispose’)
Уничтожает вкладку элемента.
События
При показе новой вкладки события запускаются в такой порядке:
hide.bs.tab
(на текущей активной вкладке)show.bs.tab
(на той, которая вот-вот покажется)hidden.bs.tab
(на предыдущей активной вкладке, как для событияhide.bs.tab
)shown.bs.tab
(на вкладке, только что ставшей активной и только что показанной, такое же как для событияshow.bs.tab
)
Если ни одна вкладка не была активна, события hide.bs.tab
и hidden.bs.tab
не произойдут.
Тип события | Описание |
---|---|
show.bs.tab | Это событие запускается при показе вкладки, но до того, как новая вкладка показана. Используйте event.target и event.relatedTarget для «нацеливания» на активную вкладку и предыдущую активную вкладку (если доступно) соответственно. |
shown.bs.tab | Это событие запускается при показе вкладки после того, как новая вкладка показана. Используйте event.target и event.relatedTarget для «нацеливания» на активную вкладку и предыдущую активную вкладку (если доступно) соответственно. |
hide.bs.tab | Это событие запускается, когда новая вкладка вот-вот покажется (и т.о. – предыдущая активная вкладка вот-вот скроется). Используйте event.target и event.relatedTarget для «нацеливания» на текущую активную вкладку и следующую активную вкладку соответственно. |
hidden.bs.tab | Это событие запускается, когда новая вкладка показана (и т.о. предыдущая активная вкладка скрыта). Используйте event.target и event.relatedTarget для «нацеливания» на предыдущую активную вкладку и новую активную вкладку соответственно. |
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
e.target // newly activated tab
e.relatedTarget // previous active tab
})