メインコンテンツまでスキップ

Masonry Gallery(可変グリッドギャラリー)

Masonry Gallery は縦横比の異なる画像を表示するコントロールです。各画像は比率を保ったまま最も短い列へ配置され、ページを下へスクロールすると次のデータページを自動で追加します。コントロール内に別のスクロールバーは作りません。

ポートフォリオ、写真、インスピレーションボード、メディア素材に適しています。業務レコードの状態、メタデータ、操作を表示する CardSet とは別の用途です。

コントロール主な用途データとレイアウト
Masonry Gallery異なる縦横比を保った画像中心の連続閲覧ページングされた画像レコード + ページ全体の無限スクロール
CardSet状態、メタデータ、操作を含む業務レコードの要約共通カードテンプレート + Pagination または Load More
Gridページ領域とコントロールの手動配置固定 24 列レイアウト。レコードは繰り返しません

1. コントロールの追加​

  1. Page Designer の Containers を開きます。
  2. Masonry Gallery をページへドラッグします。
  3. Data Source を設定してからフィールドを対応付けます。
  4. portfolioGallery などの安定した名前を付けます。

デザインキャンバスには異なる比率のサンプルが表示されます。Preview は実データを読み込みますが、編集時の連続読み込みを避けるため最大 2 ページです。

2. データソース​

Model Data Source、Custom API、Media Library、Object Storage を利用できます。Model と Custom API は業務レコードを返し、後者 2 つはサーバー側の Media Connector を経由します。

2.1 Custom API のサンプル​

POST /spark/api/sample/masonry-gallery/images
設定値
URL/spark/api/sample/masonry-gallery/images
Request MethodPOST
Rows Pathdata.records
Total Pathdata.total
Current Page Pathdata.current
Page Size Pathdata.pageSize

Test & Import で 1 ページを取得し、次の Response Fields を取り込みます。

Field PathData Type用途
idTEXT一意キー
imageUrlURL画像 URL
titleTEXTタイトル
captionTEXT補足説明
badgeTEXTカテゴリラベル
altTEXT代替テキスト
widthNUMBER元画像の幅
heightNUMBER元画像の高さ

リクエスト本文にはページング情報が含まれます。

{"current": 1, "pageSize": 6}
{
"success": true,
"data": {
"current": 1,
"pageSize": 6,
"total": 24,
"records": [{
"id": "gallery-1",
"imageUrl": "/spark/api/sample/masonry-gallery/assets/coastal-architecture.jpg",
"title": "Coastal Geometry",
"caption": "Sunlit concrete forms above a quiet blue sea.",
"badge": "Architecture",
"alt": "White coastal architecture above the sea",
"width": 1200,
"height": 1200
}]
}
}

total が最も確実な終了条件です。ない場合は、返却件数が Items Per Request より少ないページで終了します。Row Unique Key は全ページで一意にしてください。重複キーは除外されます。

2.1 Media Library と Object Storage​

最初に App Settings → Integrations → Media Connections で再利用可能な接続を作成します。

  1. Console の Secret Management で資格情報を作成します。OSS/S3/MinIO は OBJECT_STORAGE、メディアプラットフォームは MEDIA_PROVIDER を使用します。
  2. Media Connections で Provider と既存 Secret を選択します。フォームにはその Provider に必要な項目だけが表示され、自動利用する公式 API Endpoint は表示されません。
  3. Masonry Gallery の Data Source では Media Library または Object Storage を選び、Connection だけを参照します。続いて Collection/Container、Path、Filter、Page Size を設定します。
  4. Test を実行します。Test、デザインプレビュー、実行時は同じ Media Gateway とレスポンス解析を使用します。

現在利用できる本番 Provider:

ProviderSecret ManagementMedia Connection 設定
CloudinaryMEDIA_PROVIDER。API Key に API Key、API Secret に API Secret を入力Cloud Name は必須、Root Folder は任意
ImageKitMEDIA_PROVIDER。API Key に Public API Key、API Secret に Private API Key を入力Root Folder は任意。公式 API Endpoint は自動使用
Aliyun OSS / AWS S3 / MinIOOBJECT_STORAGE。Access Key と Access Secret を入力ストレージに応じて Endpoint、既定 Bucket、Root Prefix を設定

Spark Sample Media Library は外部アカウント不要の開発用です。Cloudinary と ImageKit は本番用 Media Library Connector です。Bynder、AEM Assets、完全な Spark Media Library はまだ利用できません。

ページ JSON に secretId、アクセスキー、一時署名 URL は保存されません。バックエンドは結果を records、nextCursor、hasMore、任意の total に正規化します。カードは thumbnailUrl、全画面表示は imageUrl を使用します。

{
"records": [{
"id": "asset-001",
"imageUrl": "https://cdn.example/full.webp",
"thumbnailUrl": "https://cdn.example/card.webp",
"title": "Summer campaign",
"alt": "Summer campaign launch",
"width": 1600,
"height": 1067
}],
"nextCursor": "opaque-next-cursor",
"hasMore": true,
"total": null
}

実行可能な例は spark-sample の SampleMasonryMediaConnector.java、masonry-gallery-media-connection.json、masonry-gallery-media-page.json にあります。

3. フィールド対応​

プロパティ推奨フィールド必須
Row Unique Keyidはい
Image URL FieldimageUrlはい
Title Fieldtitleいいえ
Caption Fieldcaptionいいえ
Badge Fieldbadgeいいえ
Alternative Text Fieldalt推奨
Image Width Fieldwidth推奨
Image Height Fieldheight推奨

Advanced の Width と Height を両方設定すると、画像取得前に正しい領域を確保でき、レイアウト移動を抑えられます。Alternative Text はファイル名ではなく画像内容を説明してください。未設定時は Title にフォールバックします。

4. レスポンシブレイアウト​

プロパティ推奨値説明
Desktop Columns4ワイド画面の列数
Tablet Columns3中間幅の列数
Mobile Columns2。テキストが多い場合は 1モバイルの列数
SpacingDEFAULTCOMPACT、DEFAULT、RELAXED
Items Per Request6 または 121 回の読み込み件数

列数はページ幅に追従し、画像を同じ高さへ切り抜きません。

5. スクロール読み込み​

現在の末尾まで約 1.5 画面の位置で次ページを読み込みます。同時リクエストは 1 件だけです。読み込み中、Retry 可能なエラー、完了状態を表示します。短時間でページへ戻ると、読み込み済みレコードとスクロール位置を復元します。

固定高で内部スクロールを持つ狭いコンテナには配置しないでください。

6. 全画面プレビューとインタラクション​

Enable Fullscreen Preview を有効にすると、クリックでビューアーが開きます。左右ボタン、方向キー、Escape、Tab、Enter、Space を利用できます。

onClick の前に選択レコードが Current Record へ設定されます。

record.id
record.imageUrl
record.title
record.badge

クリックはプレビューと onClick の両方を実行できます。直ちにページ遷移する場合は Fullscreen Preview を無効にしてください。

関数動作
reloadGallery状態を消去して 1 ページ目から再読込
setGalleryDataレコードを直接置換し、自動ページングを終了

7. リクエストコンテキスト​

Data Source テスト、デザインプレビュー、実行時は同じ処理を使い、Spark が次の Header を自動付与します。

Header値
X-Spark-Page-EnvironmentDEV、TEST、PROD
X-Spark-Page-Render-ModeDESIGN_PREVIEW、RUNTIME

Data Source に手動追加する必要はありません。バックエンドは SparkPageRequestHeaders.resolve で解析し、DESIGN_PREVIEW では短いデータセットを返せます。

@PostMapping
public ApiResult<ProTablePageResult<MasonryGalleryImageDTO>> queryByPost(
@RequestBody(required = false) MasonryGalleryQueryRequest request,
@RequestHeader(value = SparkPageRequestHeaders.ENVIRONMENT, required = false) String environment,
@RequestHeader(value = SparkPageRequestHeaders.RENDER_MODE, required = false) String renderMode) {
return SparkApiResultHelper.success(
Locale.ENGLISH,
galleryService.query(request,
SparkPageRequestHeaders.resolve(environment, renderMode)),
"SPARK-SAMPLE-MASONRY-GALLERY-0001");
}

Service はレンダリングモードに応じてデータ量を切り替えます。

int total = requestContext != null
&& requestContext.getRenderMode() == SparkPageRenderMode.DESIGN_PREVIEW
? 12
: 24;

Java サンプル、ページ JSON、画像は spark-sample にあります。詳細は ページリクエストコンテキスト を参照してください。

8. 性能とデータの推奨事項​

  • 表示サイズに合う圧縮画像をキャッシュして配信します。
  • 安定した id、width、height、有用な alt を返します。
  • 1 回 6~20 件とし、バックエンドの並び順を安定させます。
  • 画像の取得失敗とデータ API の失敗は分けて確認します。1 枚の画像が失敗してもページングは停止しません。

9. よくある問題​

  • 同じ画像が繰り返される: バックエンドが current と pageSize を適用しているか、応答パスが正しいかを確認します。
  • スクロールしても読み込まれない: total、短いページ、Retry 待ちの失敗リクエストを確認します。
  • レイアウトが大きく動く: width と height を返してマッピングします。
  • 画像がプレースホルダーになる: Image URL Field、認証、CORS を確認します。
  • 業務操作や詳細なメタデータが必要: CardSet を使用します。Masonry Gallery は Card Actions を提供しません。