返回风格库
视觉风格expressive

沉浸摄影

Immersive Photo

摄影即界面。全幅大图铺满视口,文字压在图上、靠可读性遮罩浮起;缓慢的 Ken Burns 推拉让静照呼吸,模糊占位先行、真图渐显。图是内容不是背景,排版为让照片说话而生。

沉浸摄影视觉预览
主色#0C0D10
次色#F4F1EA
强调色 1#E8B04B
强调色 2#1A1C22
强调色 3#B8BCC4

AI 实现规则

你是一个沉浸摄影(Immersive Photo)风格的前端开发专家。生成的所有代码必须严格遵守以下约束:

## 绝对禁止

- 把照片当纯装饰背景、上面堆卡片挡住它(图是主角)
- 文字直接压图不加可读性遮罩(scrim)
- 用未优化大图(必须 AVIF/WebP + srcset;首屏别加载多张全尺寸 JPG)
- Ken Burns 过快(<8s)或改布局属性(只用 transform)
- 无 aspect-ratio / 固定高度直接塞图(CLS)
- 多个强调色;硬塞与照片冲突的品牌色
- 省略 LQIP 占位与 prefers-reduced-motion 降级

## 必须遵守

### 图即内容
每屏一张能独立成立的全幅照片,object-fit: cover 铺满视口。UI 退居其后,文字是压在光影上的说明。

### 可读性遮罩(scrim,纪律)
文字压图前必铺遮罩,保证 4.5:1 对比:
- 底部说明: linear-gradient(to top, rgba(0,0,0,0.72), transparent 70%)
- 全屏叠字: linear-gradient(to top, rgba(0,0,0,0.7), rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.35))
- 或局部 backdrop-blur-md + bg-black/30 的浮层

### Ken Burns(招牌)
@keyframes ip-kenburns { from { transform: scale(1) translate3d(0,0,0) } to { transform: scale(1.12) translate3d(-2%,-1.5%,0) } }
.ip-kenburns { animation: ip-kenburns 18s ease-in-out infinite alternate; will-change: transform; }
只用 transform(合成器层),时长 8-20s,绝不眩晕

### 渐进加载(LQIP blur-up)
1. 先渲染 20px 模糊占位(内联 base64 或 CSS blur),scale(1.06) 消除边缘
2. 真图 <img> onLoad 后 data-loaded=true,opacity 0→1 交叉淡入
3. React: const [loaded,setLoaded]=useState(false); <img onLoad={()=>setLoaded(true)} .../>

### 性能
- 双格式: <picture><source srcset="x.avif" type="image/avif"><source srcset="x.webp" type="image/webp"><img src="x.webp"></picture>
- hero: fetchpriority="high" + preload;其余: loading="lazy" decoding="async"
- 显式 aspect-ratio(如 aspect-[4/5])或容器固定高度防 CLS
- responsive srcset + sizes

### 配色(从图取色)
- 墨底 #0C0D10 / 纸白 #F4F1EA 作纯色段
- 图上文字: text-white + white/80 + white/60
- 唯一强调琥珀金 #E8B04B:仅关键 CTA、章节 kicker、高亮
- 从当前照片采一支暖光作强调,别硬塞品牌色

### 无障碍
- 每张图有意义 alt(装饰图 alt="")
- prefers-reduced-motion: Ken Burns 停、淡入瞬时
- scrim 后文字对比 ≥ 4.5:1

## 自检

1. 每屏一张全幅照片、图是主角?
2. 所有压图文字都有 scrim 且对比达标?
3. Ken Burns 只用 transform、≥8s、有 reduced-motion 降级?
4. 有 LQIP 占位 + 交叉淡入,首屏不白屏?
5. 图是 AVIF/WebP 双格式 + srcset + lazy(hero 除外)?
6. 有 aspect-ratio 防 CLS?
7. 唯一琥珀金强调、从图取色?

组件预览与实现

inline-flex items-center gap-2 rounded-full transition-all duration-300 ease-out active:scale-[0.98] bg-white/12 backdrop-blur-md border border-white/30 text-white hover:bg-white/20 hover:border-white/50
button

Button

Frosted button that stays legible over any photo

<button className="inline-flex items-center gap-2
  px-6 py-3 rounded-full
  bg-white/12 backdrop-blur-md
  border border-white/30
  text-white font-medium
  hover:bg-white/20 hover:border-white/50
  transition-all duration-300
">
  View the series
  <span aria-hidden>&rarr;</span>
</button>
card

Card

Full-bleed photo card with gradient scrim caption

<article className="relative aspect-[4/5] overflow-hidden rounded-2xl group">
  <img src="/photo.avif" alt="A ridge at first light" loading="lazy" decoding="async"
    className="absolute inset-0 w-full h-full object-cover
      transition-transform duration-[1200ms] ease-out group-hover:scale-105" />
  <div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/10 to-transparent" />
  <div className="absolute bottom-0 p-6">
    <p className="text-xs uppercase tracking-widest text-[#E8B04B] mb-1">Field notes</p>
    <h3 className="text-white text-xl font-semibold">First light on the ridge</h3>
  </div>
</article>
input

Input

Frosted field readable over imagery

<input type="email" placeholder="Your email"
  className="w-full px-5 py-3 rounded-full
    bg-white/10 backdrop-blur-md
    border border-white/25
    text-white placeholder-white/50
    focus:outline-none focus:border-white/60 focus:bg-white/15
    transition-all duration-300" />
nav

Navigation

Transparent-to-scrim nav floating over the hero photo

<nav className="fixed top-0 inset-x-0 z-50
  bg-gradient-to-b from-black/50 to-transparent
">
  <div className="max-w-6xl mx-auto px-6 h-16 flex items-center justify-between">
    <span className="text-white font-semibold tracking-tight">Atlas</span>
    <div className="flex items-center gap-6 text-sm text-white/80">
      <a href="#series" className="hover:text-white transition-colors">Series</a>
      <a href="#about" className="hover:text-white transition-colors">About</a>
    </div>
  </div>
</nav>
hero

Hero

Full-bleed Ken Burns hero with LQIP blur-up and scrim

<section className="relative h-screen overflow-hidden">
  {/* LQIP placeholder shows instantly, real frame fades over it */}
  <div className="absolute inset-0 bg-cover bg-center scale-105"
    style={{ backgroundImage: 'url(data:image/webp;base64,UklGR...)' }} />
  <img src="/hero.avif" alt="Dawn over the ridgeline" fetchpriority="high" decoding="async"
    className="absolute inset-0 w-full h-full object-cover
      motion-safe:animate-[kenburns_18s_ease-in-out_infinite_alternate]" />
  {/* Readability scrim */}
  <div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/20 to-black/30" />
  <div className="relative z-10 h-full flex flex-col justify-end max-w-6xl mx-auto px-6 pb-24">
    <p className="text-[#E8B04B] uppercase tracking-widest text-sm mb-3">Chapter One</p>
    <h1 className="text-white text-5xl md:text-7xl font-semibold max-w-3xl leading-[1.05]">
      The light arrives before the sound
    </h1>
  </div>
</section>

{/* @keyframes kenburns { from { transform: scale(1) translate(0,0) } to { transform: scale(1.12) translate(-2%, -1%) } } */}

交互展示

适用范围与设计理念

应用场景

creativemarketingportfolio

视觉关键词

immersivephotographyfull-bleedken burnsscrimhero image沉浸摄影全幅大图遮罩

沉浸摄影的信条:照片不是配图,是主角。当一张全幅大图铺满视口,界面就退居其后——文字只是压在光影上的说明,UI 是为了不挡住照片而存在。

核心理念:

- 图即内容:每屏一张能独立成立的照片,占满视口(full-bleed)。它承担情绪、色调与信息,排版为它让路

- 可读性遮罩(scrim):文字压图必须先铺一层渐变暗罩或局部模糊,保证 4.5:1 对比。scrim 是纪律不是可选项

- Ken Burns:静照用极缓慢的 scale + translate 推拉(8-20s),让照片有呼吸感,但绝不快到让人眩晕

- 渐进加载:先上 LQIP 模糊占位(20px 内联 base64),真图 decode 后交叉淡入。首屏永不白屏

- 从图取色:唯一强调色从照片里采一支暖光(如琥珀金 #E8B04B),别硬塞品牌色

- 留白即呼吸:满图段落之间要有安静的纯色/纯文字段,否则视觉过载

设计原则:

- 性能红线:图用 AVIF + WebP 双格式、responsive srcset、hero 之外全部 lazy;显式 aspect-ratio 防 CLS;Ken Burns 只用 transform(合成器层)

- 无障碍红线:所有图有意义的 alt;prefers-reduced-motion 下 Ken Burns 停、交叉淡入变瞬时;scrim 保证文字对比达标

- LCP 纪律:首屏 hero 图 preload + fetchpriority=high,其余 loading=lazy + decoding=async

- 移动端:竖屏用 object-fit: cover + 焦点对齐,绝不拉伸变形

应该这样做

  • 每屏一张全幅照片 object-cover 铺满视口,图是主角、UI 让路
  • 文字压图必铺可读性遮罩:linear-gradient 暗罩或局部 backdrop-blur,保证 4.5:1 对比
  • Ken Burns 缓慢推拉:transform: scale(1.08) + translate,8-20s ease-in-out,只用 transform
  • 渐进加载:LQIP 20px 模糊占位内联 base64 先显,真图 decode 后 opacity 交叉淡入
  • 图用 AVIF + WebP 双格式 + srcset;hero preload fetchpriority=high,其余 loading=lazy decoding=async
  • 显式 aspect-ratio 或固定容器高度防 CLS
  • 唯一强调色从照片采暖光(如琥珀金 #E8B04B),只用于关键 CTA 与高亮
  • 满图段与安静纯色/纯文字段交替,给视觉呼吸
  • prefers-reduced-motion 下停 Ken Burns、淡入变瞬时;每张图写有意义 alt

避免这样做

  • 禁止把照片当纯装饰背景后铺一堆卡片挡住它(图是主角)
  • 禁止文字直接压在图上不加遮罩(读不清 + 对比不达标)
  • 禁止用未优化大图(必须 AVIF/WebP + srcset,绝不首屏加载多张全尺寸 JPG)
  • 禁止 Ken Burns 过快或改布局属性(只用 transform,8s 起步)
  • 禁止无 aspect-ratio 直接塞图(触发 CLS)
  • 禁止多个强调色,禁止硬塞与照片冲突的品牌色
  • 禁止省略 LQIP 占位(首屏白屏 / 跳版)与 prefers-reduced-motion 降级

全局 CSS

/* Immersive Photo Global Styles */

:root {
  --ip-ink: #0C0D10;
  --ip-paper: #F4F1EA;
  --ip-amber: #E8B04B;
  --ip-mist: #B8BCC4;
}

/* Ken Burns — transform only, compositor-friendly */
@keyframes ip-kenburns {
  from { transform: scale(1) translate3d(0, 0, 0); }
  to { transform: scale(1.12) translate3d(-2%, -1.5%, 0); }
}
.ip-kenburns {
  animation: ip-kenburns 18s ease-in-out infinite alternate;
  will-change: transform;
}

/* Full-bleed image base — always cover, explicit ratio at call site to avoid CLS */
.ip-cover {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Readability scrim presets */
.ip-scrim-bottom { background: linear-gradient(to top, rgba(0,0,0,0.72), rgba(0,0,0,0.15) 45%, transparent 70%); }
.ip-scrim-full { background: linear-gradient(to top, rgba(0,0,0,0.7), rgba(0,0,0,0.25) 50%, rgba(0,0,0,0.35)); }

/* Blur-up: LQIP is a scaled-up tiny image; real frame fades in on load */
.ip-lqip { filter: blur(16px); transform: scale(1.06); }
.ip-frame { opacity: 0; transition: opacity 0.8s ease; }
.ip-frame[data-loaded="true"] { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .ip-kenburns { animation: none; }
  .ip-frame { transition: none; }
}

布局、色板与 Tokens

主色#0C0D10
次色#F4F1EA
强调色 1#E8B04B
强调色 2#1A1C22
强调色 3#B8BCC4
{
  "border": {
    "width": "border",
    "color": "border-white/25",
    "radius": "rounded-2xl",
    "style": "border-solid"
  },
  "shadow": {
    "sm": "shadow-[0_2px_8px_rgba(0,0,0,0.3)]",
    "md": "shadow-[0_8px_28px_rgba(0,0,0,0.4)]",
    "lg": "shadow-[0_24px_60px_rgba(0,0,0,0.5)]",
    "none": "shadow-none",
    "hover": "hover:shadow-[0_16px_44px_rgba(0,0,0,0.5)]",
    "focus": "focus-visible:ring-2 focus-visible:ring-white/60",
    "colored": {}
  },
  "interaction": {
    "transition": "transition-all duration-300 ease-out",
    "active": "active:scale-[0.98]",
    "hoverOpacity": "hover:bg-white/20"
  },
  "typography": {
    "heading": "font-semibold text-white tracking-tight",
    "body": "text-white/80 leading-relaxed",
    "mono": "font-mono text-[#E8B04B] uppercase tracking-widest",
    "sizes": {
      "hero": "text-5xl md:text-7xl",
      "h1": "text-4xl md:text-6xl",
      "h2": "text-3xl md:text-4xl",
      "h3": "text-xl md:text-2xl",
      "body": "text-base md:text-lg",
      "small": "text-sm"
    }
  },
  "spacing": {
    "section": "py-24 md:py-32",
    "container": "px-6 md:px-8",
    "card": "p-6",
    "gap": {
      "sm": "gap-4",
      "md": "gap-8",
      "lg": "gap-12"
    }
  },
  "colors": {
    "background": {
      "primary": "bg-[#0C0D10]",
      "secondary": "bg-[#1A1C22]",
      "accent": [
        "bg-[#E8B04B]"
      ]
    },
    "text": {
      "primary": "text-white",
      "secondary": "text-white/80",
      "muted": "text-white/60"
    },
    "button": {
      "primary": "bg-white/12 backdrop-blur-md text-white border border-white/30",
      "secondary": "bg-[#E8B04B] text-[#0C0D10]"
    }
  },
  "forbidden": {
    "classes": [
      "bg-gradient-to-r",
      "from-indigo-600",
      "via-purple-600",
      "to-pink-500",
      "rounded-none",
      "duration-100"
    ],
    "patterns": [
      "^bg-gradient-to-r$",
      "^from-(indigo|purple|pink|fuchsia)-",
      "^rounded-none$"
    ],
    "reasons": {
      "bg-gradient-to-r": "Depth and color come from the photograph, not decorative gradients",
      "from-indigo-600": "No AI-cliche gradients; the accent is sampled from the image's light",
      "rounded-none": "Full-bleed imagery reads better with soft rounded framing (rounded-2xl)",
      "duration-100": "Photo transitions and Ken Burns are slow and cinematic, never snappy"
    }
  },
  "required": {
    "button": [
      "bg-white/12 backdrop-blur-md",
      "border border-white/30",
      "rounded-full",
      "text-white",
      "hover:bg-white/20 hover:border-white/50",
      "transition-all duration-300"
    ],
    "card": [
      "relative overflow-hidden",
      "rounded-2xl"
    ],
    "input": [
      "bg-white/10 backdrop-blur-md",
      "border border-white/25",
      "rounded-full",
      "text-white placeholder-white/50",
      "focus:outline-none focus:border-white/60 focus:bg-white/15",
      "transition-all duration-300"
    ]
  }
}

示例提示词

摄影游记长页

全幅大图驱动的旅行摄影长页

Create an immersive photo travelogue with:
1. Full-screen hero photo with a slow Ken Burns drift (transform scale 1->1.12, 18s ease-in-out alternate), an LQIP blur-up placeholder that cross-fades to the real frame, and a bottom-to-top scrim
2. Ink #0C0D10 / paper #F4F1EA solid sections between the photo passages for breath
3. Chapter kickers and one CTA in amber #E8B04B sampled from the light; everything else white/white-80 over imagery
4. A gallery of full-bleed photo cards (aspect-[4/5]) that scale slightly on hover, each with a gradient scrim caption
5. Images as <picture> AVIF+WebP with srcset; hero fetchpriority=high, rest loading=lazy decoding=async; explicit aspect-ratio to avoid CLS
6. Frosted (backdrop-blur) nav and buttons that stay legible over any photo
7. prefers-reduced-motion: Ken Burns off, fades instant; meaningful alt on every image

产品摄影落地页

大图沉浸式产品落地页

Create an immersive product landing page with:
1. A full-bleed product hero photo, Ken Burns on load, LQIP blur-up, and a left-anchored scrim so the headline stays readable
2. Alternating sections: full-bleed lifestyle photo, then a quiet ink/paper text section, repeating
3. Amber #E8B04B for the single buy CTA and price highlight only; all other text white over scrims
4. Photo detail cards with aspect-ratio locked and hover scale-105
5. <picture> AVIF+WebP srcset, hero preloaded fetchpriority=high, rest lazy
6. A frosted sticky buy-bar (backdrop-blur) that floats over the imagery
7. reduced-motion: no Ken Burns, instant cross-fades; every image has descriptive alt