Документация — модификации для Zero-блоков

Аккордеон в Zero-блоке

Модификации
Zero-аккордеон
Документация
10 минут
Модификация позволяет создавать полностью кастомные аккордеоны внутри Zero-блоков со своими стилями и поведением.

Как работает модификация

Общие механики

Аккордеон преобразует свёрстанные вкладки и контент в карточки и помещает их в общий контейнер с исходными размерами и позиционированием. В качестве вкладок и контента выступают группы Object с классом .accordion и .accordion-content.
Раскрытие и скрытие карточек осуществляется за счет добавления к ним класса .collapsed, который регулирует высоту видимого контента.
Изменение состояния карточек запускает автоматическое вычисление размеров аккордеона и регулирует высоту Zero-блока на их основе. При расчете также учитываются другие элементы в блоке, которые определяют его минимальную высоту, а элементы, располагающиеся ниже аккордеона, сдвигаются пропорционально изменению его размеров так, что отступ между ними и аккордеоном сохраняется постоянным.
Иконки раскрытия .accordion-icon располагаются во вкладках и привязываются к состоянию карточек, в которых они находятся. В генераторе кода им можно задать стили активного состояния.
Изменение размеров экрана перезапускает отрисовку аккордеона: он разбирается до первоначального состояния и собирается заново с учетом новых координат и настроек элементов.

Классический аккордеон в Zero-блоке

Аккордеон, в котором все вкладки и контент располагаются друг под другом в одном Zero-блоке. С его помощью можно создавать как обычные выпадающие списки, так и встраивать их в хэдер, меню, поп-апы и др.
Поддерживает вёрстку в автолэйауте (см. пример: Аккордеон с автолэйаутом)

Аккордеон с несколькими колонками

Классический аккордеон, в котором вкладки и контент располагаются в несколько колонок. Модификация автоматически определяет их порядок (слева направо и сверху вниз), и создаёт несколько аккордеонов, связанных друг с другом.

Аккордеон из отдельных Zero-блоков

Распространенный вариант аккордеона, в котором каждая вкладка и контент – отдельный блок, раскрывающийся по клику. Поддерживает как Zero, так и стандартные блоки, легко устанавливается, но ограничен по возможностям вёрстки.

Начало работы

Установка библиотеки

Для работы аккордеона необходимо подключить библиотеку модификаций в <head> сайта. Скрипт устанавливается только один раз и автоматически загружает нужный мод при вызове функции.
 <script src="https://cdn.postnikovmd.com/tilda@1.4/mods.min.js"></script>
Альтернативный способ установки предполагает встраивание исполняемого кода непосредственно перед инициализацией слайдера. Подробнее: Синхронизация обновлений в модификациях
Дальнейшая настройка производится по инструкции к каждому из вариантов:

Элементы

Ниже приведены элементы, из которых состоит аккордеон. Они задаются и настраиваются в интерфейсе Тильды.
Элемент
Описание
Класс/ссылка
Вкладки*
Группы Object со вкладками, при взаимодействии с которыми будет раскрываться контент карточек. Для того, чтобы карточки сохраняли свои размеры, добавьте прозрачный шейп или подложку по их границам или задайте им внутренние отступы через padding.
.accordion
Контент*
Группы Object с раскрывающимся контентом. Их количество должно совпадать с количеством вкладок в блоке. При установке классов убедитесь, что они заданы только группам и не указаны у элементов внутри них.
.accordion-content
Иконки
Элементы, которые будут переворачиваться и менять стили при раскрытии карточек. Должны располагаться во вкладках и иметь квадратные пропорции. Изменение стилей активного состояния (фон, бордер и иконка) поддерживаются только для шейпов с фоновым изображением.
.accordion-icon
Кнопки раскрытия
Элементы, при нажатии на которые необходимо раскрывать и скрывать карточки. Работают только для аккордеона из отдельных блоков. В каждой вкладке может быть только одна такая кнопка.
.accordion-button
Доп. элементы
Любые элементы, имеющие привязку к карточкам аккордеона. Используются в случае, когда необходимо переключать состояние не только карточек, но и сопутствующих им элементов.
.accordion-elem
Карточки аккордеона
Flex-группы Object, состоящие из вкладки и контента и являющиеся для них общим контейнером. По-умолчанию генерируется автоматически, но можно задать вручную через группу Object с автолэйаутом. Свёрнутым карточкам присваивается класс .collapsed.
.tn-accordion-card
Аккордеон
Flex-группа Object с карточками аккордеона, являющаяся для них общим контейнером. По-умолчанию генерируется автоматически, но можно задать вручную через группу Object с автолэйаутом. Не должна иметь никаких стилей и отступов. Если между карточками необходимо добавить вертикальный отступ, задайте параметр gap в коде инициализации.
.tn-accordion
Нижняя часть карточки
Группа Object, располагающаяся внутри карточки после вкладки и контента. Входит в состав карточки аккордеона и подходит для добавления в конец разделительных линий или иконок. Должна иметь ту же ширину, что и вкладки/контент.
.tn-accordion-bottom
Статические элементы
Элементы, которые необходимо исключить при расчете высоты Zero-блока. Подходит для фоновых изображений, линий и других элементов, чья высота может препятствовать закрытию аккордеона.
.tn-accordion-exclude
Динамические элементы
Элементы, которые должны сдвигаться при изменении раскрытии карточек аккордеона. По-умолчанию определяются автоматически на основании их положения относительно аккордеона, но можно также задать их вручную, добавив им указанный класс.
.tn-accordion-dynamic
* – обязательные элементы

Функции и параметры

Методы, с помощью которых можно управлять работой аккордеона. Подгружаются асихнронно как функции объекта accordion.
Функция
Описание
Триггер
accordion.init(selector, params)
Инициализирует аккордеон
DOM Content Loaded, Window Resize
accordion.destroy(selector)
Отключает функционал аккордеона и возвращает блок к первоначальному состоянию
Window Resize
В качестве аргументов для настройки аккордеона передаются следующие параметры:
Параметр
Описание
Тип
Значение по-умолчанию
selector
Класс аккордеона
string
-
params.tabs
Класс вкладок аккордеона
string
'.accordion'
params.icons
Класс иконок во вкладках
string
'.accordion-icon'
params.content
Класс содержимого карточек
string
'.accordion-content'
params.elems
Класс доп.элементов для вкладок/содержимого
string
'.accordion-elem'
params.gap
Вертикальный отступ между карточками (px)
number
0
params.hover
Переключение аккордеона по наведению мыши
boolean
false
params.expand
Раскрывать первую карточку по-умолчанию
boolean
false
params.collapse
Отображение только одной раскрытой карточки
boolean
false
params.scroll
Перемещение к раскрытой карточке
boolean
false
params.transition
Скорость раскрытия карточек
number
300
params.easing
Функция перехода для раскрытия
string
'ease-in-out'
params.event
Пользовательское событие для запуска аккордеона
string
-
params.timeout
Задержка после срабатывания события
number
0
params.style
Стили слайдера
object
{}

Стили

В params.style можно также передавать стили аккордеона и его элементов. Они преобразовываются в css-переменные и отображаются при запуске мода.
Параметр
Описание
Тип
Пример
active.backgroundColor
Цвет фона активной карточки
string
'#FFFFFF'
active.borderColor
Цвет бордера активной карточки
string
'#FFFFFF'
active.borderWidth
Ширина бордера активной стрелки
number
1
active.borderRadius
Радиус скругления активной карточки
number
4
elems.opacity
Непрозрачность доп.элементов неактивных карточек
number
0.8
icon.backgroundColor
Цвет фона активной иконки
string
'#FFFFFF'
icon.borderColor
Цвет бордера активной иконки
string
'#FFFFFF'
icon.borderWidth
Ширина бордера активной иконки
number
1
icon.backgroundImage
Изображение активной иконки
string
'https://...'
icon.rotate
Угол поворота активной иконки
number
180

События

Пользовательские события позволяют управлять последовательностью инициализации модификаций и используются для совмещения нескольких модов или стороннего кода. Их можно использовать, чтобы:
Запустить аккордеон по срабатыванию события
Отложить инициализацию слайдера можно с помощью параметров event и timeout. Например, запустить аккордеон через 100ms после срабатывания customEvent можно таким образом:
accordion.init(".uc-accordion", { event: "customEvent", timeout: 100 })
Если модификация должна запуститься после срабатывания сразу нескольких событий, достаточно перечислить их через запятую: event: "customEvent1, customEvent2, customEvent3".
Запустить сторонний код после отрисовки аккордеона
Если код нужно выполнить после того, как аккордеон полностью запустится, добавьте слушатель события accordioninit-id, где accordioninit – событие отрисовки аккордеона, id – класс блока с аккордеоном без префикса uc или rec. Например, если у блока со аккордеоном класс .uc-accordion1, то слушатель события добавляется следующим образом:
window.addEventListener("accordioninit-accordion1", function(){ ... })
Запустить другую модификацию после отрисовки аккордеона
Логика работы пользовательских событий одинакова для всех модификаций и помогает интегрировать их друг с другом. Например, запустить поп-ап после отрисовки аккордеона можно через событие accordioninit:
popup.init(".uc-accordion", { event: "accordioninit-accordion" })

Инициализация

Код инициализации аккордеона вставляется в блок T123 в конец страницы. Его можно скопировать в генераторе кода или добавить на страницу вручную. В исходном виде он выглядит таким образом:
<!--accordion.js Аккордеон в Zero-блоке. https://postnikovmd.com/mods/accordion-->
<script>accordion.init(".uc-accordion")</script>

Примеры использования

Классический аккордеон в Zero-блоке

Создаётся Zero-блок с классом .uc-accordion и аккордеоном в раскрытом состоянии. Вкладкам присваиваются классы .accordion, контенту – .accordion-content. По желанию добавляется иконка .accordion-icon и задаются стили в генераторе кода:
<script>accordion.init(".uc-accordion", { collapse: true, style: { active: { backgroundColor: "#F8F7FA", borderColor: "#F3F2F7", borderWidth: 1, borderRadius: 12 }, icon: { backgroundColor: "#18181B", backgroundImage: "https://static.postnikovmd.com/img/accordion-arrow-w.svg" } } })</script>

Аккордеон с автолэйаутом

Классический аккордеон, расположенный в контейнере с автолэйаутом. Используется, когда необходимо расположить его в общей карточке и подстраивать её высоту под размер контента.
Верстается так же, как и классический вариант, но вкладки и контент дополнительно объединяются во flex-карточки с классом .tn-accordion-card, а эти карточки – во flex-группу с классом .tn-accordion. При необходимости общую группу с аккордеоном можно и дальше объединять с другими элементами, повышая её уровень вложенности.
Такой аккордеон может быть визуально не отличим от классического , но добавлять карточки в интерфейсе намного удобнее.
<script>accordion.init(".uc-accordion", { collapse: true, style: { active: { backgroundColor: "#F8F7FA", borderColor: "#F3F2F7", borderWidth: 1, borderRadius: 12 }, icon: { backgroundColor: "#18181B", backgroundImage: "https://static.postnikovmd.com/img/accordion-arrow-w.svg" } } })</script>
При вёрстке в автолэйауте убедитесь, что высота артборда выставлена, как Fixed. Автовысота будет препятствовать его корректному раскрытию.

Аккордеон в хэдере и выпадающем меню

Классический аккордеон, совмещенный с модификацией Zero-хэдера. Свёрстан внутри выпадающего меню и меню-бургера с использованием автолэйаута.
<!--Инициализируем хэдер-->
<script>header.init(".uc-header", { hideDistance: 360, hideDistanceMobile: 240, style: { active:{ color: "#FFFFFF", backgroundColor: "#2C2B31", borderColor: "#2C2B31", underline: 1 }, hover:{ color: "#FFFFFF", backgroundColor: "#7F74F7", borderColor: "#7F74F7" } } })</script>
<script>submenu.init(".uc-submenu", { style: { hover: { color: "#988FFF" }, link:{ color: "#FFFFFF", backgroundColor: "#7F74F7", borderColor: "#7F74F7" } } })</script>
<script>menu.init(".uc-menu", { fullscreen: true, animation: 'fade', style: { active:{ color: "#A3A3A4" }, hover:{ color: "#988FFF" } } })</script>

<!--Инициализируем аккордеон в хэдере-->
<script>accordion.init(".uc-submenu", { hover: true, style: { icon: { rotate: -90 } } })</script>
<script>accordion.init(".uc-menu")</script>
Для аутентичного поведения выпадающего меню, задали ему раскрытие по наведению и повернули активную иконку на 90 градусов против часовой стрелки.

Аккордеон внутри поп-апа

Если аккордеон находится внутри кастомного поп-апа, то запускать его необходимо перед помещением в поп-ап. Добавляем пользовательское событие accordioninit в код инициализации поп-апа:
<!--Инициализируем аккордеон-->
<script>accordion.init(".uc-popup", { collapse: true, style: { active: { backgroundColor: "#F8F7FA", borderColor: "#F3F2F7", borderWidth: 1, borderRadius: 12 }, icon: { backgroundColor: "#18181B", backgroundImage: "https://static.postnikovmd.com/img/accordion-arrow-w.svg" } } })</script>

<!--Отслеживаем инициализацию аккордеона и запускаем кастомный поп-ап-->
<script>popup.init(".uc-popup", { event: "accordioninit-popup", animation: "zoom", style: { blur: 4 } })</script>

Аккордеон c несколькими колонками

Для создания аккордеона с несколькими колонками, вкладки и контент располагают друг под другом в несколько рядов. Первая карточка должна находиться в слоях в самом низу, каждая следующая — на уровень выше, а для каждого следующего ряда карточки располагаются на уровень выше, чем карточки предыдущего.
Можно верстать как в классическом виде, так и с помощью автолэйаута.
<script>accordion.init(".uc-accordion", { style: { active: { backgroundColor: "#F8F7FA", borderColor: "#F3F2F7", borderWidth: 1, borderRadius: 12 }, icon: { backgroundColor: "#18181B", backgroundImage: "https://static.postnikovmd.com/img/accordion-arrow-w.svg" } } })</script>

Аккордеон из отдельных Zero-блоков

Аккордеон, в котором каждая вкладка и контент – отдельный блок, раскрывающийся по клику. Блокам со вкладками присваивается класс .uc-accordion, блокам с контентом – .uc-accordion-block, а иконке – .accordion-icon.
По-умолчанию контент раскрывается при нажатии на всю вкладку, но при необходимости ограничить область клика, в неё можно добавить элемент с классом .accordion-button.
Сгенерированный код идентичен классическому аккордеону:
<script>accordion.init(".uc-accordion", { collapse: true, style: { icon: { backgroundColor: "#18181B", backgroundImage: "https://static.postnikovmd.com/img/accordion-arrow-w.svg" } } })</script>

Распространенные проблемы

Карточки аккордеона остаются развернутыми

Проблема возникает, когда в аккордеоне не совпадает количество вкладок и контента. Проверьте, что классы .accordion и .accordion-content заданы только группам с типом Object, а их количество совпадает.

После аккордеона остается пустое пространство

Одна из распространенных проблем, возникающая по нескольким причинам:
В блоке присутствуют элементы, которые мешают ему закрыться.
Элементы, нижняя граница которых располагается ниже, чем сам аккордеон, могут препятствовать его закрытию, так как учитываются при расчете минимальной высоты блока. Для решения проблемы добавьте им класс .tn-accordion-exclude, чтобы исключить их из логики обработки, или сделайте их размеры меньше.
В мобильных версиях есть элементы, вынесенные за пределы экрана.
Положение таких элементов также учитывается при расчете высоты блока. Для корректного отображения лучше выравнивать их относительно верхней границы аккордеона или всего блока.
Между вкладками, контентом или карточками есть отступы
При создании аккордеона модификация объединяет созданные группы во flex-контейнеры, которые не учитывают отступы, заданные в Тильде. Из-за этого карточки сдвигаются вверх, и в конце блока остается пустое пространство. Чтобы решить эту проблему, задайте нулевые отступы между карточками и регулируйте их через параметр gap в коде инициализации.

Блок с аккордеоном обрезается

У данной проблемы есть две возможные причины:
Исходная высота блока меньше, чем сам аккордеон
Модификация вычисляет отступ от нижней границы раскрытого аккордеона до края блока, и учитывает его при дальнейшем раскрытии карточек. Если высота блока в Тильде меньше, чем аккордеон, данный отступ становится отрицательным и сохраняется при дальнейшей работе мода. Для исправления проблемы убедитесь, что высота блока вмещает весь аккордеон в раскрытом состоянии.
В настройках Zero-блока задана автовысота Hug
Данная настройка конфликтует с логикой изменения высоты аккордеона при его раскрытии. Установите фиксированную высоту артборда для решения данной проблемы.

Пропадает отступ между карточками аккордеона

При создании аккордеона модификация объединяет созданные группы во flex-контейнеры, которые не учитывают отступы, заданные в Тильде. Из-за этого карточки сдвигаются вверх, и в конце блока остается пустое пространство. Чтобы решить эту проблему, задайте нулевые отступы между карточками и регулируйте их через параметр gap в коде инициализации.
Если необходимо добавить вертикальный отступ между вкладкой и контентом, используйте для группы с контентом padding-top.

Не работает иконка раскрытия

Если иконка некорректно обрезается или смещается при повороте, убедитесь, что она имеет квадратные пропорции. Изменение стилей активной иконки поддерживается только для элементов с типом Shape.

Карточки перемешиваются в случайном порядке

Данная проблема часто возникает, если вкладки и контент некорректно расположены в слоях или имеют отрицательные отступы.
Если карточки перемешались в аккордеоне с несколькими колонками, убедитесь, что в каждом ряду вкладки и контент выровнены по левому краю, а верхняя граница каждой колонки совпадает.

Возникает конфликт с другими модами

Zero-аккордеон совместим с большинством модификаций из исходной библиотеки. Исключение: вкладки, поп-ап, и слайдер, которые необходимо запускать через пользовательские события.
Модификации других авторов или сторонний код, влияющий на отображение элементов при загрузке (например, скрывающий или перемещающий их), необходимо запускать после отрисовки аккордеона. С решениями, влияющими на высоту Zero-блока, модификация не совместима.

Если при установке что-то пошло не так

Добавьте параметр ?showerrors в конец ссылки, чтобы увидеть ошибки и рекомендации по их исправлению, или параметр ?showparams=accordion, чтобы посмотреть настройки и переменные аккордеона. Данные функции работают на любом сайте с установленной библиотекой.