Создание адаптивных Vue компонентов с помощью ResizeObserver

Создание адаптивных Vue компонентов с помощью ResizeObserver

От автора: привет, ребята! Сегодня хочу поделиться с вами небольшой, но полезной статьей про создание компонента Vue. В моем текущем проекте у меня много многоразовых компонентов (я назвал их «виджетами»), которые можно разместить где угодно. И у меня возникла проблема с адаптивным дизайном. Наконец, я понял, что css @media запросы абсолютно не подходят под мой случай.

Так в чем проблема?

Представьте, что у нас есть компонент PostsItem . У нас есть PostsPage со списком постов:

Создание адаптивных Vue компонентов с помощью ResizeObserver

Всего несколько строк CSS, не так ли?

И мы также хотим, чтобы в мобильном представлении тоже все было хорошо. Это может выглядеть так:

Создание адаптивных Vue компонентов с помощью ResizeObserver

Вы можете сказать «легко», @media решает эту проблему, не так ли?

Хорошо, способ работает. Но что, если мы будем использовать наш компонент PostsItem в другом месте?

Создание адаптивных Vue компонентов с помощью ResizeObserver

О, бедные наши глаза. У нас большой экран, но мы не ожидали увидеть 3 поста подряд.

Итак, самая большая проблема @media запросов: «Адаптивность компонента зависит от размера экрана, а должна полагаться на собственные размеры»

vНо в этом случае компоновка компонентов зависит только от них самих. Эти компоненты должны быть атомарными, независимо определять свой собственный размер и адаптировать макет под себя.

Нам нужны локальные адаптивные стили. И здесь нам поможет ResizeObserver!

ResizeObserver

ResizeObserver — это новая функция, которая позволяет получать уведомления, когда прямоугольник содержимого элемента изменил свой размер, и реагирует на это соответствующим образом.

Использовать его очень просто:

Вы можете сказать, что у него плохая поддержка в браузерах:

Создание адаптивных Vue компонентов с помощью ResizeObserver

Но, к счастью, у ResizeObserver есть polyfill, основанный на MutationObserver:

Создание адаптивных Vue компонентов с помощью ResizeObserver

Использование с Vue

Я сделал небольшую обертку ResizeObserver для Vue.js (также работает на Nuxt.js ), которая позволяет легко работать с адаптивными компонентами:

И теперь макет выглядит отлично, даже когда мы помещаем 3 поста подряд:

Создание адаптивных Vue компонентов с помощью ResizeObserver

Теперь наш компонент действительно независим! Это также дает возможность определять другую разметку html, а не только CSS. Например, я добавил вкладки и «доп. маленькое» представление поста для небольшого блока:

Создание адаптивных Vue компонентов с помощью ResizeObserver

Кроме того, хочу отметить, что полностью удалил все @media запросы из текущего проекта в пользу ResizeObserver.

UPD: бонус: директива v-responsive

Я добавил v-responsive директиву, чтобы избавиться от компонента-оболочки:

Автор: Anton Kosykh

Источник: //itnext.io/

Редакция: Команда webformyself.

Метки:

Похожие статьи:

Комментарии Вконтакте: