Можно ли встроить правила CSS @media?

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

Например:

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

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


person Dancer    schedule 21.03.2012    source источник
comment
Разочарованы ответами? См. этот комментарий. Это может помочь.   -  person rinogo    schedule 04.08.2018


Ответы (12)


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

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

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

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

@media (max-width: 300px) {
    #myelement { background-image: url(particular_ad_small.png); }
}

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

:root { --particular-ad: url(particular_ad.png); }

@media (max-width: 300px) {
    :root { --particular-ad: url(particular_ad_small.png); }
}
<span style="background-image: var(--particular-ad);"></span>
person BoltClock    schedule 21.03.2012
comment
Вы также можете просто вставить тег <style> в свой HTML. Это необходимый подход в случае, когда background-image динамически извлекается из базы данных. Очевидно, что это не место во внешней таблице стилей. - person Jake Wilson; 04.06.2015
comment
@Jakobud: Да, не имеет значения, где находится таблица стилей, но дело в том, что это можно сделать только в CSS, а не во встроенном атрибуте стиля. - person BoltClock; 04.06.2015
comment
Обратите внимание на будущих исследователей, что тег <script> часто удаляется почтовыми клиентами при пересылке электронного письма, поэтому люди склонны использовать встроенные стили для писем. А это означает отсутствие медиа-запросов. В настоящее время я ищу лучшие практики для этой ситуации, но просто дружеский хедз-ап. - person TCannadySF; 16.11.2016
comment
Не забудьте установить максимальную ширину в ems, а не в px. Таким образом, при масштабировании он по-прежнему будет работать разумно. - person Silas S. Brown; 30.06.2017
comment
Как ни странно, диаграмма железной дороги список деклараций показывает, что at правила могут появляться в списках объявлений. - person Mike Samuel; 20.05.2019
comment
@Mike Samuel: Я считаю, что изначально это было сделано для учета @page at-rules. Сегодня спецификация css-nesting в полной мере использует это с помощью @nest at-rule . - person BoltClock; 01.09.2019

Проблема

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

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

Решение

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

e.i.

<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> только непосредственно родительским элементом и дочерними элементами этого элемента. Scoped не является обязательным, если элемент <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>
person Bruno J. S. Lesieur    schedule 19.02.2015
comment
Это лучший ответ, чем принятый ответ, потому что он позволяет динамически изменять background-image при загрузке страницы. - person Jake Wilson; 04.06.2015
comment
Мне нравится этот ответ, слишком плохая поддержка для области видимости в настоящее время очень ограничена. - person laughingpine; 12.06.2015
comment
Хотя scoped кажется отличным в принципе, Chrome удалил их предварительную поддержку на несколько версий назад, и теперь только Firefox имеет какую-либо поддержку. - person Anthony McLin; 10.07.2015
comment
Scoped просто используется для того, чтобы не разрешать использование .on-the-fly-behavior когда-либо, но если какой-то навигатор использует слово «игнорировать», это не проблема. ‹Style› можно использовать в ‹body› во всех навигаторах, это работает. Это просто требование валидации w3c. - person Bruno J. S. Lesieur; 14.11.2015
comment
Хотя scoped - прекрасное решение, оно официально не поддерживается ни одним браузером. Надеюсь, это скоро изменится. - person Ken Sharp; 16.02.2016
comment
согласно campaignmonitor.com/css/b отдельные теги стилей в Gmail не поддерживаются. у вас есть предложения о том, как использовать медиа-запросы в html-письмах? - person omid.n; 11.03.2016
comment
Это другой вопрос, потому что основная цель электронного письма - быть прочитанным клиентским электронным письмом, а многие клиентские электронные письма не поддерживают встраивание <style>, media queries или всех функций HTML / CSS. Так что на самом деле проблема гораздо серьезнее. Я знаю только, что вы можете создать электронную почту, отображаемую одинаково во всех клиентских сообщениях электронной почты (включая Gmail), с использованием только функции HTML4 и CSS2 (с некоторыми взломами Outlook), но в этом случае нет медиа-запросов. - person Bruno J. S. Lesieur; 11.03.2016
comment
Ребята, не используйте область видимости на ‹style›, она устарела. w3schools.com/tags/att_scoped.asp - person Vlad; 31.10.2019

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

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

person Marat Tanalin    schedule 21.03.2012

Да, вы можете написать медиа-запрос в 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>
person Arif Hussain    schedule 12.07.2018
comment
Это не относится к фоновому изображению CSS: url () - person Jonas Eberle; 04.09.2019
comment
Если я хорошо понимаю, это не меняет CSS в зависимости от размера области просмотра, это меняет изображение. Таким образом, CSS и макет останутся такими же, но оператор попросил использовать правила мультимедиа CSS. - person Max; 29.09.2020

Если вы используете 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>
person Pavel    schedule 14.11.2014
comment
Красивый обходной путь - скрыть div, показать div на основе медиа-запроса - единственный недостаток, который я вижу, это то, что он по-прежнему загружает оба изображения, поэтому вы отправляете оба клиенту. - person Michael C. Gates; 20.11.2014
comment
Дублированный контент - не лучший вариант для обслуживания или поисковой оптимизации. - person Bruno J. S. Lesieur; 14.10.2015
comment
К сожалению, это ложный друг! Я тоже думал об этом решении, но мы хотим, чтобы изображение меньшего размера служило маленьким устройствам и экономило байты для загрузки. Этот метод работает с точностью до наоборот. - person A. D'Alfonso; 14.07.2017

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

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

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

person Type-Style    schedule 20.03.2015
comment
есть идеи, когда это будет возможно? - person SuperUberDuper; 15.06.2016
comment
Я не думаю, что так будет. Но я не знаю всего, чем занимаются рабочие группы. - person Type-Style; 15.06.2016

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

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

Наслаждаться.

person Даниил Пронин    schedule 17.11.2016
comment
Я проголосовал за это, так как тогда казалось, что это работает, но это не так. #грустный - person honk31; 13.05.2017
comment
@ honk31 ИТ-мир только для одного правила - person Даниил Пронин; 13.05.2017
comment
Тестировал в мае 2021 года, работает? - person Sabrina Leggett; 04.05.2021

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

<a href="#" 
    target="itunes_store" 
    style="
        display:inline-block;
        overflow:hidden;
        background:url(#.png) no-repeat;
        width:135px;
        height:40px;
        @media only screen{
            background-image:url(#);
        }
"></a>

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

person davidcondrey    schedule 21.07.2014
comment
Я хотел бы знать, почему / как Apple также использует это - person Douglas.Sesar; 30.08.2014
comment
Цитируемый код больше не существует по данной ссылке (по крайней мере, для меня; возможно, я получаю другой контент из-за того, что нахожусь за пределами США). К тому же это действительно больше похоже на отдельный вопрос, чем на ответ. - person Mark Amery; 12.06.2015
comment
Я отправил отчет об ошибке и считаю, что с тех пор они его удалили. itunesaffiliate.phgsupport.com/hc/en-us/requests/14201 - person davidcondrey; 25.06.2015

да, вы можете работать с javascript с помощью window.matchMedia

  1. рабочий стол для текста красного цвета

  2. планшет для зеленого цвета текста

  3. мобильный для синего цвета текста

//isat_style_media_query_for_desktop_mobile_tablets
var tablets = window.matchMedia("(max-width:  768px)");//for tablet devices
var mobiles = window.matchMedia("(max-width: 480px)");//for mobile devices
var desktops = window.matchMedia("(min-width: 992px)");//for desktop devices



isat_find_device_tablets(tablets);//apply style for tablets
isat_find_device_mobile(mobiles);//apply style for mobiles
isat_find_device_desktops(desktops);//apply style for desktops
// isat_find_device_desktops(desktops,tablets,mobiles);// Call listener function at run time
tablets.addListener(isat_find_device_tablets);//listen untill detect tablet screen size
desktops.addListener(isat_find_device_desktops);//listen untill detect desktop screen size
mobiles.addListener(isat_find_device_mobile);//listen untill detect mobile devices
// desktops.addListener(isat_find_device_desktops);

 // Attach listener function on state changes

function isat_find_device_mobile(mob)
{
  
// isat mobile style here
var daynight=document.getElementById("daynight");
daynight.style.color="blue";

// isat mobile style here

}

function isat_find_device_desktops(des)
{

// isat mobile style here

var daynight=document.getElementById("daynight");
daynight.style.color="red";
 
//  isat mobile style here
}

function isat_find_device_tablets(tab)
{

// isat mobile style here
var daynight=document.getElementById("daynight");
daynight.style.color="green";

//  isat mobile style here
}


//isat_style_media_query_for_desktop_mobile_tablets
    <div id="daynight">tricky style for mobile,desktop and tablet</div>

person ßãlãjî    schedule 20.06.2019
comment
Возможно, это жизнеспособный ответ, но я бы не сказал, что вы можете это сделать, потому что OP не запрашивал решение JavaScript, а вместо этого запрашивал решение на чистом CSS. То, что хочет сделать OP, невозможно, но это потенциальный обходной путь в зависимости от сценария. - person Xandor; 12.08.2020

Вы можете использовать image-set ()

<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);">
person the7oker    schedule 10.03.2017
comment
Обратите внимание, что сейчас это поддерживается только в браузерах на основе Webkit. - person Qqwy; 13.04.2017
comment
Это работает не в зависимости от размера (как указано в вопросе), а от коэффициента масштабирования, поэтому вы можете получить изображение для маленьких экранов на 27-дюймовом экране 2560x1440. Это может быть то, что вы хотите, а может и нет. - person Jan Bühler; 10.07.2017

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

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

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

  1. Мысли о медиа-запросах для элементов
  2. Медиа-запросы - это взлом
  3. Медиа-запросы не Ответ: полифил запроса элемента
  4. если еще блокирует
person rlueder    schedule 11.10.2014

если вы добавите правило в файл print.css, вам не нужно использовать @media.

Я включил его в smarty foreach, который я использую, чтобы задать цвет фона некоторым элементам.

<script type='text/javascript'>
  document.styleSheets[3].insertRule(" #caldiv_<?smarty $item.calendar_id ?> { border-color:<?smarty $item.color ?> }", 1);
</script>

person Paul Wolbers    schedule 03.05.2015