是否可以将CSS @media规则内联?

Dan*_*cer 269 html css css3 media-queries

我需要动态地将横幅图像加载到HTML5应用程序中,并希望有几个不同的版本以适应屏幕宽度.我无法正确确定手机的屏幕宽度,因此我能想到的唯一方法是添加div的背景图像并使用@media确定屏幕宽度并显示正确的图像.

例如:

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

这有可能,还是有人有任何其他建议吗?

Bol*_*ock 261

不,@media规则和媒体查询不能存在于内联样式属性中,因为它们只能包含property: value声明.正如规范所说:

style属性的值必须与CSS 声明块的内容的语法匹配

仅在某些媒体中将样式应用于元素的唯一方法是在样式表中使用单独的规则,这意味着您需要为它选择一个选择器.

虚拟span选择器看起来像这样,但如果您要定位一个非常特定的元素,则需要一个更具体的选择器:

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

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

  • 你也可以在HTML中加入一个`<style>`标签.对于从数据库动态提取`background-image`的情况,这是一种必要的方法.显然在外部样式表中不适合它. (61认同)
  • 请在`em`s中设置max-width,而不是在'px`中.这样,当你缩放时它仍然会合理地工作. (3认同)
  • @Jakobud:是的,样式表位于何处并不重要,但关键是您只能在 CSS 中执行此操作,而不能在内联样式属性中执行此操作。 (2认同)
  • 请注意,未来的探索者在转发电子邮件时,电子邮件客户端通常会删除"<script>"标记,因此人们倾向于使用电子邮件的内嵌样式.这意味着没有媒体查询.我目前正在寻找这种情况的最佳实践,但只是一个友好的单挑. (2认同)
  • @Mike Samuel:我相信这最初是为了解释“@page”规则。今天,css-nesting 规范通过 [`@nest` at-rule](https://drafts.c​​sswg.org/css-nesting-1/#at-nest) 充分利用了这一点。 (2认同)

Bru*_*eur 122

问题

不,媒体查询不能以这种方式使用

<span style="@media (...) { ... }"></span>
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望提供可在运行中使用的特定行为并且响应,则可以使用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>
Run Code Online (Sandbox Code Playgroud)

查看在CodePen上实时工作的代码

例如,在我的博客中,我<style>在CSS声明<head>之后注入了一个标记<link>,它包含了真实内容textarea旁边提供的textarea的内容,以便在我编写artitle时动态创建额外的类.

注意:该scoped属性是HTML5规范的一部分.如果你不使用它,验证器会责备你,但浏览器目前不支持真正的目的:<style>仅限于immediatly父元素和该元素的子元素的内容.如果<style>元素处于<head>标记中,则Scoped不是必需的.


更新:我建议始终在移动设备中使用规则,因此以前的代码应该是:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个比接受的答案更好的答案,因为它允许您在页面加载时动态更改`background-image`. (10认同)
  • 伙计们,不要在 &lt;style&gt; 上使用“scoped”,它已被弃用。https://www.w3schools.com/tags/att_scoped.asp (8认同)
  • 虽然原则上范围似乎很好,但Chrome删除了几个版本的初步支持,现在只有Firefox有任何支持. (7认同)
  • 尽管`scoped`是一个出色的解决方案,但它并未得到任何浏览器的正式支持.希望这会很快改变. (3认同)
  • 这是另一个问题,因为电子邮件的主要目标是通过客户端电子邮件阅读,而许多客户端电子邮件不支持嵌入“&lt;style&gt;”、“媒体查询”或所有 HTML/CSS 功能。所以实际上问题比这更大。我只知道您可以在所有客户端电子邮件(包括 Gmail)上创建以相同方式显示的电子邮件,只有 HTML4 和 CSS2 功能(带有一些 Outlook hack),但在这种情况下没有媒体查询。 (2认同)

Mar*_*lin 13

内联样式当前不能包含除声明(property: value对)之外的任何内容.

您可以在文档的部分中使用style具有适当media属性的元素head.


Дан*_*нин 9

嘿,我刚写的。

现在你可以使用<div style="color: red; @media (max-width: 200px) { color: green }">左右。

享受。


小智 8

如果您正在使用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>
Run Code Online (Sandbox Code Playgroud)

  • 重复内容对维护或搜索引擎优化不是一件好事. (4认同)
  • 漂亮的解决方法 - 隐藏div,基于媒体查询显示div - 我看到的唯一缺点是它仍然会加载两个图像,所以你要发送到客户端. (3认同)

小智 8

是的,如果您使用图片标记,则可以在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>
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于 CSS 背景图像: url() (3认同)
  • 如果我理解得很好,这不会改变基于视口大小的CSS,它会改变图片。因此 CSS 和布局仍然是相同的,但操作要求使用 CSS 媒体规则。 (2认同)

dav*_*rey 6

我尝试对其进行测试,但它似乎没有起作用,但我很好奇苹果为何使用它。我只是在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>
Run Code Online (Sandbox Code Playgroud)

注意:增加了换行符以提高可读性,并减少了原始生成的代码

  • 我想知道苹果为何/如何使用它 (2认同)
  • 我提交了一个错误报告,我相信他们已经将其删除了。http://itunesaffiliate.phgsupport.com/hc/en-us/requests/14201 (2认同)

Typ*_*yle 5

暂时无法在style-Attributes中进行媒体查询。但是,如果您必须通过Javascript动态设置它。您也可以通过JS插入该规则。

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

就像样式在样式表中一样。所以要注意特异性。


ßãl*_*ãjî 5

是的,您可以通过window.matchMedia使用 javascript

  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
Run Code Online (Sandbox Code Playgroud)
    <div id="daynight">tricky style for mobile,desktop and tablet</div>
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一个可行的答案,但我不会说“是的,你可以做到”,因为 OP 没有要求 JavaScript 解决方案,而是要求纯 CSS 解决方案。OP 想要做的事情是不可能的,但根据情况,这是一个潜在的解决方法。 (3认同)