Как стать автором
Обновить

Адаптивный jQuery без window.matchMedia

Время на прочтение3 мин
Количество просмотров23K
Велосипед с электроприводом вместо рейсового автобуса. Хочу поделиться своим методом адаптации скриптов jQuery (сам привык писать скрипты на jQuery, но разницы нет, все описанное верно и для чистого javascript) параллельно адаптации веб-верстки.

Для адаптации под различные разрешения экранов и различные устройства используют медиа-запросы в CSS. Допустим у нас заложена адаптация нашей верстки под 2 диапазона: от 0 до 479 пикселей и до 800 пикселей.

@media screen and (max-width: 800px) {
  /* CSS */
}
/* И */
@media screen and (max-width: 479px) {
  /* CSS */
}

Мы хотим использовать различную анимацию и/или запросы к серверу в зависимости от размера экрана. Т.е. нам необходимо параллельно срабатыванию меди-запроса из CSS реагировать в скриптах javascript. Для этого существует, как минимум, 3 способа.

Академический. Специальный метод javascript: window.matchMedia, определяющий срабатывание медиа-запроса, аналогичного CSS:

var mql = window.matchMedia('all and (max-width: 479px)');
if (mql.matches) {
    // размер окна 479px или меньше
} else {
    // нет, размер окна более 479px 
}

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

Метод костыля №1. Самый простой и, наверное, очевидный метод — добавить в скрипт условие проверки текущего размера окна браузера.

К минусом данного метода относится также наличие дублирования размеров экрана в CSS и в javascript и некоторые проблемы с получением адекватных кроссбраузерных размеров окна на различных платформах.

Метод костыля №2. Теперь о методе, которым пользуюсь я. Заключается он в использовании html-флагов для каждого диапазона. В качестве флага может выступать реальная конструкция верстки, появляющаяся только в нужном нам диапазоне размеров, либо пустой однопиксельный div.
Html:

<!DOCTYPE html>
<html>
	<head>
		<title>Тест флагов</title> 
	</head>
	<body>
		<div class=”max_width_800”></div>
		<div class=”max_width_479”></div>
	</body>
</html>

CSS:

.max_width_800{
	display: none;
}
.max_width_479{
	display: none;
}

@media screen and (max-width: 800px) {
	.max_width_800{
		display: block;
	}
	.max_width_479{
		display: none;
	}
}

@media screen and (max-width: 479px) {
	.max_width_800{
		display: none;
	}
	.max_width_479{
		display: block;
	}
}

А в самом скрипте мы просто проверяем показан ли наш маркер:

if ($('.max_width_800').is(':visible')) {
    // код jQuery
}

if ($('.max_width_479').is(':visible')) {
    // код jQuery
}

В данном примере мы явно указываем диапазоны размеров экрана только в CSS и при изменении нам не нужно беспокоиться о работоспособности скриптов. Также на кроссбраузерность последнего примера влияет только поддержка браузером медиазапросов.

Идем дальше и подключаем мобильный скрипт только при условии необходимости:

var head = $('head');
includeScripts(head);
$(window).resize(function(){
	includeScripts(head);
});

function includeScripts(head){

	if ($('.max_width_800').is(':visible')) {
		head.append('<script type="text/javascript" src="mobile-800.js" id=”script-mobile-800”></script>');
		$('#script-mobile-479').remove();
	}

	if ($('.max_width_479').is(':visible')) {
		head.append('<script type="text/javascript" src="mobile-479.js" id=”script-mobile-479”></script>');
		$('#script-mobile-800').remove();
	}

}

Спасибо за внимание!
Теги:
Хабы:
Всего голосов 11: ↑5 и ↓6-1
Комментарии14

Публикации

Истории

Работа

Ближайшие события