2

当我的页面的小屏幕尺寸以 640 像素宽触发时(我使用的是 Foundation 5),我正在尝试使用 srcset 执行将 1000x400px 图像交换为 640x256px 图像的简单任务。在我指定替代图像的尝试中,浏览器似乎默认为该图像并忽略其他所有内容。顺便说一句,我使用的 alt 尺寸是 999x399px,这样我就可以看到它是否正在显示,而不是我的 1000x400px 主图像。

据我所知,我正在按照有关该主题的各种教程和文章中的指示进行操作,但我无法让它发挥作用。此外,根据我是在 Firefox 还是 Chrome 中预览结果,我会得到不同的行为。我的 Firefox 版本是“34.0.5”,我的 Chrome 版本是“39.0.2171.95 m”。

下面是我的 HTML 示例,并描述了结果。我看不出我做错了什么。似乎没有任何效果。


这个在 Firefox 中显示所有浏览器窗口大小的 1000x400px 图像,除了 Chrome 中丢失的图像图标之外不显示任何内容:

<div><img src="http://placehold.it/1000x400/444444/ffffff" srcset="http://placehold.it/640x256/444444/ffffff 640w, alt=""></div>

这个在 Firefox 中显示所有浏览器尺寸的 999x399px alt 图像,并在 Chrome 中显示所有浏览器尺寸的 640x256px 小图像。此外,Chrome 中的 640x256 图像仅限于该尺寸,并且不会在较大的浏览器窗口中放大,这与下面的其他示例不同:

<div>
    <picture>
    <source srcset="http://placehold.it/640x256/444444/ffffff, http://placehold.it/1000x400/444444/ffffff">
    <source media="(min-width: 641px)" srcset="http://placehold.it/1000x400/444444/ffffff">
    <img src="http://placehold.it/999x399/444444/ffffff" alt="">
    </picture>
    </div>

这个在 Firefox 和 Chrome 中显示所有浏览器窗口大小的 999x399px alt 图像:

<div>
    <source srcset="http://placehold.it/640x256/444444/ffffff, http://placehold.it/1000x400/444444/ffffff">
    <source media="(min-width: 641px)" srcset="http://placehold.it/1000x400/444444/ffffff">
    <img src="http://placehold.it/999x399/444444/ffffff" alt="">
    </div>

以下两个示例在 Firefox 中显示所有浏览器窗口大小的 1000x400 像素图像,但在 Chrome 中显示所有浏览器窗口大小的 640x256 像素图像。此外,这一次 640x256px 图像被放大以适应所有浏览器窗口大小,这与上面的第二个示例不同:

<div><picture><img alt="" src="http://placehold.it/1000x400/444444/ffffff" srcset="http://placehold.it/640x256/444444/ffffff 640w"></picture></div>

<div><img alt="" src="http://placehold.it/1000x400/444444/ffffff" srcset="http://placehold.it/640x256/444444/ffffff 640w"></div>

除了上面的例子,我尝试了 div、图片标签、没有 div 和没有图片标签的所有组合,但没有任何效果。我整天都在做这该死的事情!谁能看到我在这里做错了什么?跨浏览器类型的不一致结果增加了混乱。

如果您能提供帮助,请提前非常感谢。


编辑:我找到了一个适用于 Chrome 的示例,但不适用于 Firefox。我指的是这个页面: http ://www.web3.lu/picture-element-and-sr​​cset-attribute/

该页面的示例是这样的:

<img src="brain.jpg" sizes="75vw" 
 srcset="brain-small.jpg 320w, 
 brain-medium.jpg 640w, 
 brain-large.jpg 1024w,
 brain-xlarge.jpg 2000w" 
 alt="Brain Structure">

我适应了这一点:

<img src="http://placehold.it/999x399/444444/ffffff"
 sizes="100vw"
 srcset="http://placehold.it/640x256/444444/ffffff 640w, 
 http://placehold.it/1000x400/444444/ffffff 1000w"
 alt="">

我可以看到这个示例略有不同,因为它包含“大小”属性,并且包含图像的最大宽度,但我不知道为什么没有其他工作,尽管显然是如何使用 srcset 属性的示例. 另外我仍然不知道为什么这在 Firefox 中不起作用!在 Firefox 中,它仅以标准(非放大)尺寸显示 640x256px 小图像。


进一步编辑:我已经知道我可以调整上述工作示例,使其在 Firefox 中可以接受但无法操作,除了在 Chrome 中功能齐全。

我上面的最终代码的问题在于,在 Firefox 中(srcset 图像交换不起作用),我被固定大小的 640x256px 图像卡住了,所以它太小而且太单面而弄乱了显示在中等屏幕向上。它显然默认为小图像选项,而不是 src 图像或大图像。

我如何解决这个问题很简单(对于更有经验的用户来说可能很明显):我只是更改了 srcset 图像的顺序,以便 1000x400px 图像位于第一位。像这样:

<img src="http://placehold.it/999x399/444444/ffffff"
sizes="100vw"
srcset="http://placehold.it/1000x400/444444/ffffff 1000w,
http://placehold.it/640x256/444444/ffffff 640w"
alt="">

现在我的 1000x400px 图像始终显示。虽然这可能不符合“移动优先”的原则,但我无法找到一种方法来放大 640x256px 图像以适应中大屏幕。此外,放大小图像并因此影响其在大屏幕上的质量对我来说比被迫将 1000x400 像素的图像传送到小屏幕上的惩罚更大。

我仍在寻找一种方法使上述最后一个示例也可以在 Firefox 中运行,但无论如何,我希望上面的一些内容对其他初学者有所帮助,如果只是提供一些不起作用的示例。


带有问题解决方案的最终编辑:

感谢下面发布的 Alexander Farkas,我现在找到了解决方案。在此链接上:

https://github.com/aFarkas/respimage

我滚动到名为“带有宽度 w 描述符和尺寸属性的 srcset”的部分,然后我尝试了 Codepen 示例。

这在 Firefox 中运行良好。它执行了图像交换,尽管我确实必须在每个窗口大小(最小的图像除外)刷新浏览器,否则它不会每次都显示交换图像的新大小。

谢谢!

4

1 回答 1

0
<div><img src="http://placehold.it/1000x400/444444/ffffff" srcset="http://placehold.it/640x256/444444/ffffff 640w, alt=""></div>

在这里,您缺少报价,因此实际上alt=选择了 URL,这可能会给您 404 响应。

<div>
    <picture>
    <source srcset="http://placehold.it/640x256/444444/ffffff, http://placehold.it/1000x400/444444/ffffff">
    <source media="(min-width: 641px)" srcset="http://placehold.it/1000x400/444444/ffffff">
    <img src="http://placehold.it/999x399/444444/ffffff" alt="">
    </picture>
    </div>

这将始终选择http://placehold.it/640x256/444444/ffffff符合要求的实现。sources 按标记顺序进行评估,并且由于第一个没有source任何其他属性但是srcset,它被选中,然后它的第一个候选者srcset也被选中,因为它们都没有描述符(所以它们都是1x)。

<div>
    <source srcset="http://placehold.it/640x256/444444/ffffff, http://placehold.it/1000x400/444444/ffffff">
    <source media="(min-width: 641px)" srcset="http://placehold.it/1000x400/444444/ffffff">
    <img src="http://placehold.it/999x399/444444/ffffff" alt="">
    </div>

是的,这是唯一的候选人。如果source没有picture父元素,则不考虑元素。

...

我建议你通过像https://validator.nu/这样的验证器来运行你的标记。它会指出这样的错误。:-)

于 2015-01-15T12:00:18.337 回答