Статьи

CSS3 Media Queries и создание адаптивных макетов

Имея множество устройств, веб-браузеров и экранов разных размеров, нам нужен способ, позволяющий легко определить, как мы хотим создать для них веб-страницу. Теперь это предлагается нам через Media Queries в CSS3.

CSS3 Media Queries поможет вам получить информацию об устройстве / веб-браузере, обращающемся к вашей веб-странице, и оттуда вы сможете решить, как вы хотите, чтобы контент был представлен наилучшим образом в соответствии с его возможностями. В соответствии со спецификацией CSS3 Media Queries вы должны быть в состоянии проверить :

  • ширина
  • высота
  • Устройство ширины
  • Устройство высоты
  • ориентация
  • соотношение сторон
  • Устройство коэффициента пропорциональности
  • цвет
  • цветовой индекс
  • монохромный
  • разрешающая способность
  • сканирование
  • сетка

(Обратите внимание, что не все вышеперечисленное может не поддерживаться в веб-браузерах на данный момент)

Наиболее интересные для меня, и те, которые я расскажу здесь:

  • мин-ширина
  • Максимальная ширина
  • ориентация

Простой пример

Давайте начнем с очень простого примера. В этом случае цвет фона элемента по умолчанию красный. Однако, если доступная ширина превышает 500 пикселей, мы хотим, чтобы она была синей:

.media-query-elm {
	background: #f00;
}

@media screen and (min-width: 500px) {
	.media-query-elm {
		background: #00f;
	}
}

Итак, как вы могли знать ранее, вы указываете носитель (возможно, вы использовали его для CSS для экрана, а затем для печати) и вместе с этим вы устанавливаете критерии минимальной ширины. Любой соответствующий клиент веб-браузера, который будет применять / переопределять все правила CSS, указанные в блоке.

Наличие гибкого макета

Сила медиазапросов означает, что если у вас высокое разрешение, вы можете получить один макет, а для более низких разрешений, мобильных телефонов и т. Д. Вы можете полностью изменить макет, чтобы он лучше подходил для этого представления — и все это без сценариев и других оптимальные методы обнаружения (размышления о сниффинге пользовательского агента и тому подобное).

Поэтому, чтобы расширить простой пример выше, у нас будет разная ширина и расположение в зависимости от доступной ширины:

.navigation {
	float: left;
	width: 300px;
}

.main-content {
	float: right;
	width: 500px;
}

@media screen and (min-width: 1000px) {
	.navigation {
		width: 350px;
	}

	.main-content {
		float: right;
		width: 650px;
	}
}

@media screen and (max-width: 399px) {
	.navigation {
		display: block
		float: none;
		width: 100%;
	}

	.main-content {
		display: block
		float: none;
		width: 100%;
	}
}

В результате мы имеем размер по умолчанию для элементов навигации и основного контента и размещаем их рядом друг с другом, но если веб-браузер / устройство пользователя поддерживает более высокую ширину, мы немного увеличим их. Однако для более низких значений ширины (предположительно iPhone, телефонов Android и т. П.) Вместо этого мы помещаем два элемента в отдельную строку, удаляем плавающие и позволяем им занять всю доступную ширину.

Использование и, или, только и не

Вы можете расширить Media Queries, проверив несколько значений или утверждений или не утверждений. Как вы могли видеть выше, чтобы проверить наличие нескольких значений true, вы используете ключевое слово and:

@media screen and (min-width: 100px) {
	.navigation {
		width: 350px;
	}
}

Чтобы проверить операторы или операторы, вы любопытно используете разделение запятыми (что имеет смысл, но также выглядит немного запутанным, потому что для других вещей в CSS, таких как множественные фоны, вы используете запятые для их объединения ). Во всяком случае, это будет выглядеть так:

@media screen and (min-width: 100px),
@media handheld {
	.navigation {
		width: 350px;
	}
}

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

@media only screen and (min-width: 100px) {
	.navigation {
		width: 350px;
	}
}

И наконец, у нас также есть ключевое слово not, чтобы исключить определенные критерии (то есть оно будет применяться ко всем, кто не соответствует этому):

Получение ориентации

Есть также интересное свойство, называемое ориентацией, которое поможет вам определить, отображается ли что-то в альбомной или портретной ориентации. Вот как это использовать:

@media screen and (orientation: portrait) {
	.portrait {
		display: inline;
	}
	.not-detected {
		display: none;
	}
}

@media screen and (orientation: landscape) {
	.landscape {
		display: inline;
	}
	.not-detected {
		display: none;
	}
}

и в сочетании с этим HTML, он покажет вам текущее вращение:

 Device rotation is
    <span class="portrait">portrait</span>
    <span class="landscape">landscape</span>

Примечание о настольных веб-браузерах

Над кодом для проверки ориентации все хорошо и хорошо для iPhone, телефонов Android и т. Д., Но как насчет настольных веб-браузеров? Интересно, что они поддерживают это и возвращают значение, основанное на соотношении ширины и высоты текущего окна. На практике это означает, что если окно веб-браузера шире, чем высоко, оно рассматривается как альбомное, в противном случае оно рассматривается как портретное.

Я думаю, что это имеет смысл, но вам не нужно менять макет для настольных веб-браузеров исключительно на основе ориентации. Совет всегда объединять его с другими значениями, такими как min-width / max-width.

IPhone и определение ширины

По какой-то причине, кажется, постоянно используются различные метаэлементы. Я хочу отметить, что для того, чтобы заставить iPhone проверять ширину и изменять макет, вам нужно добавить метаэлемент и соответственно установить ширину (иначе он этого не сделает):

<meta name="viewport" content="width=device-width, maximum-scale=1.0">

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

Поддержка веб-браузера

Веб-браузеры, которые поддерживают CSS3 Media Queries:

  • Internet Explorer 9 (готовится к выпуску)
  • Firefox 3.5+
  • Google Chrome 5+
  • Safari 4+
  • Opera 10.6+ (здесь может потребоваться дополнительная информация об уровне поддержки)

Свойство ориентации также доступно в следующих мобильных устройствах / системах:

  • iOS4
  • Android 2+
  • Мобильный Firefox
  • болт
  • MicroB

(мобильная поддержка взята из запроса к ориентации СМИ в PPK )

Немного демо

В рамках моих тестов CSS3 у меня есть страница для тестирования медиазапросов CSS3 с доступной шириной и ориентацией .


Демонстрация может потерпеть неудачу в самом узком состоянии в Firefox на Mac OS X, так как она странным образом вычисляет ширину панели инструментов веб-браузера как часть минимальной ширины для CSS.

CSS3 медиа-запросы здесь сегодня!

За исключением Internet Explorer (до версии 9), все остальные веб-браузеры, как настольные, так и мобильные, поддерживают это, и я думаю, что это отличный инструмент для адаптации макета в соответствии с условиями конечного пользователя. Попробуйте и дайте мне знать!