# Всплывающие блоки

## Общая информация

Если есть необходимость использовать HTML во всплывающих подсказках([tooltip](/components/tooltip.md)), то вам могут помочь всплывающие блоки.

### Разметка <a href="#markup" id="markup"></a>

```html
<div id="popup" class="popup">
    <div class="popup-title">Header</div>
    <div class="popup-content">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi, sit?</div>
</div>
<button type="button" class="btn" data-popup="#popup">Example</button>
```

{% embed url="<https://codepen.io/pipui/pen/GRYJmVd>" %}
Пример работы кода выше
{% endembed %}

## Поддерживаемые атрибуты

Атрибут <mark style="color:orange;">`data-popup`</mark> является инициатором события вызова всплывающего блока. Данный атрибут может принимать в качестве значения селектор на объект всплывающего блока.

### title & content

Вы так же можете обойтись без дополнительного блока и указать название и описание через атрибуты <mark style="color:orange;">`data-popup-title`</mark> и <mark style="color:orange;">`data-popup-content`</mark>, однако в таком случае HTML поддерживаться не будет, но и потребность в указании атрибута data-popup отпадёт.

```html
<button type="button" class="btn" data-popup data-popup-content="Простейший всплывающий блок созданный через атрибуты" data-popup-title="Заголовок">Example #1</button>
```

{% embed url="<https://codepen.io/pipui/pen/LYgVqyp>" %}
Пример работы кода выше
{% endembed %}

Значения атрибутов <mark style="color:orange;">`data-popup-title`</mark> и <mark style="color:orange;">`data-popup-content`</mark> не являются обязательными, так же как и их аналог через отдельную HTML разметку <mark style="color:orange;">`.popup-title`</mark> и <mark style="color:orange;">`.popup-content`</mark>.

### target

С помощью атрибута <mark style="color:orange;">`data-popup-target`</mark> можно указать селектор элемента к которому будет привязан всплывающий блок.

```html
<span id="target1">Target #1</span>
  
<button type="button" class="btn mt-100" data-popup data-popup-target="#target1" data-popup-content="Всплывающий блок с привязкой к другому объекту" data-popup-title="Заголовок">Example #4</button>
```

{% embed url="<https://codepen.io/pipui/pen/gOBpqzG>" %}
Пример работы кода выше
{% endembed %}

### overlay

Атрибут <mark style="color:orange;">`data-popup-overlay="true"`</mark> включает затемнение фона при появлении всплывающего блока. По умолчанию данная функция отключена.

```html
<button type="button" class="btn" data-popup data-popup-overlay="true" data-popup-content="Всплывающий блок с затемнением" data-popup-title="Заголовок">Example #5</button>
```

{% embed url="<https://codepen.io/pipui/pen/PoyqLOX>" %}
Пример работы кода выше
{% endembed %}

### autoclose

В качестве значение атрибута <mark style="color:orange;">`data-popup-autoclose`</mark> принимается целое число - кол-во миллисекунд, по истечению которых всплывающий блок будет автоматически закрыт.

По умолчанию автозакрытие имеет значение 0, что будет означать отсутствие автоматического закрытия.

```html
<button type="button" class="btn" data-popup data-popup-autoclose="3000" data-popup-content="Всплывающий блок с затемнением" data-popup-title="Заголовок">Example</button>
```

{% embed url="<https://codepen.io/pipui/pen/poxJYYb>" %}
Пример работы кода выше
{% endembed %}

### overclose

Атрибут <mark style="color:orange;">`data-popup-overclose`</mark> включает или отключает закрытие всплывающего блока при нажатии на область, которая не является самим блоком.

По умолчанию данный атрибут имеет значение true.

```html
<button type="button" class="btn" data-popup data-popup-overclose="true" data-popup-content="Всплывающий блок с закрытием" data-popup-title="Заголовок">[data-popup-overclose="true"]</button>
  
  <button type="button" class="btn" data-popup data-popup-overclose="false" data-popup-content="Всплывающий блок без закрытия" data-popup-title="Заголовок">[data-popup-overclose="false"]</button>
```

{% embed url="<https://codepen.io/pipui/pen/mdzJogv>" %}
Пример работы кода выше
{% endembed %}

### direction

По умолчанию направление вывода всплывающего блока установлено как вверх (up) и меняется в зависимости от доступности области, однако вы можете поменять значение по умолчанию на своё с помощью атрибута <mark style="color:orange;">`data-popup-direction`</mark>, однако блок по прежнему будет проверять доступность выбранного направления или искать другое.

На данный момент доступны следующие направления

* **up** - вверх (по умолчанию)
* **down** - вниз
* **left** - влево
* **right** - вправо

```html
<button type="button" class="btn" data-popup data-popup-content="Блок будет выведен сверху" data-popup-title="Вверх">[data-popup-direction="up"]</button>
    <button type="button" class="btn" data-popup data-popup-direction="down" data-popup-content="Блок будет выведен снизу" data-popup-title="Вверх">[data-popup-direction="down"]</button>
    <button type="button" class="btn" data-popup data-popup-direction="left" data-popup-content="Блок будет выведен слева" data-popup-title="Вверх">[data-popup-direction="left"]</button>
    <button type="button" class="btn" data-popup data-popup-direction="right" data-popup-content="Блок будет выведен справа" data-popup-title="Вверх">[data-popup-direction="right"]</button>
```

{% embed url="<https://codepen.io/pipui/pen/NWOqmNx>" %}
Пример работы кода выше
{% endembed %}

## Javascript

Для работы с всплывающими блоками необходимо создать экземпляр класса PipUI.Popup.\
По умолчанию инициализация происходит автоматически при клике на элемент\
с атрибутом \[data-popup].

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

Конструктор класса PipUI.Popup принимает 2 параметра: HTMLElement и Object

Первый параметр - селектор объекта самого блока всплывающего окна. Может быть пустым.

Второй параметр - объект опций

```javascript
let popup = new PipUI.Popup('#popup-box');
```

### Опции

<pre><code>// Выводить в консоль отладку
debug: false

// Селектор или HTMLElement к которому будет привязан всплывающий блок
target: undefined

// Список триггеров, при нажатии на которые будет появляться/исчезать блок
triggers: []

<strong>// Название, выводимое в всплывающем блоке. Если не указано, то появится без названия.
</strong>title: ''

// Содержимое, выводимое в всплывающем блоке. Если не указано, то появится без содержимого.
content: ''

// Направление вывода. Поддерживаются: up, down, left, right
direction: 'up'

// Выводить ли оверлей
overlay: false

// Кол-во миллисекунд, через которое блок автоматически закроется
autoclose: 0

// Закрывать всплывающий блок при клике на область вне самого блока
overclose: true

// Класс присваиваемый всплывающему блоку при открытии
openedClass: 'popup-active'

// Класс присваиваемый оверлею при открытии
openedOverlayClass: 'overlay-active'

// Класс присваиваемый триггеру при открытии
openedTriggerClass: 'active'

// Класс элемента к которому привязан всплывающий блок
targetClass: 'popup-target'

// Класс, присваиваемый элементу к которому привязан всплывающий блок, при открытии
targetActiveClass: 'popup-target-active'

// Функция обратного вызова срабатываемая при появлении всплывающего блока
openCallback: undefined

// Функция обратного вызова срабатываемая при исчезании всплывающего блока
closeCallback: undefined

// Функция обратного вызова срабатываемая при обновлении всплывающего блока
updateCallback: undefined

// Функция обратного вызова срабатываемая при изменении позиции всплывающего блока
repositionCallback: undefined

// Шаблоны
templates: {
     // Разметка основного блока всплывающего окна
     box: '...'
     
     // Разметка блока оверлея
     overlay: '...'
}
</code></pre>

### Методы

```javascript
let popup = new PipUI.Navbar('#popup');

popup.getID() // Вернет уникальный идентификатор всплывающего блока

popup.setOptions(object) // Изменить опции блока

popup.getOptions() // Получить опции блока

popup.getPosition(name) // Получить актуальную позицию блока(служит для обновления)
// Параметр name является направлением позиции

popup.updatePosition() // Обновить позицию всплывающего блока

popup.update() // Обновить всплывающее окно

popup.hide(callback) // Скрыть панель
// Параметр callback является приоритетной функцией обратного
// вызова при завершении скрытия, если она задана и через опции

popup.show(callback) // Показать блок
// Параметр callback является приоритетной функцией обратного
// вызова при завершении отображения, если она задана и через опции

popup.isOpen() // Текущее состояние блока (открыт или закрыт)

popup.open(callback) // Отобразить блок
// Параметр callback является приоритетной функцией обратного
// вызова при завершении отображения, если она задана и через опции

popup.close(callback) // Скрыть блок
// Параметр callback является приоритетной функцией обратного
// вызова при завершении скрытия, если она задана и через опции
```

### События

<table><thead><tr><th width="281.3333333333333">Триггер</th><th>Описание</th><th>Инициатор</th></tr></thead><tbody><tr><td>open-popup-pipui</td><td>Срабатывает при открытии всплывающего блока</td><td>.popup</td></tr><tr><td>close-popup-pipui</td><td>Срабатывает при закрытии всплывающего блока</td><td>.popup</td></tr><tr><td>update-popup-pipui</td><td>Срабатывает при обновлении содержимого всплывающего блока</td><td>.popup</td></tr><tr><td>update-position-popup-pipup</td><td>Срабатывает при обновлении позиции всплывающего блока</td><td>.popup</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://v2-0-0.pipui.ru/components/popup.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
