Enquire.js — используем css медиа-запросы в JS

Enquire.js — используем css медиа-запросы в JS

7 827 в JavaScript 2 Видео

Приветствую всех в 2017 году! Как быстро летит время, не успел оглянуться, а уже 2017 год. 2017 — можете себе представить? Я всегда оборачиваюсь назад и смотрю какой путь я прошел и чего добился. В 2016 году я получил много теории. Вот, думаю, 2017 год будет чисто практическим. Но, как говориться, будем еще посмотреть.

А теперь давайте я представлю вашему вниманию небольшую js-библиотеку для работы с медиа выражениями (media query) CSS. Т.е. данная заметка посвящена адаптивным дизайнам, что безусловно давно уже в тренде.

Скрипт носит название Enquire.js. Библиотека довольно маленькая и весит продакшен (минимизированная) версия всего — 2,2 кб. Enquire.js библиотека независимая, т.е. может работать без подключения jQuery и ей подобных. Давайте я все таки объясню для чего это все нужно и можно ли обойтись без лишних скриптов.

Мы знаем, чтобы изменить стиль элемента в CSS на определенном разрешении экрана достаточно написать стиль для определенного экрана, используя медиа запросы — @media. Но что делать, если нам нужно задействовать какой либо скрипт JS на том же размере экрана. Как раз для этого случая нам и понадобится enquire.js. Можно конечно и самому написать данный скрипт, но применение enquire намного удобнее, т.к. у нее есть несколько приятных особенностей.

Итак, качаем скрипт с официального сайта разработчика или с GitHub. Вообще хочу сказать, что на сайте разработчика есть подробнейшая инструкция по данной библиотеке с примерами. Правда она на английском языке, но разобраться будет не сложно.

Подключение и регистрация событий

Подключаем саму библиотеку до основного файла js, в котором мы пишем наш код.

<script src="/js/enquire.min.js"></script>

Вызываем скрипт методом — register.

enquire.register("screen and (max-width: 1200px)", { // and (orientation: landscape) || portrait
 
 // НЕ ОБЯЗАТЕЛЬНО 
 // Срабатывает вызов, когда соответствует указанному медиа запросу - matched 
 match: function() {},
 
 // НЕ ОБЯЗАТЕЛЬНО
 // Срабатывает вызов, когда перестает соответствовать указанному медиа запросу - unmatched 
 // переходит из состояния matched в unmatched.  
 unmatch: function() {},

 // НЕ ОБЯЗАТЕЛЬНО 
 // Срабатывает один раз, когда обработчик зарегистрирован  
 setup: function() {},

 // НЕ ОБЯЗАТЕЛЬНО, по умолчанию - false 
 // Если значение истина - "true", то откладывает выполнение функции до первого совпадения с медиа запросом (matched)  
 deferSetup: true,

 // НЕ ОБЯЗАТЕЛЬНО 
 // Срабатывает код, когда обработчик переходит в состояние незарегистрированный (unregistered). 
 destroy: function() {}

});

Теперь давайте разберем на примерах.

Читайте также:  Masonry Layout - кирпичный эффект элементов на сайте

Примеры

Match & Unmatch

Откройте демо-страницу и начните уменьшать окно браузера и после Max 990px вы увидете изменения, далее снова верните окно в исходное состояние.

 

В основном на практике я использую именно эти два метода. Ведь имея возможность манипулировать объектами, можно сделать то, что твоей душе угодно.

enquire.register("screen and (max-width: 990px)", {
  match: function () {
    $('.info-block__match').addClass('info-block_match-active');
    $('.info-block__unmatch').removeClass('info-block_unmatch-active');
  },
  unmatch: function () {
    $('.info-block__match').removeClass('info-block_match-active');
    $('.info-block__unmatch').addClass('info-block_unmatch-active');
  }
});

Setup & DeferSetup

Иногда бывает нужно, чтобы код JS сработал только один раз, например, когда мы делаем ajax запрос. В примере выше наш код будет срабатывать всякий раз, когда будет совпадение медиа запроса. Для этого воспользуемся методом Setup и deferSetup.

enquire.register("screen and (max-width: 990px)", {
  deferSetup: true,
  setup: function () {
    alert("Совпадение - match");
  }
});

Как видите при уменьшении экрана браузера окно Alert’a показывается только один раз и не важно меняете вы далее размер или нет. Если не передать методу deferSetup истину — true, то окошка алерта будет выскакивать постоянно, т.к. метод Setup срабатывает как только обработчик будет зарегистрирован.

В последнее время я практически всегда использую enquire.js, без него будет очень сложно верстать под мобильные устройства. Раньше я умудрялся располагать блоки на мобильном экране абсолютным позиционированием. Но это было долго и нудно, да и не в каждом случае может прокатить. С помощью же enquire.js я просто перемещаю объекты по DOM дереву документа.

Естественно можно продублировать один и тот же объект два раза и показывать его на определенном разрешении экрана, через CSS, но это будет не правильно. Зачем создавать лишние запросы, загружая сервер и браузер. Такие манипуляции скажутся на быстродействии сайта. Также на одной странице не должно быть повторяющихся одинаковых индефикаторов. Так можно поступить с небольшими объектами, например, иконки. А вот, например, модуль меню дублировать не стоит, тем более, если оно содержит очень много пунктов.

Читайте также:  Методология БЭМ в примерах

Таким образом, используя Enquire.js и медиа запросы CSS мы можем быстро и качественно верстать адаптивные сайты. Мне лично помогает такой подход.

На этом сегодня все. До встречи в следующих постах!

Остались вопросы? Посмотрите видео...

Оцените пост
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (3 оценок, среднее: 4,33 из 5)
Загрузка...
Заур Магомедов
Заур Магомедов
Занимаюсь созданием сайтов с 2009 года. Постоянно обучаюсь и совершенствуюсь, шагая в ногу со временем. Владею такими навыками, как: Html5, Css3, JavaScript, Vue, Git, БЭМ, Gulp.
Другие материалы той же категории