Чи можна поставити правила CSS @media вбудованими?


293

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

Наприклад:

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

Чи це можливо, чи хтось має інші пропозиції?


3
Невдоволений відповідями? Дивіться цей коментар . Це може допомогти.
rinogo

Відповіді:


284

Ні, @mediaправила та медіа-запити не можуть існувати в атрибутах стилю inline, оскільки вони можуть містити лише property: valueдекларації. Як пише специфікація :

Значення атрибуту стилю повинно відповідати синтаксису вмісту блоку декларацій CSS

Єдиний спосіб застосувати стилі до елемента лише на певних носіях інформації - це окреме правило у вашій таблиці стилів, а це означає, що вам потрібно придумати селектор.

Манекен- spanселектор виглядатиме так, але якщо ви орієнтуєтесь на дуже конкретний елемент, вам знадобиться більш конкретний селектор:

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

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

70
Ви також можете просто помістити <style>тег у свій HTML. Це необхідний підхід для випадку, коли background-imageдинамічно витягується з бази даних. Очевидно, що у зовнішньому аркуші стилів це не потрібне місце.
Джейк Вілсон

1
@Jakobud: Так, неважливо, де знаходиться таблиця стилів, але справа в тому, що ви можете це робити лише в CSS, а не вбудованому атрибуті стилю.
BoltClock

3
Зауважте майбутнім дослідникам, що <script>тег часто знімають клієнти електронної пошти при пересиланні електронної пошти, тому люди схильні до використання стилів інтернету для електронних листів. А це означає, що ніяких медіа-запитів немає. Зараз я шукаю найкращі практики для цієї ситуації, але просто дружній хед-ап.
TCannadySF

3
Встановіть максимальну ширину в ems, а не в px. Таким чином, він буде працювати чудово під час збільшення.
Silas S. Brown

2
@Silas S. Brown: Це не моя проблема. Я просто відображаю те, що використовується у питанні.
BoltClock

137

Проблема

Ні, медіа-запити не можна використовувати таким чином

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

Рішення

Але якщо ви хочете за умови конкретної поведінки, яка може бути використана на ходу та чуйною, ви можете використовувати styleрозмітку, а не атрибут.

еі

<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>

10
Це краща відповідь, ніж прийнята відповідь, оскільки вона дозволяє динамічно змінювати background-imageчас завантаження сторінки.
Джейк Вілсон

7
Незважаючи на те, що обсяг роботи в принципі здається чудовим, Chrome видалив попередню підтримку декількох версій назад, і тепер лише Firefox має будь-яку підтримку.
Ентоні Маклін

1
Використовується лише для того, щоб не можна .on-the-fly-behaviorбуло використовувати будь-які речі, але якщо слово "ігнорувати" деяким навігатором - це не проблема. <style> може використовуватися в <body> у всьому навігаторі, це робота. Це просто вимога перевірки w3c.
Бруно Лезьє

4
Хоча scopedце геніальне рішення, воно офіційно не підтримується жодним браузером. Сподіваємось, це скоро зміниться.
Кен Шарп

1
Це інше питання, тому що головна мета по електронній пошті, щоб читати з допомогою комп'ютерної програми для електронної пошти та багатьма клієнтами електронної пошти не підтримує вкладення <style>, або media queriesвсе або функцію HTML / CSS. Тож насправді проблема більша за це. Я знаю лише, що ви можете створити електронну пошту, яка відображається однаково на всій електронній пошті клієнта (включена Gmail) лише з функціями HTML4 та CSS2 (з деяким взломом Outlook), але в цьому випадку немає медіа-запитів.
Бруно Лезьє

15

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

Ви можете використовувати styleелементи з відповідними mediaатрибутами в headрозділі документа.


13

Так, ви можете писати медіа-запит 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>

Це не стосується CSS-фонового зображення: url ()
Jonas Eberle

10

Якщо ви використовуєте Bootstrap Responsive Utilities або подібну альтернативу, яка дозволяє приховувати / показувати діви залежно від точки перерви, можливо, можливо використовувати кілька елементів і показати найбільш підходящі. тобто

 <span class="hidden-xs" style="background: url(particular_ad.png)"></span>
 <span class="visible-xs" style="background: url(particular_ad_small.png)"></span>

3
Прекрасне вирішення - приховати дів, показати дів на основі медіа-запиту - єдиний недолік, який я бачу, це те, що він все одно завантажить обидва зображення, щоб ви надсилали обидва клієнту.
Майкл К. Гейтс

4
Дублікат вмісту - це не дуже корисна річ для обслуговування або оптимізації.
Бруно Лезьє

1
На жаль, це фальшивий друг! Я також думав над цим рішенням, але ми хочемо, щоб картинка меншого розміру служила для невеликих пристроїв і економила байти для завантаження. Ця техніка робить зовсім навпаки
А. Д'Альфонсо

8

Медіа-запити в стилі-атрибути наразі неможливі. Але якщо вам доведеться встановити це динамічно через Javascript. Ви можете вставити це правило також через JS.

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

Це так, ніби стиль був у таблиці стилів. Тож усвідомлюйте специфіку.


будь-які ідеї, коли це буде можливо?
SuperUberDuper

1
Я не думаю, що це буде. Але я не знаю всіх речей, які роблять робочі групи.
Тип-стиль

8

Гей, я щойно це написав.

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

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


Я проголосував за це, оскільки, здавалося, тоді це спрацювало, але це не так. #sad
honk31

@ honk31 це світ лише для одного правила
Даніїл Пронин

7

Я спробував це перевірити, але, здавалося, це не спрацювало, але мені цікаво, чому 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>

Примітка: додано розриви рядків для читабельності, оригінальний згенерований код пом'якшується


3
Я хотів би знати, чому / як Apple також використовує це
Douglas.Sesar

1
Кодований код більше не існує у вказаному посиланні (принаймні для мене; можливо, я отримую різний контент через те, що перебуваю за межами США). Крім того, це справді більше схоже на окреме питання, ніж на відповідь.
Марк Амері

1
Я надіслав звіт про помилку, і я вважаю, що з тих пір його видалили. itunesaffiliate.phgsupport.com/hc/en-us/requests/14201
davidcondrey

4

Ви можете використовувати набір зображень ()

<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);">


Це працює не на основі розміру (як зазначено у запитанні), а на коефіцієнта збільшення, тому ви можете отримати зображення для маленьких екранів на екрані 27 “2560x1440. Це може бути те, що ви хочете - а може і ні.
Ян Бюлер

4

так, ви можете зробити з JavaScript 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>


3

Вбудовані медіа-запити можливі, використовуючи щось на кшталт Breakpoint для Sass

Ця публікація в блозі чудово пояснює, як запити вбудованих медіа-файлів є більш керованими, ніж окремі блоки: Немає точки перерви

Пов’язана з вбудованими медіа-запитами ідея "запитів елементів", кілька цікавих читань:

  1. Думки про медіа-запити для елементів
  2. Медіа-запити - це хак
  3. Медіа-запити не є відповіддю: Поліфактурний запит
  4. якщо інакше блокує

1

якщо ви додасте правило до файлу print.css, вам не доведеться використовувати @media.

Я виключив це в розумному передмісті, який я використовую, щоб надати деяким елементам колір фону.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.