Skip to content

Responsive Images

imgx makes it easy to generate responsive image sets for modern web development, ensuring optimal image delivery for different screen sizes and device capabilities.

Benefits of Responsive Images

  • Improved Performance: Serve appropriately sized images to reduce bandwidth usage
  • Better User Experience: Faster page loads on all devices
  • SEO Benefits: Speed improvements lead to better search engine rankings
  • Enhanced Adaptability: Your images adapt to different viewport sizes

Creating Responsive Image Sets

CLI

bash
# Generate responsive images with default sizes [320, 640, 960, 1280, 1920]
imgx responsive path/to/image.jpg

# Specify custom sizes
imgx responsive path/to/image.jpg --sizes 480,768,1024,1600

# Generate in multiple formats
imgx responsive path/to/image.jpg --formats webp,avif,jpeg

# Specify output directory
imgx responsive path/to/image.jpg --output-dir ./public/images/responsive

JavaScript/TypeScript API

ts
import { generateResponsive } from '@stacksjs/imgx'

// Generate responsive images with default settings
const images = await generateResponsive('path/to/image.jpg')

// With custom options
const customImages = await generateResponsive('path/to/image.jpg', {
  sizes: [480, 768, 1024, 1600],
  formats: ['webp', 'jpeg'],
  outputDir: './public/images/responsive',
  quality: 80,
  filenameTemplate: '[name]-[width]w.[format]',
})

// The result contains information about all generated images
console.log(`Generated ${images.length} responsive images`)

Configuration

You can set default responsive image options in your configuration file:

ts
// imgx.config.ts
export default {
  responsive: {
    sizes: [320, 640, 960, 1280, 1920],
    formats: ['webp', 'jpeg'],
    quality: 80,
    generateSrcset: true,
    filenameTemplate: '[name]-[width].[ext]',
  },
}

HTML Usage

imgx can also generate the HTML code for responsive images with appropriate srcset and sizes attributes:

bash
imgx responsive path/to/image.jpg --generate-html

This will output HTML similar to:

html
<picture>
  <source
    type="image/webp"
    srcset="
      /images/image-320.webp 320w,
      /images/image-640.webp 640w,
      /images/image-960.webp 960w,
      /images/image-1280.webp 1280w,
      /images/image-1920.webp 1920w
    "
    sizes="(max-width: 768px) 100vw, 50vw"
  >
  <img
    src="/images/image-1280.jpeg"
    srcset="
      /images/image-320.jpeg 320w,
      /images/image-640.jpeg 640w,
      /images/image-960.jpeg 960w,
      /images/image-1280.jpeg 1280w,
      /images/image-1920.jpeg 1920w
    "
    sizes="(max-width: 768px) 100vw, 50vw"
    width="1280"
    height="720"
    alt="Image description"
    loading="lazy"
  >
</picture>

Custom Filename Templates

You can customize how the responsive image filenames are generated using the filenameTemplate option:

ts
await generateResponsive('path/to/image.jpg', {
  filenameTemplate: '[name]-[width]w.[format]',
})

Available placeholders:

  • [name]: Original filename without extension
  • [width]: Width of the generated image
  • [height]: Height of the generated image
  • [format] or [ext]: File extension/format

Art Direction

For more complex responsive image requirements (art direction), you may need to process multiple source images. imgx can help with this workflow:

bash
# Generate different aspect ratios for different screen sizes
imgx responsive path/to/landscape.jpg --sizes 960,1280,1920 --output-dir ./public/images/desktop
imgx responsive path/to/portrait.jpg --sizes 320,480,640 --output-dir ./public/images/mobile

Released under the MIT License.