figma guide

Designing product image gallery and zoom UI in Figma: thumbnails, lightbox, and handoff

Design PDP image galleries, thumbnail rails, pinch-zoom lightboxes, and 360° placeholders in Figma with variant sync, lazy load states, and Dev Mode specs.

Published
Updated
Jun 26, 2026
Read time
7 min
Level
Beginner

Quick answer

A product image gallery shows every sellable angle of an item and lets shoppers inspect detail before they pick a variant or add to cart. On desktop, use a main image + vertical or horizontal thumbnail rail; on mobile, use a swipeable carousel with dot indicators and optional pinch-to-zoom lightbox. When the shopper selects a color or material variant, swap the gallery to that variant’s image set—never show blue photos while the selected swatch is red. Start from the Figma guides hub and mirror buy box behavior from your product detail page frame.


Who this is for

  • Product designers building PDP media for fashion, electronics, furniture, or beauty catalogs.
  • Design system teams standardizing gallery patterns across PDP, quick view, and compare products overlays.
  • Engineers implementing lazy-loaded image URLs, variant-to-media mapping, and accessible zoom/lightbox behavior.

TouchpointComponentPurpose
PDP heroProductGalleryPrimary conversion surface
Quick viewGalleryCompactOne image or 3-thumb strip
Compare trayGalleryThumbSingle static image per SKU
Cart line itemLineItemThumb64px thumbnail only
Wishlist rowSame as cartVisual recall
RecommendationsCard image onlyNo zoom; link to PDP

Verdict: invest gallery depth on the PDP. Every other surface can reuse a subset—do not rebuild a full lightbox inside quick view unless the category demands color accuracy at scale.


ProductGallery anatomy

PartSpecNotes
Main stage1:1 or 4:5 aspect ratioMatch category norm (fashion 4:5, electronics 1:1)
Thumbnail rail56–72px thumbs, 4–8 visibleVertical left on desktop; horizontal below on tablet
Active indicatorBorder or dot on selected thumbWCAG contrast on focus
Zoom affordanceMagnifier icon or cursor hintOpens lightbox or inline lens
Badge overlaySale, new, 360°Position top-left; do not cover product
Video slotPlay icon on thumbOptional hero slot for demo clips
ProductGallery
├── Variant: layout=desktop_rail | mobile_carousel
├── Variant: mediaType=image | video | model_360
├── Variant: zoom=inline_lens | lightbox | none
├── Property: imageIndex=0..n
├── Property: variantId=sku_color_red
└── Layers:
    ├── MainStage (Image / Video / 360Placeholder)
    ├── ThumbnailRail
    │   └── ThumbItem × n
    ├── NavArrow (desktop optional)
    ├── DotIndicator (mobile)
    └── ZoomTrigger

Use component properties for layout and mediaType. Bind variantId in Dev Mode annotations so engineering maps color swatches to image arrays.


Layout comparison

LayoutBest forTradeoff
Main + left railDesktop fashion, homeFamiliar; needs min 1024px width
Main + bottom stripTablet, narrow desktopSaves horizontal space
Full-width swipe carouselMobile PDPThumb reach; hide rail until tap “All photos”
Sticky gallery on scrollLong PDP copyGallery stays visible while specs scroll
Split 50/50 gallery + buy boxLuxury, high AOVLess vertical scroll; tight on mobile

On mobile, stack gallery above buy box with safe-area padding. Avoid shrinking the main stage below 320px width—detail matters for conversion.


Variant and image sync

EventGallery behavior
Color swatch selectedReplace entire image set with that color’s URLs
Size only changeGallery unchanged unless size-specific media exists
Out-of-stock variantDim gallery optional; focus on notify me CTA
Missing image for variantFallback to generic packshot + empty state copy
Preselected deep linkOpen gallery on variant’s default image index

Document a media manifest in handoff: { variantId, images: [{ url, alt, sort }] }. Same manifest feeds quick view first image.


Zoom and lightbox patterns

PatternInteractionWhen to use
Inline lensHover magnifies region on desktopApparel fabric detail
Click-to-lightboxFull-screen overlay, pinch zoomJewelry, electronics ports
Double-tap zoomMobile native feelDefault for mobile PDP
360° spinnerDrag to rotateFootwear, furniture (placeholder frame in Figma)
AR preview linkButton below galleryOut of Figma scope; note as external CTA
LightboxOverlay
├── Variant: open=true | false
├── Layers:
    ├── Scrim
    ├── CloseButton
    ├── ZoomableImage (max 200% scale annotation)
    ├── PrevNextArrows
    └── Counter "3 / 8"

Prototype open/close with Smart Animate. Spec Escape closes lightbox and focus returns to zoom trigger—same rules as modals.


Loading and error states

StateUI
Initial loadSkeleton on main stage + gray thumb pills
Thumb lazy loadBlur-up placeholder per image
Broken imageIcon + “Image unavailable” on stage
Slow CDNProgressive JPEG; keep layout stable (fixed aspect ratio)
Single image productHide rail; no arrows

Fixed aspect ratio prevents layout shift when high-res images load—annotate aspect-ratio: 4/5 in Dev Mode.


OverlayPlacementPairs with
Sale badgeTop-left on stageFlash sale timer
New arrivalTop-leftBadges
Low stockBottom banner on imageInventory messaging
Play videoCenter on video thumbDemo or unboxing
View in roomSecondary button below stageAR; link only

Do not stack more than two overlays on the hero image—sale badge + one secondary label is enough.


Handoff checklist

ItemDev Mode annotation
Image URLsCDN path pattern + width params (?w=800)
Alt textPer image from PIM; color in alt when variant-specific
Variant mapvariantId → image[] JSON shape
SwipeTouch threshold; loop at ends or hard stop
KeyboardArrow keys change main image when rail focused
Zoom max200% or fit-width; document pinch limits
Analyticsgallery_thumb_click, gallery_zoom_open, gallery_video_play
LCPFirst hero image preload hint
a11yLive region announces “Image 3 of 8” on change

Use Dev Mode checklist and export guide for @2x marketing assets vs WebP production paths.


Common mistakes

MistakeWhy it hurtsFix
Gallery not tied to variantWrong color orderedSwap images on swatch change
Tiny thumbnails on mobileHard to tapMin 44px touch target
Infinite carousel confusionUsers lose first imageShow counter or dots
Zoom without lightbox on mobilePinch fights page scrollDedicated full-screen zoom layer
Different hero in PLP card vs PDPExpectation mismatchUse same default packshot
Video autoplay with soundAccessibility and bounceTap to play; muted optional
No alt text on decorative anglesScreen reader noiseMark duplicate angles alt="" or merge

  1. Define aspect ratio tokens per category in layout grids.
  2. Build ThumbItem + MainStage as nested components with shared corner radius.
  3. Create desktop rail and mobile carousel variants of ProductGallery.
  4. Add variant sync property tied to segmented color swatches.
  5. Design LightboxOverlay with zoom and keyboard nav.
  6. Add loading skeleton and broken-image fallback frames.
  7. Place gallery in PDP next to buy box; link to sticky bar scroll behavior if gallery sticks.
  8. Prototype swatch change → gallery swap → zoom open on one flow.

FAQ

How many images should the rail show?

6–8 is typical for fashion; electronics may need 3–4. Hide overflow with scroll in rail rather than shrinking thumbs below 48px.

Inline zoom or lightbox only?

Use inline lens on desktop where hover exists; lightbox on mobile and tablet where hover does not. Many teams ship lightbox-only for simpler engineering.

360° in Figma?

Design a placeholder frame with drag hint and loading state; actual 360 viewer is implemented in code. Link vendor spec in Dev Mode.

Show one static image per compare column—no zoom rail. Link “View product” opens full PDP gallery.


Next steps

Share on X

§ Keep reading

Related guides.