是否可以在CSS中设置img标签的src属性的等效项?


531

是否可以src在CSS中设置属性值?目前,我正在做的是:

<img src="pathTo/myImage.jpg"/>

我希望它像这样

<img class="myClass" />
.myClass {
    some-src-property: url("pathTo/myImage.jpg");

我想这样做,使用backgroundbackground-image:在CSS属性。


1
在CSS3中,这显然将是可能的:w3.org/TR/css3-values/#attribute
graphicdivine 2010年

7
现在有可能。在Chrome / Safari / Opera上进行了测试:stackoverflow.com/a/11484688/632951
Pacerier,2012年

2
但是不支持FireFox 30.0,Internet Explorer 11.0
Laxmikant Dange 2014年

这个仅CSS解决方案对我有效(在所有浏览器中):stackoverflow.com/a/19114098/448816,除了我必须添加:'background-size:100%;'。
mikhail-t 2014年

(2020)您可以使用JS进行操作,getPropertyValue("--src")请参见:jsfiddle.net/CustomElementsExamples/vjfpu3a2
Danny'365CSI'Engelman

Answers:


880

使用content:url("image.jpg")

完整的工作解决方案(Live Demo):

<!doctype html>

<style>
.MyClass123{
	content:url("http://imgur.com/SZ8Cm.jpg");
}
</style>

<img class="MyClass123"/>

经过测试和工作:

  • 铬14.0.835.163
  • Safari 4.0.5
  • Opera 10.6

经过测试,无法正常工作:

  • FireFox 40.0.2(观察开发人员网络工具,您可以看到URL已加载,但未显示图像)
  • Internet Explorer 11.0.9600.17905(URL永远不会加载)

7
@gotqn,到目前为止只有Chrome Safari Opera。
Pacerier,2013年

36
@EricG,不同的应用程序有不同的要求。如果它不符合您的要求,请不要使用它。如果是这样,请使用它。
Pacerier

4
IE10无法正常运行。我们抛弃了IE7(我们不谈论IE6)。IE8也是,如果需要的话。但是IE9-IE10 ...不。
罗尔夫(Rolf)2013年

11
值得补充的是,即使在支持分配content给的浏览器中img,它也会更改其行为。图片开始忽略大小属性,并且在Chrome / Safari中丢失了上下文菜单选项,例如“保存图片”。这是因为分配content有效地将空替换元素转换img为。<span><img></span>
Ilya Streltsyn

3
没有适当的浏览器支持,对不起,我认为这不是有效的答案。
emachine

183

我今天发现了一个解决方案(可在IE6 +,FF,Opera,Chrome中运行):

<img src='willbehidden.png' 
 style="width:0px; height:0px; padding: 8px; background: url(newimage.png);">

怎么运行的:

  • 图像将缩小,直到宽度和高度不再可见。
  • 然后,您需要使用填充“重置”图像尺寸。这给出了一个16x16的图像。当然,您可以使用padding-left / padding-top制作矩形图像。
  • 最后,使用背景将新图像放置在那里。
  • 如果新的背景图像太大或太小,我建议使用background-size例如:background-size:cover;它使您的图像适合分配的空间。

它也适用于提交输入图像,它们保持可点击状态。

观看现场演示:http : //www.audenaerde.org/csstricks.html#imagereplacecss

请享用!


6
@RobAnu:这很好用-jsfiddle
TimPietrusky

9
告诉您这很有趣和聪明,但是空DIV更直接。
Volomike 2012年

11
在这种情况下。但是,在某些情况下,您仍然无法控制HTML并且想要操纵IMG。在那里,该解决方案也将起作用
RobAu 2012年

2
如果图像具有src属性,则这是您需要的技术。+1 -帮了我很多
詹姆斯龙

3
在此答案上排名不高,这可能是某些应用程序的解决方案,但是此方法有局限性。您无法控制图像文件渲染的尺寸。在正常使用中,如果在源中指定了文件,则可以控制图像的高度-宽度。但这基本上与具有背景图像的div没什么不同,在div中,如果您的div大于图像,则表示您不走运。
TARKUS

113

从CSS设置图像的可能方法的集合


CSS2:after伪元素或较新的语法::afterCSS3与沿content:属性:

第一项W3C建议:级联样式表,第2级CSS2规范 1998年5月12日
最新的W3C建议:选择器,第3级W3C建议, 2011年9月29日

此方法内容附加元素的文档树内容之后。

注意:一些浏览器通过实验content直接在某些元素选择器上渲染属性,甚至不考虑定义以下内容的最新W3C建议:

适用于::before:after伪元素

CSS2语法(向前兼容):

.myClass:after {
  content: url("somepicture.jpg");
}

CSS3选择器:

.myClass::after {
  content: url("somepicture.jpg");
}

默认渲染:原始大小(不取决于显式的大小声明)

该规范并未完全定义:before和:after与替换元素(例如HTML中的IMG)的交互。这将在以后的规范中更详细地定义。

但即使是在写这篇文章的时候,用行为<IMG>标签尚未定义,虽然它可以被用在黑客攻击和不符合标准的方式与使用<img>不推荐

很棒的候选方法,请看结论...



CSS1background-image:属性:

W3C的第一个建议:级联样式表,第1级, 1996年12月17日

此属性设置元素的背景图像。设置背景图像时,还应设置一种背景色,当图像不可用时将使用该背景色。当图像可用时,它会覆盖在背景颜色之上。

此属性自CSS诞生以来就已经存在,但是值得一提。

默认渲染:原始大小(无法缩放,只能定位)

然而

CSS3background-size:属性通过允许多个缩放选项对其进行了改进:

最新的W3C状态:候选建议 CSS背景和边框模块3级 2014年9月9日

[length> | <percentage> | auto ]{1,2} | cover | contain

但是即使具有此属性,它也取决于容器的大小。

仍然是一种不错的候选方法,请参见结论...



CSS2list-style:属性以及display: list-item

W3C的第一个建议:级联样式表,第2级CSS2规范 1998年5月12日

list-style-image: 属性设置将用作列表项标记(项目符号)的图像

列表属性描述了列表的基本视觉格式:它们允许样式表指定标记类型(图像,字形或数字)

display: list-item—此值使元素(例如,<li>HTML中的元素)生成主体块框和标记框。

.myClass {
    display: list-item;
    list-style-position: inside;
    list-style-image: url("someimage.jpg");
}

简写CSS:(<list-style-type> <list-style-position> <list-style-image>

.myClass {
    display: list-item;
    list-style: square inside url("someimage.jpg");
}

默认渲染:原始大小(不取决于显式的大小声明)

限制条件:

  • 继承会将“列表样式”值从OL和UL元素传输到LI元素。这是指定列表样式信息的推荐方法。

  • 它们不允许作者为列表标记指定不同的样式(颜色,字体,对齐方式等)或调整其位置

此方法也不适合<img>标签,因为无法在元素类型之间进行转换,这是有限的,不合规的技巧,在Chrome上不起作用。

好的候选方法,请看结论...



CSS3border-image:属性推荐

最新的W3C状态:候选建议 CSS背景和边框模块3级 2014年9月9日

一种背景类型的方法,该方法依赖于以一种非常特殊的方式指定大小(此用例尚未定义)到目前为止的后备边框属性(例如border: solid):

请注意,即使它们永远不会导致滚动机制,但原始图像仍可能被祖先或视口剪切。

此示例说明了该图像仅构成为右下角的装饰

.myClass {
    border: solid;
    border-width: 0 480px 320px 0;
    border-image: url("http://i.imgur.com/uKnMvyp.jpg") 0 100% 100% 0;
}

适用于:所有元素,但内部表元素除外 border-collapse: collapse

不过它不能改变一个<img>的标签src(但这里的一个黑客),相反,我们可以装点它:

标准发布后要考虑的良好候选方法。



CSS3element()符号工作草案也值得一提:

注意:该element()函数仅复制所引用元素的外观,而不复制实际内容及其结构。

<div id="img1"></div>

<img id="pic1" src="http://i.imgur.com/uKnMvyp.jpg" class="hide" alt="wolf">
<img id="pic2" src="http://i.imgur.com/TOUfCfL.jpg" class="hide" alt="cat">

我们将使用呈现内容两者之一的隐藏图像来改变图像背景中的#img1基础上,ID选择通过CSS:

#img1 {
    width: 480px; 
    height: 320px; 
    background: -moz-element(#pic1) no-repeat;
    background-size: 100% 100%;
}

.hide {display: none}

注意:这是实验性的,仅-moz在Firefox中使用前缀,并且仅在over backgroundbackground-image属性上有效,还需要指定大小。


结论

  1. 任何语义内容或结构信息都包含在HTML中。
  2. 样式和演示信息在CSS中。
  3. 出于SEO的目的,请不要在CSS中隐藏有意义的图像。
  4. 打印时通常禁用背景图形。
  5. 可以使用自定义标签并从CSS中设置自定义标签,但是在没有Javascript或CSS 指导的情况下,Internet Explorer的原始版本无法理解(IE无法对HTML5标签进行样式设置(带有shiv))。
  6. SPA的设计(单页应用程序)通常在背景中合并图像

话虽如此,让我们探索适合图像显示的HTML标签:

所述<li>元素[HTML4.01 +]

list-style-imagewith display: list-item方法的完美用例。

<li>元素可以是空的,可以流动的内容,它甚至允许真实省略</li>结束标记。

局限性:难以样式化(width:float:可能会有所帮助)

所述<figure>元素[HTML5 +]

图形元素表示一些流程内容,可以选择包含标题,这些内容是独立的(如完整的句子),通常从文档的主要流程中引用为单个单元。

元素有效,没有内容,但建议包含<figcaption>

因此,该元素可用于注释插图,图表,照片,代码清单等。

默认渲染:该元素右对齐,并带有左右填充!

所述<object>元素[HTML4 +]

为了包括图像,作者可以使用OBJECT元素或IMG元素。

data属性是必需的,并且可以具有有效的MIME类型作为值!

<object data="data:x-image/x,"></object>

注意:利用<object>CSS 中的标记的一个技巧是设置一个自定义有效的MimeType,x-image/x然后设置 无数据(值在必需的逗号后无数据,

默认渲染:300 x 150px,但是可以在HTML或CSS中指定尺寸。

<SVG>标签

需要具有SVG 功能的浏览器,并具有<image>用于栅格图像的 元素

所述<canvas>元素[HTML5 +]。

width属性默认为300,该height属性默认为150

<input>元素type="image"

局限性:

...该元素应显示为按钮状,以表明该元素是一个按钮。

哪个Chrome跟随并在没有文本时呈现4x4px的空白方块

部分解,设置为value=" "

<input type="image" id="img1" value=" ">

还请注意HTML5.1中即将发布的<picture>元素,该元素目前是工作草案



很好的答案,但显示了作为提供基本原语的平台的Web完全失败。
serraosays

26

我用这个CSS使用了空的div解决方案:

#throbber {
    background-image: url(/Content/pictures/ajax-loader.gif);
    background-repeat: no-repeat;
    width: 48px;
    height: 48px;
    min-width: 48px;
    min-height: 48px;
}

HTML:

<div id="throbber"></div>

如果要内联显示怎么办?添加“ display:inline”使我的div尺寸为0x0 ...
elsurudo 2014年

1
@elsurudo如果要在嵌入式元素上设置宽度和高度,请使用display:inline-block
Erin Drummond 2014年

1
最佳答案不适用于Firefox,因此,我更喜欢您的答案!而且很明显,没有CSS hacks。
谢尔盖·博格达诺夫

如果需要显示多个图像,请记住,ID字段在技术上应该是唯一的,因此使用CSS类选择器代替ID是理想的选择。
mix3d

如果您在打印设置中关闭了背景图形,则这种类型的图像将无法正确打印。
posfan12

14

我发现了比提出的解决方案更好的方法,但是它确实使用了背景图像。 兼容方法(无法确认IE6) 信用:http : //www.kryogenix.org/code/browser/lir/

<img src="pathTo/myImage.jpg"/>

CSS:

img[src*="pathTo/myImage.jpg"] {

    background-image: url("mynewimg.jpg"); /* lets say 20x20 */
    width: 20px;

    display:inline-block;
    padding: 20px 0 0 0;
    height: 0px !important;

    /* for IE 5.5's bad box model */
    height /**/:20px;
}

看不到旧图像,而新图像则符合预期。


以下简洁的解决方案仅适用于webkit

img[src*="pathTo/myImage.jpg"] {

    /* note :) */
    content:'';
    display:inline-block;

    width: 20px;
    height: 20px;
    background-image: url("mynewimg.jpg"); /* lets say 20x20 */

}

这是一个巧妙的技巧,但是它真的符合标准吗?在W3C网页说,content物业只适用于:before:after伪类。另外,如果您必须支持IE7或更早版本,我认为content不存在支持。仍然,非常诱人。
jatrim 2012年

没错,我只是找到了一种更合规的方法。正在更新我的帖子!现在投票给我;)哈哈。
EricG

更新的方法肯定比依赖内容的方法更好。感谢您加入原始链接。那真是有见地。您会注意到,@ RobAu的答案实际上也与您的更新版本非常相似。
jatrim 2012年

1
@jatrim该content属性适用于所有元素。http://www.w3.org/TR/css3-content/#content
XP1,13年

13

他们是对的。IMG是一个内容元素,而CSS是关于设计的。但是,当您出于设计目的使用某些内容元素或属性时呢?我的网页上都有IMG,如果我更改样式(CSS),则必须更改。

好吧,这是一种以CSS样式定义IMG表示形式(实际上不是图像)的解决方案。

  1. 创建一个1x1透明gif或png。
  2. 为该图像分配IMG的属性“ src”。
  3. 使用CSS样式中的“背景图像”定义最终呈现。

它就像一个魅力:)


5
-1即使您的回答还不错,他也特别提到他不想使用background*
fresskoma 2011年

1
这是一个把戏...在我看来,把戏将被浏览器改变...并且每天早上您都会在您的网站中看到一个地狱:D :)))
Mahdi Jazini

11

这是一个非常好的解决方案-> http://css-tricks.com/replace-the-image-in-an-img-with-css/

Pro和Con:
(+)可与vector具有相对宽度/高度(RobAu答案无法处理的问题)
(+)的图像是跨浏览器(也适用于IE8 +)
(+),它仅使用CSS。因此,无需修改img src(或者如果您没有访问权限/不想更改已经存在的img src属性)。
(-)抱歉,它确实使用了背景CSS属性:)


现在,这是正确的解决方案,它在所有浏览器中都适用于我,谢谢!还值得一提的是,我必须添加:background-size:100%; 到上述解决方案中的CSS类,以使替换图像正确显示。
mikhail-t 2014年

9

您可以在HTML代码中定义2张图片,并用于display: none;确定哪一张图片可见。


我一直在寻找一种既可响应Web又可维护SEO的解决方案。我想在CSS中使用媒体查询来更改图像,具体取决于所使用的设备,但我想将内容保留为HTML。在CSS中声明源是我不希望采用的方法,因此background-image不是一种选择。我想要img用于SEO的标签。您的答案是如此简单,优雅,并解决了我的所有障碍!太棒了!用户也不必下载两个图像。此外,我可以添加任意数量的图像。
泽维尔

到目前为止,我阅读的每个答案都将迫使我要么在样式表中声明源,要么在标记中使用内联CSS。我都不满意。乱码!
泽维尔

7

不,您不能通过CSS设置image src属性。你可以得到最接近的是,如你所说,background或者background-image。我不建议这样做,因为这样做有点不合逻辑。

但是,如果您要定位的浏览器可以使用CSS3解决方案,则可以使用它。content:url 按照Pacerier的回答中所述使用。您可以在下面的其他答案中找到其他跨浏览器的解决方案。


1
为什么要投下反对票?该答案比接受的答案更准确。
harsimranb 2014年

1
到目前为止最好的答案:不,您不能使用CSS做到这一点。
Milche Patern 2014年

4

将几个图像放入“控制”容器中,然后更改容器的类。在CSS中,根据容器的类添加规则来管理图像的可见性。这将产生与更改img src单个图像的属性相同的效果。

HTML:

<span id="light" class="red">
    <img class="red" src="red.png" />
    <img class="yellow" src="yellow.png" />
    <img class="green" src="green.png" />
</span>

CSS:

#light         { ... }
#light         *        { display: none; }     // all images are hidden
#light.red     .red     { display: inline; }   // show red image when #light is red
#light.yellow  .yellow  { display: inline; }   // .. or yellow
#light.green   .green   { display: inline; }   // .. or green

请注意,它将像CSS一样预加载所有图像backround-image,但是与img src通过JS进行更改不同。


3

替代方式

.myClass {
background: url('/img/loading_big.gif');
}
<div class="myClass"></div>

3

我会在HTML中保留一些数据,但是最好在CSS中定义src

<img alt="Test Alt text" title="Title text" class="logo">

.logo {
    content:url('../images/logo.png');
}

2

据我所知,您不能。CSS是关于样式的,图像的src是内容。


3
如今,经常有图像用于修饰页面。
洛伦佐·波利多里

2
这意味着用作边框,背景等的图像与实际上是页面内容一部分即图像的图像之间可能存在差异。图表,照片条等
里斯范德瓦尔登

1
您可以,在某些常见的有效情况下,您可能想要这样做。
ryan0 2014年

2

我的答案是重申先前的解决方案并强调纯CSS实现。

如果您要从另一个站点采购内容,因此您无法控制所提供的HTML,则需要Pure CSS解决方案。就我而言,我试图删除许可源内容的品牌,以便被许可方不必为他们购买内容的公司做广告。因此,我在保留所有其他内容的同时删除了他们的徽标。我应该注意,这样做是在我的客户合同范围内的。

{ /* image size is 204x30 */
     width:0;
     height:0;
     padding-left:102px;
     padding-right:102px;
     padding-top:15px;
     padding-bottom:15px;
     background-image:url(http://sthstest/Style%20Library/StThomas/images/rhn_nav_logo2.gif);
}

2

我知道这是一个非常老的问题,但是没有答案可以为为什么永远无法做到提供正确的理由。尽管您可以“做”正在寻找的东西,但是您不能以有效的方式来做。为了拥有有效的img标签,它必须具有src和alt属性。

因此,提供不使用src属性的img标签来实现此目的的任何答案都在促进使用无效代码。

简而言之:您要查找的内容无法在语法结构内合法完成。

资料来源:W3验证器


2

或者您也可以这样做,我在互联网上发现了问题。

https://robau.wordpress.com/2012/04/20/override-image-src-in-css/

<img src="linkToImage.jpg" class="egg">
.egg {
  width: 100%;
  height: 0;
  padding: 0 0 200px 0;
  background-image: url(linkToImage.jpg);
  background-size: cover;
}

这样可以有效地隐藏图像并填充背景。噢,这可真是骇人听闻,但是,如果您想要带有alt文本且背景可以在不使用JavaScript的情况下缩放的IMG标签?

在一个我正在研究的项目中,我创建了一个英雄方块树枝模板

<div class="hero">
  <img class="image" src="{{ bgImageSrc }}"
       alt="{{ altText }}" style="background-image: url({{ bgImageSrc }});">
</div>



1

您可以使用JS进行转换:

$('.image-class').each(function(){
    var processing = $(this).attr('src');
    $(this).parent().css({'background-image':'url('+processing+')'});
    $(this).hide();
});

0

如果您尝试根据项目的上下文动态在按钮中添加图像,则可以使用?根据结果​​参考来源。在这里,我使用mvvm设计,让我的Model.Phases [0]值确定我是否希望基于灯光相位的值在我的按钮上填充打开或关闭的灯泡图像。

不确定是否有帮助。我正在使用JqueryUI,Blueprint和CSS。类定义应允许您根据自己的喜好为按钮设置样式。

    <button>                           
  <img class="@(Model.Phases[0] ? "light-on": "light-off")" src="@(Model.Phases[0] ? "~/Images/LightBulbOn.png" : "~/Images/LightBulbOff.png")"/>                             
  <img class="@(Model.Phases[0] ? "light-on": "light-off")" src="@(Model.Phases[0] ? "~/Images/LightBulbOn.png" : "~/Images/LightBulbOff.png")"/>   
  <img class="@(Model.Phases[0] ? "light-on": "light-off")" src="@(Model.Phases[0] ? "~/Images/LightBulbOn.png" : "~/Images/LightBulbOff.png")"/>     


0

我要补充一点:背景图像也可以定位为background-position: x y;(x水平y垂直)。(..)我的案例,CSS:

(..) 
#header {
  height: 100px; 
  background-image: url(http://.../head6.jpg); 
  background-position: center; 
  background-repeat: no-repeat; 
  background-color: grey; 
  (..)
} 
(...)

0

HTMl代码:

<!DOCTYPE html>
<html>
     <head>
         <link type="text/css" rel="stylesheet" href="css destination" />
     </head>
     <body>
<!-- click-able pic with link -->
           <a href="site you want"> 
<!-- Take the off if you don't want click-able link -->
                <h1 id(or class)="nameOfClassorid">
                     <span>Text that is not important</span>
                </h1>
           </a>
      </body>
 </html>

CSS代码:

span {
     display: none;
}
h1 id or class {
     height: of pic;
     width: of pic;
/* Only flaw (so far) read bottom */
     background-image:url(/* "image destination" */);
}
h1 id or class:hover {
/* Now the awesome part */
     background-image:url(/* 'new background!!!' */);
}

我放学后一直在学习html,想知道如何做到这一点。找出背景,然后将2和2放在一起。如果没有确保您填写必要的东西,这100%我检查过了!!!我们需要指定高度,因为没有它,就什么也没有!我将保留可添加的基本外壳。

例:

 <!DOCTYPE html>
 <html>
     <head>
         <link type="text/css" rel="stylesheet" href="style.css" />
     </head>
     <body>
           <a href="http:localhost"> 
                <h1>
                     <span>Text that is not important</span>
                </h1>
           </a>
     </body>
 </html>
span {
     display: none;
}
h1 {
     height: 100px;
     width: 100px;
     background-image:url("http://linuxlog.org/wp-content/uploads/2011/01/Ubuntu-Desktop-@-2011-01-11-191526-300x225.png");
}

h1:hover {
     height: 300px;
     width: 300px;
     background-image:url("http://cdn.css-tricks.com/images/ads/wufoo-600x600-red.png");
}

PS是的,我是Linux用户;)


0

当用户在禁用“打印背景颜色和图像 ”的情况打印文档时,任何基于backgroundbackground-image可能失败的方法。不幸的是,这是典型浏览器的默认设置。

这里唯一的打印友好和跨浏览器兼容的方法是Bronx提出的方法。


0

使用现代CSS属性从CSS定义加载IMG src

<style>
  body {
    --imgid: 1025; /* optional default img */
  }

  .shoes {
    --imgid: 21;
  }

  .bridge {
    --imgid: 84;
  }

  img {
    --src: "//i.picsum.photos/id/"var(--imgid)"/180/180.jpg"
  }

</style>
<script>
  function loadIMG(img) {
    img.src = getComputedStyle(img)	// compute style for img
      .getPropertyValue("--src")		// get css property
      .replace(/[" ]/g, "");				// strip quotes and space
  }

</script>
<img src onerror=loadIMG(this) class=bridge>
<img src onerror=loadIMG(this) class=shoes>
<img src onerror=loadIMG(this)>

  • src<IMG>上的空定义会触发onerror处理程序:loadIMG函数
  • loadIMG函数计算CSS值
  • 去除所有非法字符
  • 设置IMG.src
  • 当CSS更改时,图像不会更新!您必须再次致电loadIMG

JSFiddle:https ://jsfiddle.net/CustomElementsExamples/vjfpu3a2/


相关SO答案:WCPROPS



-3

只需使用HTML5 :)

<picture>
    <source srcset="smaller.jpg" media="(max-width: 768px)">
    <source srcset="default.jpg">
    <img srcset="default.jpg" alt="My default image">
</picture>

OP特别希望使用CSS解决方案来清理其HTML标记。这个答案只会使标记更加混乱。
webaholik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.