img srcset,浏览器选择了太大的图像
img srcset, browser chooses too large images
这是Gatsby生成的图片srcset:
<source type="image/webp" srcset="
/static/be21c7dd0d11c74c18530fc39aefa922/10917/mailboxes.webp 200w,
/static/be21c7dd0d11c74c18530fc39aefa922/21f2d/mailboxes.webp 400w,
/static/be21c7dd0d11c74c18530fc39aefa922/fdc6a/mailboxes.webp 800w,
/static/be21c7dd0d11c74c18530fc39aefa922/e7f3d/mailboxes.webp 1200w,
/static/be21c7dd0d11c74c18530fc39aefa922/faacb/mailboxes.webp 1600w,
/static/be21c7dd0d11c74c18530fc39aefa922/acdd2/mailboxes.webp 1800w"
sizes="(max-width: 800px) 100vw, 800px">
我的图片显示在最大 800px 宽的容器中,所以这是我希望浏览器选择的方式:
if screenWidth > 400 then choose 800w
if screenWidth > 200 then choose 400w
else choose 200w
但是,浏览器实际上总是选择尽可能大的图像(即使我将浏览器的大小调整为 200 宽度)。
我认为问题出在这里:
sizes="(max-width: 800px) 100vw, 800px"
应该有~3个条件吧?相反,只有 1 个条件。我什至不确定我是否能够解释此条件试图要求浏览器执行的操作。
下面是我的 GraphQL 代码:
edges {
node {
excerpt
fields {
slug
prefix
}
frontmatter {
title
tags
cover {
children {
... on ImageSharp {
fluid(maxWidth: 800, maxHeight: 360, traceSVG: { color: "#f9ebd2" }) {
...GatsbyImageSharpFluid_withWebp_tracedSVG
}
}
}
}
}
}
}
片段 ...GatsbyImageSharpFluid_withWebp_tracedSVG
生成 srcset
和 sizes
。在文档中,我无法做任何事情来影响它们的生成方式。但是,我可能会在以后操纵它们:
<Picture fluid={fluid} />
此时我应该操纵 fluid.sizes
,还是有更简单的方法来修复 srcset?
生成的流体对象不需要手动修改,查询图片时可以传入一个选项,如下:
{
file(ext: {
eq: ".png"
}) {
childImageSharp {
fluid(maxWidth: 800, sizes: "(min-width: 400px) 800px ,(min-width: 200px) 400px, 200px") {
srcSet
sizes
}
}
}
}
sizes="(max-width: 800px) 100vw, 800px"
这是 gatsby-plugin-sharp
为流体图像生成的默认尺寸。它有 2 条规则:
(max-width: 800px) 100vw -> If viewport < 800px, use 100vw
800px -> By default use 800px
所以浏览器应该...始终使用 800px?
你的规则可能应该是这样的:
(min-width: 400px) 800px, <-- if > 400, use 800px
(min-width: 200px) 400px, <-- if > 200, use 400px
200px <-- else use 200px
部分资源:
事实证明加载了高分辨率图像,因为我使用的是具有高 DPI 的设备。所以它按预期工作。
网络浏览器在选择要显示的图像时应用 devicePixelRatio
进行计算。例如,如果 devicePixelRatio == 2,则设备具有典型像素数量的 2 倍(相对于设备的物理宽度和到用户的物理距离)。当浏览器想要在此设备上呈现“800 像素宽”的图像时,它实际上需要 1600 像素宽的图像才能使其在这种高 DPI 显示器上看起来不错。
浏览器实际上遵循 sizes
规则。改编自 Derek 的回答:
(max-width: 800px) 100vw -> If viewport < 800px, use (100vw * devicePixelRatio)
800px -> By default use (800px * devicePixelRatio)
这是Gatsby生成的图片srcset:
<source type="image/webp" srcset="
/static/be21c7dd0d11c74c18530fc39aefa922/10917/mailboxes.webp 200w,
/static/be21c7dd0d11c74c18530fc39aefa922/21f2d/mailboxes.webp 400w,
/static/be21c7dd0d11c74c18530fc39aefa922/fdc6a/mailboxes.webp 800w,
/static/be21c7dd0d11c74c18530fc39aefa922/e7f3d/mailboxes.webp 1200w,
/static/be21c7dd0d11c74c18530fc39aefa922/faacb/mailboxes.webp 1600w,
/static/be21c7dd0d11c74c18530fc39aefa922/acdd2/mailboxes.webp 1800w"
sizes="(max-width: 800px) 100vw, 800px">
我的图片显示在最大 800px 宽的容器中,所以这是我希望浏览器选择的方式:
if screenWidth > 400 then choose 800w
if screenWidth > 200 then choose 400w
else choose 200w
但是,浏览器实际上总是选择尽可能大的图像(即使我将浏览器的大小调整为 200 宽度)。
我认为问题出在这里:
sizes="(max-width: 800px) 100vw, 800px"
应该有~3个条件吧?相反,只有 1 个条件。我什至不确定我是否能够解释此条件试图要求浏览器执行的操作。
下面是我的 GraphQL 代码:
edges {
node {
excerpt
fields {
slug
prefix
}
frontmatter {
title
tags
cover {
children {
... on ImageSharp {
fluid(maxWidth: 800, maxHeight: 360, traceSVG: { color: "#f9ebd2" }) {
...GatsbyImageSharpFluid_withWebp_tracedSVG
}
}
}
}
}
}
}
片段 ...GatsbyImageSharpFluid_withWebp_tracedSVG
生成 srcset
和 sizes
。在文档中,我无法做任何事情来影响它们的生成方式。但是,我可能会在以后操纵它们:
<Picture fluid={fluid} />
此时我应该操纵 fluid.sizes
,还是有更简单的方法来修复 srcset?
生成的流体对象不需要手动修改,查询图片时可以传入一个选项,如下:
{
file(ext: {
eq: ".png"
}) {
childImageSharp {
fluid(maxWidth: 800, sizes: "(min-width: 400px) 800px ,(min-width: 200px) 400px, 200px") {
srcSet
sizes
}
}
}
}
sizes="(max-width: 800px) 100vw, 800px"
这是 gatsby-plugin-sharp
为流体图像生成的默认尺寸。它有 2 条规则:
(max-width: 800px) 100vw -> If viewport < 800px, use 100vw
800px -> By default use 800px
所以浏览器应该...始终使用 800px? 你的规则可能应该是这样的:
(min-width: 400px) 800px, <-- if > 400, use 800px
(min-width: 200px) 400px, <-- if > 200, use 400px
200px <-- else use 200px
部分资源:
事实证明加载了高分辨率图像,因为我使用的是具有高 DPI 的设备。所以它按预期工作。
网络浏览器在选择要显示的图像时应用 devicePixelRatio
进行计算。例如,如果 devicePixelRatio == 2,则设备具有典型像素数量的 2 倍(相对于设备的物理宽度和到用户的物理距离)。当浏览器想要在此设备上呈现“800 像素宽”的图像时,它实际上需要 1600 像素宽的图像才能使其在这种高 DPI 显示器上看起来不错。
浏览器实际上遵循 sizes
规则。改编自 Derek 的回答:
(max-width: 800px) 100vw -> If viewport < 800px, use (100vw * devicePixelRatio)
800px -> By default use (800px * devicePixelRatio)