“ display:none”会阻止图像加载吗?


336

每个响应式网站开发教程都建议使用display:noneCSS属性来隐藏内容,以免在移动浏览器中加载内容,从而使网站加载速度更快。是真的吗 难道display:none不加载图像或它仍然加载在手机浏览器的内容?有什么方法可以防止在移动浏览器上加载不必要的内容?


6
似乎确实有一些方法可以防止显示广告的下载:无,但不是香草的方法:timkadlec.com/2012/04/media-query-asset-downloading-results
mrwweb 2014年

1
W3C正在积极对其进行测试:w3.org/2009/03/image-display-none/test.php
Pino

Answers:


191

浏览器变得越来越聪明。今天,如果您的浏览器(取决于版本)可以确定图像没有用,则可能会跳过图像加载。

该图像具有display:none样式,但是脚本可以读取其大小。如果父级为隐藏状态,Chrome v68.0不会加载图像。

您可以在此处进行检查:http : //jsfiddle.net/tnk3j08s/

您也可以通过查看浏览器开发人员工具的“网络”标签来进行检查。

请注意,如果浏览器在小型CPU计算机上,则不必渲染图像(和布局页面)将使整个渲染操作更快,但是我怀疑这在今天是否确实有意义。

如果要防止图像加载,您可以简单地不将IMG元素添加到文档中(或将IMG src属性设置为"data:""about:blank")。


50
空图像src是危险的。它将额外的请求发送到服务器。有关此主题的好书nczonline.net/blog/2009/11/30/…–
Srinivas

2
@SrinivasYedhuri是的,你是对的。我编辑了一个更好的解决方案。
DenysSéguret13年

8
这个答案只是部分正确。我刚刚在Google Chrome浏览器(v35)上对此进行了测试,可以确认未下载显示设置为无的图像。这可能会使开发人员更容易进行响应式设计。
肖恩·惠纳

15
这个答案不再正确。请参阅下面如何不同浏览器的更新结果,包括FF的最新版本,不同的方式处理这种情况
DMTintner

2
即使在今天(2017年10月),最常见的浏览器Chrome也会下载所有“ img”元素源,即使它们已隐藏。它不会下载隐藏的背景图片。
TKoL

130

如果在CSS中将图像作为div的背景图像,则将该div设置为“ display:none”时,将不会加载该图像。禁用CSS时,它仍然不会加载,因为CSS被禁用了。


17
在我看来,这实际上是响应式设计的一个非常有用的技巧。
ryandlf

3
这适用于FF,Chrome,Safari,Opera和Maxthon。我还没有尝试过任何IE。
布伦特2014年

13
从正面突破!<div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>。结果:Firefox 29和Opera 12无法加载。IE 11和Chrome 34加载。
CoolCmd 2014年

3
@CoolCmd为响应式设计这仍然是一个可行的选择,因为你可以在你的CSS媒体查询集background-imagenone的地方,你不想要的形象负荷的情况下。对于不使用JS的用例,没有找到更好的替代方法。
Qtax 2015年

1
我测试了具有最小宽度媒体查询的图像滑块(使用背景图像)。在该宽度以下,父div具有CSS display: none;。窗口低于该宽度的网络测试:Chrome 35,IE11和Edge未加载图像
binaryfunt 2015年

57

答案并不像简单的是或否那样容易。查看我最近做的测试结果:

  • 在Chrome中:加载所有8张屏幕截图-*图像(img 1)
  • 在Firefox中:仅加载当前显示的1张屏幕截图*图片(img 2)

因此,在进一步研究之后,我发现了this,它解释了每种浏览器如何基于css display处理加载img资产。

博客文章摘录:

  • Chrome和Safari(WebKit):
    WebKit每次都会下载文件,除非通过不匹配的媒体查询应用了背景。
  • Firefox:
    如果隐藏了样式,Firefox将不会下载带有背景图像的图像,但它们仍将从img标签下载资源。
  • Opera:
    与Firefox一样,Opera不会加载无用的背景图像。
  • Internet Explorer:
    IE和WebKit一样,即使显示也将下载背景图像。IE6出现了一些奇怪的现象:具有背景图像并显示的元素:不会内联设置的任何内容都不会下载...但是如果不内联应用这些样式,则会出现这种情况。

Chrome-已加载全部8张屏幕截图-*图片

Firefox-仅加载当前显示的1张屏幕截图*图片


1
只要这些结果不是标准的一部分,它们就毫无意义。Chrome更改了渲染引擎,歌剧也发生了变化,IE将会被其他东西所取代。您只是不能指望像这样的边缘功能的实现会随着时间的推移保持稳定。该解决方案将是一种向浏览器提示何时延迟加载资产的方式。
马克·卡普伦

5
@MarkKaplun我并不是说这些测试结果应该向您确切显示所有浏览器始终会发生的情况。我只想证明答案是“不像是或否那样简单”。每个浏览器目前正在实施不同这一点,这可能会继续这样了一会儿
DMTintner

@DMTintner完全正确。从今天起,我可以确认iOS Safari浏览器已加载显示为“ display:none”的div的背景图像。最好的方法是不假设任何内容,并且如果您不希望加载图像,请不要在html标签中引用它
bhu Boue vidya

34

HTML5 <picture>标签将帮助您根据屏幕宽度解析正确的图像源

显然,在过去的5年中,浏览器的行为并没有太大变化,即使display: none设置了属性,许多浏览器仍会下载隐藏的图像。

即使有媒体查询的解决方法,也只有在将图像设置为CSS中的背景时才有用。

当我在想这个问题只有一个JS解决方案(延迟加载图片填充等)时,似乎有一个不错的纯HTML解决方案随HTML5一起提供。

这就是<picture>标签。

这是MDN的描述方式:

HTML <picture>元素是用于指定多个容器<source>为特定的元素<img>载于它。浏览器将根据页面的当前布局(图像将出现在框的约束中)和将在其上显示的设备(例如,普通或hiDPI设备)选择最合适的来源。

以及使用方法:

<picture>
 <source srcset="mdn-logo-wide.png" media="(min-width: 600px)">
 <img src="mdn-logo-narrow.png" alt="MDN">
</picture>

背后的逻辑

img仅当没有任何媒体规则适用时,浏览器才会加载标签的来源。当<picture>浏览器不支持该元素时,它将再次回退到显示img标签。

通常,您会将最小的图像作为的来源,<img>因此不会为较大的屏幕加载较重的图像。反之亦然,如果适用媒体规则,<img>则不会下载的源,而是下载相应<source>标记的url内容。

这里唯一的陷阱是,如果浏览器不支持该元素,它将仅加载小图像。另一方面,在2017年,我们应该以移动优先的方式进行思考和编码。

在有人退出之前,这是当前浏览器对的支持<picture>

桌面浏览器

桌面浏览器支持

手机浏览器

移动浏览器支持

您可以在可以使用上找到有关浏览器支持的更多信息。

好消息是html5please的句子是将其与备用广告一起使用。我个人打算听取他们的建议。

您可以在W3C的规范中找到有关该标签的更多信息。那里有一个免责声明,我发现重要的是要提及:

picture元素与外观相似的videoaudio元素有所不同。尽管所有source元素都包含元素,但是src当元素嵌套在元素中时,源元素的属性没有意义picture,并且资源选择算法也不同。同样,picture元素本身不显示任何内容。它仅为其包含的img元素提供上下文,使它能够从多个URL中进行选择。

所以说的是,它仅通过提供一些上下文来帮助您在加载图像时提高性能。

而且您仍然可以使用一些CSS魔术来在小型设备上隐藏图像:

<style>
  picture { display: none; }

  @media (min-width: 600px) {
    picture {
      display: block;
    }
  }
</style>

<picture>
 <source srcset="the-real-image-source" media="(min-width: 600px)">
 <img src="a-1x1-pixel-image-that-will-be-hidden-in-the-css" alt="MDN">
</picture>

因此,浏览器将不会显示实际图像,而只会下载1x1像素图像(如果您多次使用它,则可以将其缓存)。但是请注意,如果<picture>浏览器不支持该标签,即使在桌面桌面上也不会显示实际图像(因此,您肯定需要在其中添加polyfill备份)。


4
我采取了与您类似的路线,但改用了data-img :)这是我在上面写的帖子swimburger.net/blog/web/…–
Swimburger

10

是的,它的渲染速度会稍微加快一点,只是因为它不必渲染图像,而且在屏幕上排序的元素要少一个。

如果您不希望加载它,请将DIV留空,以便稍后将html包含<img>标签的HTML加载到其中。

尝试使用Firebug或Wireshark,就像我之前提到的那样,即使display:none存在,文件也会被传输。

如果将显示设置为无,Opera是唯一不会加载图像的浏览器。Opera现在已移至webkit,即使其显示设置为无,也将渲染所有图像。

这是一个测试页面,可以证明这一点:

http://www.quirksmode.org/css/displayimg.html


9

** 2019年答案 **

在正常情况下display:none不会阻止图像下载

/*will be downloaded*/

#element1 {
    display: none;
    background-image: url('https://picsum.photos/id/237/100');
}

但是,如果有祖先元素,display:none则将不会下载后代的图像


/* Markup */

<div id="father">
    <div id="son"></div>
</div>


/* Styles */

#father {
    display: none;
}

/* #son will not be downloaded because the #father div has display:none; */

#son {
    background-image: url('https://picsum.photos/id/234/500');
}

其他阻止下载图像的情况:

1-目标元素不存在

/* never will be downloaded because the target element doesn't exist */

#element-dont-exist {
    background-image: url('https://picsum.photos/id/240/400');
}

2-两个相等的类加载不同的图像

/* The first image of #element2 will never be downloaded because the other #element2 class */

#element2 {
    background-image: url('https://picsum.photos/id/238/200');
}

/* The second image of #element2 will be downloaded */

#element2 {
    background-image: url('https://picsum.photos/id/239/300');
}

您可以在这里自己看:https : //codepen.io/juanmamenendez15/pen/dLQPmX


8

怪癖模式:图片和显示:无

当image具有display: none或位于元素中时 display:none,浏览器可能选择不下载图像,除非将display 设置为另一个值。

切换display到时,只有Opera会下载图像block。其他所有浏览器均立即下载。


8

如果将div设置为'display:none',则将加载 div元素的背景图像。

无论如何,如果同一个div有一个父对象,并且该父对象设置为'display:none',则子元素的背景图片将不会加载。:)

使用引导程序的示例:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


<div class="col-xs-12 visible-lg">
	<div style="background-image: url('http://via.placeholder.com/300x300'); background-repeat:no-repeat; height: 300px;">lg</div>
</div>
<div class="col-xs-12 visible-md">
	<div style="background-image: url('http://via.placeholder.com/200x200'); background-repeat:no-repeat; height: 200px;">md</div>
</div>
<div class="col-xs-12 visible-sm">
	<div style="background-image: url('http://via.placeholder.com/100x100'); background-repeat:no-repeat; height: 100px">sm</div>
</div>
<div class="col-xs-12 visible-xs">
	<div style="background-image: url('http://via.placeholder.com/50x50'); background-repeat:no-repeat; height: 50px">xs</div>
</div>



4

如果将图像设为CSS中div的背景图像,则将该div设置为“ display:none”时,将不会加载该图像。

只是扩展布伦特的解决方案。

您可以为纯CSS解决方案执行以下操作,它还可以使img框实际上像响应式设计设置中的img框一样(这是透明png的作用),如果您的设计使用动态响应式设计,这特别有用-调整图像大小。

<img style="display: none; height: auto; width:100%; background-image: 
url('img/1078x501_1.jpg'); background-size: cover;" class="center-block 
visible-lg-block" src="img/400x186_trans.png" alt="pic 1 mofo">

仅当触发了与visible-lg-block绑定的媒体查询并将display:none更改为display:block时,才会加载图像。透明png用于允许浏览器在流畅的设计中为<img>块(以及背景图像)设置适当的height:width比率(高度:自动;宽度:100%)。

1078/501 = ~2.15  (large screen)
400/186  = ~2.15  (small screen)

因此,对于3个不同的视口,最终会得到如下所示的结果:

<img style="display: none; height: auto; width:100%; background-image: url('img/1078x501_1.jpg'); background-size: cover;" class="center-block visible-lg-block" src="img/400x186_trans.png" alt="pic 1">
<img style="display: none; height: auto; width:100%; background-image: url('img/517x240_1.jpg'); background-size: cover;" class="center-block visible-md-block" src="img/400x186_trans.png" alt="pic 1">
<img style="display: none; height: auto; width:100%; background-image: url('img/400x186_1.jpg'); background-size: cover;" class="center-block visible-sm-block" src="img/400x186_trans.png" alt="pic 1">

而且,在初始加载期间,只有默认的媒体视口大小的图像会加载,然后,根据视口的不同,图像会动态加载。

而且没有JavaScript!



2

嗨,大家好,我在同样的问题上苦苦挣扎,如何在手机上不加载图片。

但是我想出了一个很好的解决方案。首先制作一个img标签,然后在src属性中加载一个空白的svg。现在,您可以将URL设置为带有内容的内联样式的URL:url('link to your image');。现在,将img标记包装在您选择的包装器中。

<div class="test">
  <img src="data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/‌​svg%22/%3E" style="content:url('https://blog.prepscholar.com/hubfs/body_testinprogress.gif?t=1495225010554')">
</div>

  @media only screen and (max-width: 800px) {
      .test{
       display: none;
      }
    }

设置包装器,使其在不希望加载图像的断点上不显示任何内容。现在,将忽略img标记的内联css,因为包裹在不显示任何内容的包装器中的元素的样式将被忽略,因此不会加载图像,直到到达包装器具有显示块的断点为止。

到那儿了,真正简单的方法是不在移动断点上加载img :)

查看此codepen,以获取工作示例:http ://codepen.io/fennefoss/pen/jmXjvo


我喜欢使用content-property更改显示的图像,从而使网络保持不断发展,以前从未见过此技巧。您能提供一些关于兼容性的统计信息吗?
Windgazer's

让Edge:/不好的是,至少在最新版本的Firefox,Chome和Safari中可以使用。
Mikkel Fennefoss

2

否。如果您考虑节省移动电话用户的带宽,该图像将照常加载,并且仍会使用用户的带宽。您可以做的是使用媒体查询并过滤要加载图像的设备。图像必须设置为div等的背景图像,而不是标签,因为无论屏幕大小和媒体查询集如何,图像标签都会加载图像。



1

使用@media查询CSS,基本上我们只是发布了一个项目,该项目的侧面是一棵巨大的树形图像,但没有显示在表格/移动屏幕上。因此,防止图像加载非常容易

这是一个小片段:

.tree {
    background: none top left no-repeat; 
}

@media only screen and (min-width: 1200px) {
    .tree {
        background: url(enormous-tree.png) top left no-repeat;
    }
}

您可以使用相同的CSS来显示和隐藏显示/可见性/不透明度,但是图像仍在加载中,这是我们想到的最安全的代码。


0

我们说的是图片无法在手机上加载,对吧?那么,如果您只是执行@media(最小宽度:400像素){background-image:thing.jpg},该怎么办?

难道不是只能在一定的屏幕宽度以上查找图像吗?


-2

使用display:none与图片的诀窍是为它们分配一个ID。当时并不需要很多代码来使其工作。这是一个使用媒体查询和3个样式表的示例。一种用于电话,一种用于平板电脑,另一种用于台式机。我有3张图片,分别是手机,平板电脑和台式机的图片。在电话屏幕上,仅会显示电话图像,平板电脑将仅显示平板电脑图像,台式机将显示在台式计算机图像上。这是一个使其工作的代码示例:

源代码:

<div id="content">
<img id="phone" src="images/phone.png" />
<img id="tablet" src="images/tablet.png" />
<img id="desktop" src="images/desktop.png" />
</div>

不需要媒体查询的手机CSS。使其工作的img#phone:

img#phone {
    display: block;
    margin: 6em auto 0 auto;
    width: 70%;
    }

img#tablet {display: none;}
img#desktop {display: none;}

平板电脑的CSS:

@media only screen and (min-width: 641px) {
img#phone {display: none;}

img#tablet {
    display: block;
    margin: 6em auto 0 auto;
    width: 70%;
    }
}

和桌面CSS:

@media only screen and (min-width: 1141px) {
img#tablet {display: none;}

img#desktop {
    display: block;
    margin: 6em auto 0 auto;
    width: 80%;
    }
}

祝你好运,让我知道它如何为您服务。


4
问题不是如何display: none在图像上设置A。是:“ display:none”会阻止图像加载吗?
伊夫根尼亚·曼诺洛娃
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.