每个响应式网站开发教程都建议使用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>元素。

使用display:none with images的技巧是为它们分配一个id。这是不需要很多代码使其工作。下面是一个使用媒体查询和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#手机让它工作:

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%;
    }
}

祝你好运,并让我知道它是如何为你工作的。

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

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

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