Можно ли встроить правила CSS @media? - PullRequest
240 голосов
/ 21 марта 2012

Мне нужно динамически загружать изображения баннеров в приложение HTML5 и хотелось бы, чтобы несколько разных версий соответствовали ширине экрана. Я не могу правильно определить ширину экрана телефона, поэтому я могу думать только о том, чтобы добавить фоновые изображения div и использовать @media, чтобы определить ширину экрана и отобразить правильное изображение.

Например:

 <span style="background-image:particular_ad.png; @media (max-width:300px){background-image:particular_ad_small.png;}"></span>

Возможно ли это, или у кого-нибудь есть другие предложения?

Ответы [ 12 ]

241 голосов
/ 21 марта 2012

Нет, @media правила и медиазапросы не могут существовать в атрибутах встроенного стиля, поскольку они могут содержать только объявления property: value.Как спецификация выражает это:

Значение атрибута стиля должно соответствовать синтаксису содержимого блока объявления CSS

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

Пустышка *Селектор 1015 * будет выглядеть так, но если вы нацеливаетесь на очень специфический элемент, вам понадобится более конкретный селектор:

span { background-image: url(particular_ad.png); }

@media (max-width: 300px) {
    span { background-image: url(particular_ad_small.png); }
}
113 голосов
/ 19 февраля 2015

Проблема

Нет, Медиа-запросы не могут использоваться таким образом

<span style="@media (...) { ... }"></span>

Решение

Но еслиЕсли вы хотите, чтобы конкретное поведение можно было использовать на лету И реагировать, вы можете использовать разметку style, а не атрибут.

ei

<style scoped>
.on-the-fly-behavior {
    background-image: url('particular_ad.png'); 
}
@media (max-width: 300px) {
    .on-the-fly-behavior {
        background-image: url('particular_ad_small.png');
    }
}
</style>
<span class="on-the-fly-behavior"></span>

См. код, работающий вжить на CodePen

Например, в моем блоге я вставляю разметку <style> в <head> сразу после объявления <link> для CSS, и она содержит содержимое текстовой области, предоставленной помимо реального содержимого.Текстовое поле для создания дополнительного класса на лету, когда я писал статью.

Примечание: атрибут scoped является частью спецификации HTML5.Если вы не используете его, валидатор обвинит вас, но браузеры в настоящее время не поддерживают реальную цель: ограничивают содержимое <style> только непосредственным родительским элементом и дочерними элементами этого элемента.Область действия не обязательна, если элемент <style> находится в разметке <head>.


ОБНОВЛЕНИЕ: Я советую всегда использовать правила в мобильном режиме в первую очередь, поэтому предыдущий код должен быть:

<style scoped>
/* 0 to 299 */
.on-the-fly-behavior {
    background-image: url('particular_ad_small.png'); 
}
/* 300 to X */
@media (min-width: 300px) { /* or 301 if you want really the same as previously.  */
    .on-the-fly-behavior {   
        background-image: url('particular_ad.png');
    }
}
</style>
<span class="on-the-fly-behavior"></span>
13 голосов
/ 21 марта 2012

Встроенные стили в настоящее время не могут содержать ничего кроме объявлений (property: value пар).

Вы можете использовать style элементы с соответствующими media атрибутами в разделе head вашего документа.

9 голосов
/ 12 июля 2018

Да, вы можете написать медиа-запрос в inline-css, если вы используете тег изображения.Для устройств разных размеров вы можете получить разные изображения.

<picture>
    <source media="(min-width: 650px)" srcset="img_pink_flowers.jpg">
    <source media="(min-width: 465px)" srcset="img_white_flower.jpg">
    <img src="img_orange_flowers.jpg" alt="Flowers" style="width:auto;">
</picture>
8 голосов
/ 14 ноября 2014

Если вы используете Bootstrap Responsive Utilities или подобную альтернативу, которая позволяет скрывать / показывать div в зависимости от точек останова, может оказаться возможным использовать несколько элементов и показать наиболее подходящий. т.е.

 <span class="hidden-xs" style="background: url(particular_ad.png)"></span>
 <span class="visible-xs" style="background: url(particular_ad_small.png)"></span>
5 голосов
/ 20 марта 2015

Медиа-запросы в стилях-атрибутах сейчас невозможны.Но если вам нужно установить это динамически с помощью Javascript.Вы можете вставить это правило через JS aswell.

document.styleSheets[0].insertRule("@media only screen and (max-width : 300px) { span { background-image:particular_ad_small.png; } }","");

Это как если бы стиль был в таблице стилей.Так что знайте о специфике.

4 голосов
/ 17 ноября 2016

Эй, я только что написал это.

Теперь вы можете использовать <div style="color: red; @media (max-width: 200px) { color: green }"> или около того.

Наслаждайтесь.

4 голосов
/ 21 июля 2014

Я пытался проверить это, но это не сработало, но мне любопытно, почему Apple его использует.Я был только на https://linkmaker.itunes.apple.com/us/ и заметил в сгенерированном коде, который он предоставляет, если вы выберете переключатель «Большая кнопка», они используют встроенный медиазапрос.: добавлены разрывы строк для удобства чтения, минимизирован исходный сгенерированный код

3 голосов
/ 10 марта 2017

Вы можете использовать набор изображений ()

<div style="
  background-image: url(icon1x.png);
  background-image: -webkit-image-set(  
    url(icon1x.png) 1x,  
    url(icon2x.png) 2x);  
  background-image: image-set(  
    url(icon1x.png) 1x,  
    url(icon2x.png) 2x);">
2 голосов
/ 11 октября 2014

Встроенные медиа-запросы возможны при использовании чего-то вроде Точка останова для Sass

Этот пост в блоге хорошо объясняет, как встроенные медиа-запросы более управляемы, чем отдельные блоки: Нет точки останова

С внутренними медиа-запросами связана идея «запросов к элементам». Вот несколько интересных прочтений:

  1. Мысли о медиазапросах для элементов
  2. Медиа-запросы - это хак
  3. Запросы мультимедиа не являются ответом: Polyfill запроса элемента
  4. если еще блокирует
...