Loading...
Loading...
Compare original and translation side by side
<img
src="/images/hero-800.jpg"
srcset="
/images/hero-400.jpg 400w,
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="(max-width: 640px) 100vw,
(max-width: 1024px) 90vw,
1200px"
alt="Hero image description"
width="1200"
height="675"
loading="lazy"
/><img
src="/images/hero-800.jpg"
srcset="
/images/hero-400.jpg 400w,
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="(max-width: 640px) 100vw,
(max-width: 1024px) 90vw,
1200px"
alt="Hero image description"
width="1200"
height="675"
loading="lazy"
/><img
src="/images/hero-1200.jpg"
srcset="
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="100vw"
alt="Hero image"
width="1600"
height="900"
loading="eager"
fetchpriority="high"
/><img
src="/images/hero-1200.jpg"
srcset="
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="100vw"
alt="Hero image"
width="1600"
height="900"
loading="eager"
fetchpriority="high"
/>| Use Case | Widths to Generate | Sizes Attribute |
|---|---|---|
| Full-width hero | 800w, 1200w, 1600w, 2400w | |
| Content width | 400w, 800w, 1200w | |
| Grid cards (3-col) | 300w, 600w, 900w | |
| Sidebar thumbnail | 150w, 300w | |
| 使用场景 | 需生成的宽度 | sizes属性值 |
|---|---|---|
| 全屏英雄图 | 800w、1200w、1600w、2400w | |
| 内容宽度图片 | 400w、800w、1200w | |
| 网格卡片(3列) | 300w、600w、900w | |
| 侧边栏缩略图 | 150w、300w | |
| Image Position | loading | fetchpriority | Why |
|---|---|---|---|
| Hero/LCP | | | Optimize LCP, prioritize download |
| Above fold (not LCP) | | omit | Load normally |
| Below fold | | omit | Defer until near viewport |
| Off-screen carousel | | omit | Defer until interaction |
| 图片位置 | loading属性 | fetchpriority属性 | 原因 |
|---|---|---|---|
| 首屏英雄图/LCP | | | 优化LCP,优先下载 |
| 首屏非LCP图片 | | 省略 | 正常加载 |
| 首屏以下图片 | | 省略 | 进入视口附近再加载 |
| 屏幕外轮播图 | | 省略 | 交互时再加载 |
<img
src="/images/banner-1200.jpg"
srcset="
/images/banner-600.jpg 600w,
/images/banner-1200.jpg 1200w,
/images/banner-1800.jpg 1800w,
/images/banner-2400.jpg 2400w
"
sizes="100vw"
alt="Full width banner"
width="2400"
height="800"
loading="lazy"
class="w-full h-auto"
/><img
src="/images/banner-1200.jpg"
srcset="
/images/banner-600.jpg 600w,
/images/banner-1200.jpg 1200w,
/images/banner-1800.jpg 1800w,
/images/banner-2400.jpg 2400w
"
sizes="100vw"
alt="Full width banner"
width="2400"
height="800"
loading="lazy"
class="w-full h-auto"
/><img
src="/images/card-600.jpg"
srcset="
/images/card-300.jpg 300w,
/images/card-600.jpg 600w,
/images/card-900.jpg 900w
"
sizes="(max-width: 768px) 100vw,
(max-width: 1024px) 50vw,
33vw"
alt="Card image"
width="900"
height="600"
loading="lazy"
class="w-full h-auto"
/><img
src="/images/card-600.jpg"
srcset="
/images/card-300.jpg 300w,
/images/card-600.jpg 600w,
/images/card-900.jpg 900w
"
sizes="(max-width: 768px) 100vw,
(max-width: 1024px) 50vw,
33vw"
alt="Card image"
width="900"
height="600"
loading="lazy"
class="w-full h-auto"
/><div class="aspect-[16/9] overflow-hidden">
<img
src="/images/video-thumbnail-800.jpg"
srcset="
/images/video-thumbnail-400.jpg 400w,
/images/video-thumbnail-800.jpg 800w,
/images/video-thumbnail-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 800px"
alt="Video thumbnail"
width="800"
height="450"
loading="lazy"
class="w-full h-full object-cover"
/>
</div><div class="aspect-[16/9] overflow-hidden">
<img
src="/images/video-thumbnail-800.jpg"
srcset="
/images/video-thumbnail-400.jpg 400w,
/images/video-thumbnail-800.jpg 800w,
/images/video-thumbnail-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 800px"
alt="Video thumbnail"
width="800"
height="450"
loading="lazy"
class="w-full h-full object-cover"
/>
</div><picture>
<source
srcset="
/images/hero-800.avif 800w,
/images/hero-1200.avif 1200w,
/images/hero-1600.avif 1600w
"
sizes="100vw"
type="image/avif"
/>
<source
srcset="
/images/hero-800.webp 800w,
/images/hero-1200.webp 1200w,
/images/hero-1600.webp 1600w
"
sizes="100vw"
type="image/webp"
/>
<img
src="/images/hero-1200.jpg"
srcset="
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="100vw"
alt="Hero image"
width="1600"
height="900"
loading="eager"
fetchpriority="high"
/>
</picture><picture>
<source
srcset="
/images/hero-800.avif 800w,
/images/hero-1200.avif 1200w,
/images/hero-1600.avif 1600w
"
sizes="100vw"
type="image/avif"
/>
<source
srcset="
/images/hero-800.webp 800w,
/images/hero-1200.webp 1200w,
/images/hero-1600.webp 1600w
"
sizes="100vw"
type="image/webp"
/>
<img
src="/images/hero-1200.jpg"
srcset="
/images/hero-800.jpg 800w,
/images/hero-1200.jpg 1200w,
/images/hero-1600.jpg 1600w
"
sizes="100vw"
alt="Hero image"
width="1600"
height="900"
loading="eager"
fetchpriority="high"
/>
</picture><picture>
<source
media="(max-width: 640px)"
srcset="
/images/product-portrait-400.jpg 400w,
/images/product-portrait-800.jpg 800w
"
sizes="100vw"
/>
<source
media="(min-width: 641px)"
srcset="
/images/product-landscape-800.jpg 800w,
/images/product-landscape-1200.jpg 1200w,
/images/product-landscape-1600.jpg 1600w
"
sizes="(max-width: 1024px) 90vw, 1200px"
/>
<img
src="/images/product-landscape-1200.jpg"
alt="Product image"
width="1200"
height="675"
loading="lazy"
/>
</picture><picture>
<source
media="(max-width: 640px)"
srcset="
/images/product-portrait-400.jpg 400w,
/images/product-portrait-800.jpg 800w
"
sizes="100vw"
/>
<source
media="(min-width: 641px)"
srcset="
/images/product-landscape-800.jpg 800w,
/images/product-landscape-1200.jpg 1200w,
/images/product-landscape-1600.jpg 1600w
"
sizes="(max-width: 1024px) 90vw, 1200px"
/>
<img
src="/images/product-landscape-1200.jpg"
alt="Product image"
width="1200"
height="675"
loading="lazy"
/>
</picture><!-- ❌ WRONG - causes layout shift -->
<img src="/image.jpg" alt="Image" loading="lazy" />
<!-- ✅ CORRECT - browser reserves space -->
<img
src="/image.jpg"
alt="Image"
width="800"
height="600"
loading="lazy"
/><!-- ❌ 错误 - 会导致布局偏移 -->
<img src="/image.jpg" alt="Image" loading="lazy" />
<!-- ✅ 正确 - 浏览器会预留空间 -->
<img
src="/image.jpg"
alt="Image"
width="800"
height="600"
loading="lazy"
/><!-- ❌ WRONG - delays LCP -->
<img
src="/hero.jpg"
alt="Hero"
loading="lazy"
/>
<!-- ✅ CORRECT - prioritizes LCP -->
<img
src="/hero.jpg"
alt="Hero"
loading="eager"
fetchpriority="high"
/><!-- ❌ 错误 - 延迟LCP加载 -->
<img
src="/hero.jpg"
alt="Hero"
loading="lazy"
/>
<!-- ✅ 正确 - 优先加载LCP图片 -->
<img
src="/hero.jpg"
alt="Hero"
loading="eager"
fetchpriority="high"
/><!-- ❌ WRONG - only considers DPR -->
<img
src="/image.jpg"
srcset="/image.jpg 1x, /image@2x.jpg 2x"
alt="Image"
/>
<!-- ✅ CORRECT - considers viewport + DPR -->
<img
src="/image-800.jpg"
srcset="
/image-400.jpg 400w,
/image-800.jpg 800w,
/image-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 800px"
alt="Image"
width="800"
height="600"
/><!-- ❌ 错误 - 仅考虑设备像素比 -->
<img
src="/image.jpg"
srcset="/image.jpg 1x, /image@2x.jpg 2x"
alt="Image"
/>
<!-- ✅ 正确 - 同时考虑视口和设备像素比 -->
<img
src="/image-800.jpg"
srcset="
/image-400.jpg 400w,
/image-800.jpg 800w,
/image-1200.jpg 1200w
"
sizes="(max-width: 768px) 100vw, 800px"
alt="Image"
width="800"
height="600"
/><!-- ❌ WRONG -->
<img src="/product.jpg" />
<!-- ✅ CORRECT - descriptive alt text -->
<img src="/product.jpg" alt="Red leather messenger bag with brass buckles" />
<!-- ✅ CORRECT - decorative images use empty alt -->
<img src="/decorative-line.svg" alt="" role="presentation" /><!-- ❌ 错误 -->
<img src="/product.jpg" />
<!-- ✅ 正确 - 描述性替代文本 -->
<img src="/product.jpg" alt="带有黄铜搭扣的红色皮革邮差包" />
<!-- ✅ 正确 - 装饰性图片使用空替代文本 -->
<img src="/decorative-line.svg" alt="" role="presentation" /><!-- ❌ WRONG - image distorts -->
<div class="w-full h-64">
<img src="/image.jpg" alt="Image" class="w-full h-full" />
</div>
<!-- ✅ CORRECT - maintains aspect ratio -->
<div class="w-full h-64">
<img
src="/image.jpg"
alt="Image"
class="w-full h-full object-cover"
/>
</div><!-- ❌ 错误 - 图片变形 -->
<div class="w-full h-64">
<img src="/image.jpg" alt="Image" class="w-full h-full" />
</div>
<!-- ✅ 正确 - 保持宽高比 -->
<div class="w-full h-64">
<img
src="/image.jpg"
alt="Image"
class="w-full h-full object-cover"
/>
</div><!-- Full width -->
sizes="100vw"
<!-- Content width (max 800px) -->
sizes="(max-width: 768px) 100vw, 800px"
<!-- Sidebar (fixed 300px) -->
sizes="300px"
<!-- 2-column grid -->
sizes="(max-width: 768px) 100vw, 50vw"
<!-- 3-column grid -->
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
<!-- Responsive with max-width -->
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 90vw, 1200px"<!-- 全屏 -->
sizes="100vw"
<!-- 内容宽度(最大800px) -->
sizes="(max-width: 768px) 100vw, 800px"
<!-- 侧边栏(固定300px) -->
sizes="300px"
<!-- 2列网格 -->
sizes="(max-width: 768px) 100vw, 50vw"
<!-- 3列网格 -->
sizes="(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw"
<!-- 带最大宽度的响应式 -->
sizes="(max-width: 640px) 100vw, (max-width: 1024px) 90vw, 1200px"| Ratio | CSS | Use Case |
|---|---|---|
| 16:9 | | Video thumbnails, hero images |
| 4:3 | | Standard photos |
| 3:2 | | DSLR photos |
| 1:1 | | Profile pictures, Instagram-style |
| 21:9 | | Ultrawide banners |
| 比例 | CSS写法 | 适用场景 |
|---|---|---|
| 16:9 | | 视频缩略图、英雄图 |
| 4:3 | | 标准照片 |
| 3:2 | | 单反相机照片 |
| 1:1 | | 头像、Instagram风格图片 |
| 21:9 | | 超宽横幅 |
| Value | Behavior | Use Case |
|---|---|---|
| Fill container, crop edges | Card images, backgrounds |
| Fit inside, preserve all content | Logos, product photos |
| Stretch to fill | Avoid unless necessary |
| Smaller of | Mixed content sizes |
| 属性值 | 行为 | 适用场景 |
|---|---|---|
| 填充容器,裁剪边缘 | 卡片图片、背景图 |
| 完整适配容器,保留所有内容 | Logo、产品照片 |
| 拉伸填充容器 | 除非必要否则避免使用 |
| 取contain或原尺寸中较小的那个 | 混合尺寸内容 |
| Format | Quality | File Size | Browser Support | Use Case |
|---|---|---|---|---|
| JPEG | Good | Medium | 100% | Photos, complex images |
| PNG | Lossless | Large | 100% | Logos, transparency |
| WebP | Excellent | Small | 97%+ | Modern browsers, photos |
| AVIF | Excellent | Smallest | 90%+ | Cutting-edge, fallback required |
<picture>| 格式 | 画质 | 文件大小 | 浏览器支持度 | 适用场景 |
|---|---|---|---|---|
| JPEG | 良好 | 中等 | 100% | 照片、复杂图片 |
| PNG | 无损 | 较大 | 100% | Logo、透明图片 |
| WebP | 优秀 | 较小 | 97%+ | 现代浏览器、照片 |
| AVIF | 优秀 | 最小 | 90%+ | 前沿技术,需提供降级方案 |
<picture>