每个响应式网站开发教程都建议使用display:none CSS属性来隐藏移动浏览器加载的内容,这样网站加载得更快。这是真的吗?display:none不加载图像,还是在移动浏览器上加载内容?有没有什么方法可以防止在移动浏览器上加载不必要的内容?


当前回答

不。如果您正在考虑节省手机用户带宽,图像将像往常一样加载,并且仍将使用用户的带宽。你能做的就是使用媒体查询和过滤你想要加载图像的设备。你的图像必须设置为一个div的背景图像等,而不是一个标签,因为图像标签将加载图像,无论屏幕大小和媒体查询设置。

其他回答

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

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

尽管有一个媒体查询的解决方案,它只能在图像被设置为CSS背景时才有用。

虽然我认为这个问题只有一个JS解决方案(延迟加载,图片填充等),但似乎有一个很好的纯HTML解决方案是HTML5的开箱即用。

这是<picture>标签。

MDN是这样描述的:

HTML <picture>元素是一个容器,用于为其中包含的特定<img>指定多个<source>元素。浏览器将根据页面的当前布局(图像将出现在框的约束)和它将显示在设备上(例如普通或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>的支持:

桌面浏览器

移动浏览器

关于浏览器支持的更多信息,您可以在can I use。

好的方面是html5please的句子是用一个回退。我个人打算采纳他们的建议。

关于标签的更多信息可以在W3C规范中找到。这里有一个免责声明,我觉得这很重要:

图片元素与看起来相似的视频和音频元素有些不同。虽然它们都包含源元素,但当元素嵌套在图片元素中时,源元素的src属性没有意义,而且资源选择算法是不同的。同样,图片元素本身也不显示任何东西;它只是为它所包含的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>标记,即使在桌面屏幕上也不会显示实际图像(因此您肯定需要在那里进行填充备份)。

为了防止获取资源,使用Web Components的<template>元素。

我们说的是图像不能在手机上加载,对吧?那么如果你只是做一个@media (min-width: 400px){background-image:thing.jpg}

那么,它难道不会只寻找超过一定屏幕宽度的图像吗?

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

不管怎样,如果同一个div有一个父元素,并且父元素被设置为'display:none',子元素的背景图像将不会加载。:)

使用bootstrap的示例:

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

使用@media query 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来显示和隐藏显示/可见/不透明度,但图像仍在加载,这是我们想出的最安全的代码。