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

例如:

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

这可能吗,或者有人有其他建议吗?


当前回答

@media at-rules和media查询不能存在于内联样式属性中,因为它们只能包含property: value声明。正如规范所言:

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

仅在特定媒体中将样式应用到特定元素的唯一方法是在样式表中使用单独的规则(无论是外部链接还是在<style>元素中内部链接),这意味着您需要为它提供一个选择器。你可以使用浏览器的开发工具获取一个,或者找出一个类和/或ID组合来隔离这个元素:

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

其他回答

@media at-rules和media查询不能存在于内联样式属性中,因为它们只能包含property: value声明。正如规范所言:

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

仅在特定媒体中将样式应用到特定元素的唯一方法是在样式表中使用单独的规则(无论是外部链接还是在<style>元素中内部链接),这意味着您需要为它提供一个选择器。你可以使用浏览器的开发工具获取一个,或者找出一个类和/或ID组合来隔离这个元素:

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

内联样式目前只能包含声明(属性:值对)。

您可以在文档的头部部分使用带有适当媒体属性的样式元素。

嘿,我刚写完。

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

享受。

您可以使用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);">

问题

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

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

解决方案

但是,如果您希望提供一个动态可用且响应性强的特定行为,则可以使用样式标记而不是属性。

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上查看实时工作的代码

以我的博客为例,我在<head> <link>声明后面为CSS注入了一个<style>标记,它包含了一个文本区域的内容,在我写一篇文章时,它提供了一个真正的内容textarea,用于创建额外的类。

注意:scoped属性是HTML5规范的一部分。如果你不使用它,验证器会责备你,但是浏览器目前不支持真正的目的:将<style>的内容限定在直接的父元素和该元素的子元素上。如果<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>