Featherlight — легковесная библиотека для создания модальных окон, которая идеально подходит для интеграции с Vue благодаря своей простоте и гибкости. Для использования библиотеки в Vue сначала необходимо подключить CSS и JS-файлы Featherlight. Это можно сделать через пакетный менеджер npm:
npm install featherlight
Затем в основном файле приложения или в компоненте необходимо импортировать стили и скрипт:
import 'featherlight/dist/featherlight.min.css';
import 'featherlight';
После этого библиотека готова к использованию в рамках компонентов Vue.
Featherlight работает через атрибуты data-featherlight
на элементах DOM. В Vue это реализуется через стандартные директивы и
обработчики событий. Например, для открытия модального окна с содержимым
из другого элемента:
<template>
<div>
<button @click="openModal">Открыть окно</button>
<div id="modal-content" style="display: none;">
<h2>Заголовок модального окна</h2>
<p>Содержимое окна.</p>
</div>
</div>
</template>
<script>
export default {
methods: {
openModal() {
$.featherlight('#modal-content');
}
}
}
</script>
Важный момент: Featherlight оперирует с реальными DOM-элементами, поэтому элементы, передаваемые в модальное окно, должны существовать в DOM на момент вызова.
Featherlight поддерживает динамическое создание контента, что удобно для Vue, где данные часто приходят асинхронно. Можно передавать HTML-строку или даже компонент Vue через render-функцию. Простейший вариант с динамическим HTML:
methods: {
openDynamicModal(content) {
$.featherlight(`<div><h3>Динамический заголовок</h3><p>${content}</p></div>`);
}
}
Для использования с компонентами Vue потребуется немного дополнительной обертки, чтобы смонтировать компонент в элемент, передаваемый Featherlight:
import { createApp } from 'vue';
import MyModalComponent from './MyModalComponent.vue';
methods: {
openComponentModal() {
const container = document.createElement('div');
createApp(MyModalComponent).mount(container);
$.featherlight(container);
}
}
Такой подход позволяет интегрировать модальные окна с реактивными данными Vue без потери функциональности.
Featherlight предоставляет обширный набор опций для управления поведением модальных окон. Основные из них:
variant — позволяет добавлять CSS-классы к окну для
кастомизации.closeIcon — задает иконку или текст кнопки
закрытия.persist — при значении true окно не
удаляется из DOM после закрытия, что полезно для повторного
использования.afterOpen, beforeClose,
afterClose — колбэки, которые вызываются на соответствующих
стадиях жизненного цикла окна.Пример использования опций в Vue:
methods: {
openCustomModal() {
$.featherlight('#modal-content', {
variant: 'custom-style',
closeIcon: '✕',
persist: true,
afterOpen: function() {
console.log('Модальное окно открыто');
}
});
}
}
Для сохранения реактивности Vue важно управлять данными внутри модального окна через свойства компонента или Vuex. Например, передача данных в модальное окно через шаблон:
<template>
<div>
<button @click="showModal = true">Открыть окно</button>
<div v-if="showModal" id="modal-content" style="display: none;">
<p>{{ message }}</p>
<button @click="showModal = false">Закрыть</button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
showModal: false,
message: 'Привет из Vue!'
};
},
watch: {
showModal(val) {
if (val) {
$.featherlight('#modal-content');
}
}
}
}
</script>
Таким образом, можно использовать реактивные данные Vue совместно с модальными окнами Featherlight без потери синхронизации состояния.
Featherlight предоставляет минимальный базовый CSS, что позволяет
легко добавлять собственные стили. Через опцию variant
можно назначать класс, который расширяет стили:
.featherlight.custom-style {
background-color: #f0f0f0;
border-radius: 12px;
padding: 20px;
max-width: 500px;
}
Стили можно делать динамическими, изменяя класс через методы Vue в зависимости от состояния приложения.
Featherlight поддерживает загрузку изображений и AJAX-контента напрямую:
methods: {
openImageModal() {
$.featherlight('path/to/image.jpg');
},
openAjaxModal() {
$.featherlight({
ajax: '/api/modal-content',
afterContent: function() {
console.log('Контент загружен');
}
});
}
}
Для Vue это удобно при необходимости динамически загружать данные с сервера и отображать их в модальном окне без дополнительного ручного управления DOM.
Featherlight предоставляет события и методы для полного контроля модального окна:
$.featherlight.current() — возвращает текущий экземпляр
открытого окна.close() — метод экземпляра для программного
закрытия.beforeOpen, afterOpen,
beforeClose, afterClose.Пример использования в Vue для закрытия модального окна программно:
methods: {
closeModal() {
const fl = $.featherlight.current();
if (fl) fl.close();
}
}
Это позволяет синхронизировать состояние окна с реактивной логикой приложения.