每个响应式网站开发教程都建议使用display:none
CSS属性来隐藏内容,以免在移动浏览器中加载内容,从而使网站加载速度更快。是真的吗 难道display:none
不加载图像或它仍然加载在手机浏览器的内容?有什么方法可以防止在移动浏览器上加载不必要的内容?
每个响应式网站开发教程都建议使用display:none
CSS属性来隐藏内容,以免在移动浏览器中加载内容,从而使网站加载速度更快。是真的吗 难道display:none
不加载图像或它仍然加载在手机浏览器的内容?有什么方法可以防止在移动浏览器上加载不必要的内容?
Answers:
浏览器变得越来越聪明。今天,如果您的浏览器(取决于版本)可以确定图像没有用,则可能会跳过图像加载。
该图像具有display:none
样式,但是脚本可以读取其大小。如果父级为隐藏状态,Chrome v68.0不会加载图像。
您可以在此处进行检查:http : //jsfiddle.net/tnk3j08s/
您也可以通过查看浏览器开发人员工具的“网络”标签来进行检查。
请注意,如果浏览器在小型CPU计算机上,则不必渲染图像(和布局页面)将使整个渲染操作更快,但是我怀疑这在今天是否确实有意义。
如果要防止图像加载,您可以简单地不将IMG元素添加到文档中(或将IMG src
属性设置为"data:"
或"about:blank"
)。
如果在CSS中将图像作为div的背景图像,则将该div设置为“ display:none”时,将不会加载该图像。禁用CSS时,它仍然不会加载,因为CSS被禁用了。
<div hidden style="display:none;width:0;height:0;visibility:hidden;background:url('test.jpg')"></div>
。结果:Firefox 29和Opera 12无法加载。IE 11和Chrome 34加载。
background-image
到none
的地方,你不想要的形象负荷的情况下。对于不使用JS的用例,没有找到更好的替代方法。
display: none;
。窗口低于该宽度的网络测试:Chrome 35,IE11和Edge未加载图像
答案并不像简单的是或否那样容易。查看我最近做的测试结果:
因此,在进一步研究之后,我发现了this,它解释了每种浏览器如何基于css display处理加载img资产。
博客文章摘录:
- Chrome和Safari(WebKit):
WebKit每次都会下载文件,除非通过不匹配的媒体查询应用了背景。- Firefox:
如果隐藏了样式,Firefox将不会下载带有背景图像的图像,但它们仍将从img标签下载资源。- Opera:
与Firefox一样,Opera不会加载无用的背景图像。- Internet Explorer:
IE和WebKit一样,即使显示也将下载背景图像。IE6出现了一些奇怪的现象:具有背景图像并显示的元素:不会内联设置的任何内容都不会下载...但是如果不内联应用这些样式,则会出现这种情况。
<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
元素与外观相似的video
和audio
元素有所不同。尽管所有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备份)。
是的,它的渲染速度会稍微加快一点,只是因为它不必渲染图像,而且在屏幕上排序的元素要少一个。
如果您不希望加载它,请将DIV留空,以便稍后将html包含<img>
标签的HTML加载到其中。
尝试使用Firebug或Wireshark,就像我之前提到的那样,即使display:none
存在,文件也会被传输。
如果将显示设置为无,Opera是唯一不会加载图像的浏览器。Opera现在已移至webkit,即使其显示设置为无,也将渲染所有图像。
这是一个测试页面,可以证明这一点:
** 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
当image具有
display: none
或位于元素中时display:none
,浏览器可能选择不下载图像,除非将display
设置为另一个值。切换
display
到时,只有Opera会下载图像block
。其他所有浏览器均立即下载。
如果将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>
如果可以的话,有没有办法在移动浏览器上不加载不必要的内容?
采用 <img src="" srcset="">
http://www.webdesignerdepot.com/2015/08/the-state-of-sensitive-images/
如果将图像设为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!
嗨,大家好,我在同样的问题上苦苦挣扎,如何在手机上不加载图片。
但是我想出了一个很好的解决方案。首先制作一个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更改显示的图像,从而使网络保持不断发展,以前从未见过此技巧。您能提供一些关于兼容性的统计信息吗?
另一种可能性是使用<noscript>
标签并将图像放置在<noscript>
标签内。然后,noscript
根据需要使用javascript删除标签。这样,您可以使用渐进增强功能按需加载图像。
使用我写的这个polyfill来读取<noscript>
IE8 中标记的内容
使用@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来显示和隐藏显示/可见性/不透明度,但是图像仍在加载中,这是我们想到的最安全的代码。
使用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%;
}
}
祝你好运,让我知道它如何为您服务。
display: none
在图像上设置A。是:“ display:none”会阻止图像加载吗?