Image 使用手册
v1.5.0 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
展示图片及其占位状态,支持组合角标、操作与预览入口,适合内容图片和媒体缩略图。
使用选择
用于展示图片与其公开加载/预览能力。头像优先 Avatar,多张图片组合用 ImageGroup,专业查看用 ImageViewer。
提供 src 与有意义的 alt;附属内容用 as="icon" 或 as="badge",不会替换图片。
通过 previewMode 配置预览;ImageGroup 可统一组尺寸和预览策略,查看器由 ImageViewer 承载。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
图片加载策略
默认保持 lazy。需要首屏外图片立即请求时,单项使用 <Image mediaLoading="eager" ... />;完整示例墙等子树可在宿主组件初始化时调用公开 provideMediaLoading('eager')。嵌套 Provider 取最近值,单项显式 Prop 优先;传入 () => policy 可响应状态变化,SSR 与客户端使用同一默认值。
eager 会提前消耗网络和解码资源,不承诺图片下载成功或固定完成时限;真实加载期间仍显示 Skeleton。仅影响字符串图片的 <img loading>,不改视频的 preload="metadata"、资源组件自身的加载协议、预览器中尚未打开的媒体或动画播放时机。详见 通用加载策略(源码参考:components/src/lib/media-loading.md)。
布局模型
主布局模型:内禀原子布局。
Image 的根节点只暴露一个由
size、媒体资源与圆角映射决定的媒体盒,作为 Button、MenuItem、Field 等外部布局的子项时表现为 Hug。媒体裁切、真实加载 Skeleton、hover 视觉遮罩、中央 icon 与角标定位都属于 Image 私有布局,不对外暴露通用槽位。
子组件的
as="icon"/as="badge"只用于 Image 内部定位,不改变子组件自己的布局模型。外部需要排列多张图片时应使用
ImageGroup,不要把 Image 改造成集合布局。
关键字 (Keyword)
使用示例
智能行为
素材兼容:
src同时支持字符串图片地址、字符串视频地址与resource-svelte图片组件。默认占位: 未传素材时展示单一
--black-4占位背景,不输出额外文案。尺寸圆角联动:
size会同步驱动固定圆角档位,12/16/20→4px,24/28/32→8px,40/48→12px,56→16px,64/72/80→20px。角色化组合: 子组件声明
as="badge"时自动定位到右上角;声明as="icon"时自动居中,但Image只负责定位,不接管子组件尺寸。Hover 视觉: 与 Avatar 共用
components/src/styles/layout.css(源码参考:components/src/styles/layout.css) 的.snowui-media-hoverable工具类家族。只要当前 Image 具备点击交互意图(resolvedInteractive,即src存在 + 未disabled+previewMode !== "none"或显式有onclick)就挂.snowui-media-hoverable获得手形指针;有图态(hasLoadedMedia)再挂.snowui-media-hoverable-has-visual,hover 时.snowui-image-visual层应用filter: brightness(0.92)(媒体本身压暗);无图占位态根不挂-has-visual,hover 时.snowui-image-background层从--black-4过渡到--black-10。覆盖入口:--snowui-media-hover-brightness。交互意图 vs 实际打开:
resolvedInteractive(决定 hover 视觉)与resolvedCanOpen(决定点击是否真打开)分离。默认previewMode="window"下,所有有 src 的 Image 都视为有交互意图(获得 hover + cursor),但只有字符串图片/视频能在新窗口打开(Component src 因为无法获取 URL,点击无实际动作);传previewMode="none"且没有onclick / onOpen时显式 opt-out,不提供 hover 变色、手形指针或键盘 button 语义。视频缩略态: 当
src为字符串视频地址时,组件改为渲染<video>;hover 时自动播放,离开后暂停并回到起始帧。字符串图片加载: 字符串图片不再通过额外的 JS 预加载器探测,而是直接交给原生
<img>加载;组件只通过load/error事件更新内部状态。真实加载骨架: 当
src是字符串图片或字符串视频时,媒体真实加载阶段会在组件内部显示Skeleton占位;加载完成后 Skeleton 消失,媒体再显示出来。Viewer 模式: 页面存在自动模式
ImageViewer且未显式声明 previewMode 时,自动接入页面级 Viewer;显式previewMode="viewer"仍可强制表达该意图。Window 模式:
previewMode="window"时,字符串图片/视频会直接在新窗口打开。None 模式:
previewMode="none"时,当前Image不提供打开动作。组内切换: 当
Image位于ImageGroup中且组或当前项使用previewMode="viewer"时,会使用组内注册列表作为 Viewer 的items,从而支持上一张/下一张。事件透传: 组件内部的视频 hover 播放逻辑不会吞掉外部
mouseenter / mouseleave回调。焦点策略:
Image与Avatar一样保持Surface语义,但默认不显示额外 focus ring,避免预览缩略图出现按钮式焦点描边。组合子渲染: 传入的
children会在媒体容器外层渲染,继续通过as="icon"/as="badge"使用定位上下文,不会再被Image内部的媒体模板吞掉。
Image 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
Image 类型与状态
必填属性:无具名必填属性。
可双向绑定:本组件未声明具名双向绑定属性;状态更新通过公开回调或所属宿主处理。
继承声明:FrameProps。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
ImageSize
来源:components/src/components/Image.svelte
ResourceSize
来源:components/src/context.ts
MediaLoading
来源:components/src/lib/media-loading.ts
PreviewMode
来源:components/src/logic/image-preview.ts