图库幻灯 片
相册全屏打开后会自己一张接一张地播放,直到用户暂停。任何一张照片都可以保存,保存下来的是带着合适文件名的原始文件,而不是屏幕上显示的缩小副本。
试一试
每个版本都导入 ./api,它代替你的后端:photos 是一个相册,形状与 Lightbox 的 LightboxItem 相同,每张照片都带有要显示的地址、要下载的文件和保存时使用的文件名。把它换成你自己的相册。
typescript
import { cdnUrl } from '@reelkit/example-data';
// Stands in for your backend: an album of photos. Each one has the shape of
// `LightboxItem` from the lightbox of your framework, so the list goes to the
// lightbox as it is.
export interface Photo {
src: string;
title: string;
downloadUrl: string;
downloadName: string;
}
const kTitles = [
'Morning light',
'Coastline',
'Old town',
'Forest path',
'Harbour',
'Mountain pass',
'Market day',
'Night street',
'Lakeside',
];
export const photos: Photo[] = kTitles.map((title, i) => {
const file = `samples/images/image-${String(i + 1).padStart(2, '0')}.jpg`;
return {
// Your app would show a resized copy here and keep the original for the
// download. The sample CDN serves one size, so both point at one file.
src: cdnUrl(file),
title,
downloadUrl: cdnUrl(file),
downloadName: `${title.toLowerCase().replace(/\s+/g, '-')}.jpg`,
};
});示例媒体只能在 reelkit.dev 上使用
cdnUrl 生成指向 cdn.reelkit.dev 的链接,而它只向 ReelKit 站点提供文件。在你的应用里这些照片既无法加载也无法下载,所以复制这个文件之前,先把 src 和 downloadUrl 指向你自己的文件。
GallerySlideshow.tsx
GallerySlideshow.vue
gallery-slideshow.component.ts
打开一张照片:幻灯片立即开始,每三秒切换一次。可以在工具栏上暂停,或用下载按钮保存照片。
原理
- 两个属性把 Lightbox 变成带下载的幻灯片 ——
autoAdvance让 Lightbox 一打开就开始播放,showDownload添加保存当前照片的按钮。默认工具栏会自动加上播放/暂停按钮和下载按钮。这两个属性在 React、Vue 和 Angular 中都有说明,每个页面紧接着就是下载部分。 - 幻灯片会等待每张照片 ——
autoAdvanceInterval从照片加载完成的那一刻开始计算,所以网速慢时也不会在没人看到之前跳过任何照片。计时来自核心的createSlideshowController,见自动播放指南。 - 始终由用户掌控 —— 滑动或按键会手动切换,并让下一张照片的间隔从零开始,幻灯片保持开启。PlayPauseButton 用来停止和继续播放;指针停在按钮或说明文字上时,播放会一直暂停到指针移开。播放到最后一张照片时会停止,除非设置了
loop。 - 显示小副本,保存原始文件 ——
src是屏幕上显示的内容,所以用缩小的副本能让图库保持流畅。downloadUrl是按钮保存的文件,downloadName是它得到的文件名,于是用户保存的是完整照片,文件名也能说明内容。示例 CDN 只提供一种尺寸,所以这里两者指向同一个文件。这些字段见 LightboxItem 类型。 - 跨源下载需要 CORS —— 指向另一个源的链接会忽略
download属性,所以 Lightbox 会先获取文件再保存。这要求文件所在的服务器为你的站点返回Access-Control-Allow-Origin。如果没有返回,照片会改为在新标签页中打开,用户仍然可以保存它。参见downloadFile。