screenshot について
screenshotは、スクリーンショットでUI変更を確認するチーム向けのスキルです。ビューポート別の撮影、視覚比較、自動テストを案内し、レビューやレスポンシブ問題の発見に役立ちます。
主な機能
- 01デスクトップ、タブレット、モバイルの撮影手順
- 02変更前後の視覚比較
- 03PlaywrightとPuppeteerの撮影例
- 04自動ビジュアル回帰テスト
- 05スクリーンショット整理とPRチェックリスト
活用シーン
- 01pull requestの視覚的な変更のレビュー
- 02各ビューポートでのレスポンシブレイアウト確認
- 03修正前後のUI状態の記録
- 04CIへのスクリーンショット検査の追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ bobmatnyc/ claude-mpm-skills --skill screenshotインストール後、Claude Code で/screenshotを入力して読み込まれたか確認します。
同梱ファイルmetadata.json
詳細
スクリーンショットによる UI 検証
UI の変更を視覚的に検証するワークフローです。コードレビューを効率化し、レスポンシブデザインの問題を早期に発見できます。
このスキルを使う場面
次の場合にこのスキルを使います:
- UI に変更を加える場合(コンポーネント、スタイル、レイアウト)
- レスポンシブデザインを実装する場合
- 視覚的な変更を含むプルリクエストを作成する場合
- レビュアーにローカルでコードを実行してもらわずに、UI の動作を示したい場合
- バグ修正前後の視覚的な状態を記録する必要がある場合
スクリーンショットによる検証が重要な理由
メリット
- レビューの迅速化:レビュアーはローカル環境をセットアップせずに、変更をすぐに確認できます
- デザインの記録:デザイン上の判断を視覚的に記録できます
- 視覚的な変更履歴:UI の変遷を記録できます
- レスポンシブデザインの問題を発見:モバイルやタブレットでの問題を早期に検出できます
- コミュニケーションの削減:視覚的な変更に関するやり取りを減らせます
- 品質ゲート:視覚的な出力を意識的に確認するよう促します
解決できる問題
- ❌「レイアウトの問題をローカルで再現できません」
- ❌「モバイルではどのように表示されますか?」
- ❌「これが意図したデザインですか?」
- ❌「以前のバージョンと比べてどうですか?」
- ✅ これらすべてに、PR のスクリーンショットで回答できます
必須のスクリーンショット
UI を変更する PR では、3 種類すべてのビューポートサイズで撮影してください。
1. デスクトップ表示(1920x1080)
- ページ全体のスクリーンショット
- 必要に応じて主要コンポーネントの拡大画像
- 修正やリファクタリングの場合は変更前と変更後の比較
- 状態の違い(デフォルト、ホバー、アクティブ、エラー、読み込み中)
2. タブレット表示(768x1024)
- 縦向き
- レスポンシブのブレークポイントを確認
- タッチ操作の対象が見えること
- タブレットモードでのメニューやナビゲーション
3. モバイル表示(375x667)
- 縦向き(一般的な最小サイズである iPhone 8/SE のサイズ)
- タッチ対象のサイズが見えること(最小 44x44px)
- スクロール時の動作を記録
- モバイルメニューの状態
スクリーンショットの撮影方法
ブラウザーの DevTools を使う方法
Chrome/Edge DevTools:
- DevTools を開きます(F12 または Cmd+Option+I)
- デバイスツールバーを切り替えます(Cmd+Shift+M または Ctrl+Shift+M)
- デバイスのプリセットまたはカスタムサイズを選択します:
- デスクトップ:1920 x 1080
- タブレット:768 x 1024
- モバイル:375 x 667
- スクリーンショットを撮影します:
- ページ全体:Cmd+Shift+P →「Capture full size screenshot」
- ビューポートのみ:Cmd+Shift+P →「Capture screenshot」
Firefox DevTools:
- DevTools を開きます(F12)
- レスポンシブデザインモードを切り替えます(Cmd+Option+M)
- サイズを設定します
- ツールバーのスクリーンショットアイコンをクリックします
CLI スクリーンショットツール
Playwright を使う方法(CI で推奨):
// screenshot.js
const { chromium } = require('playwright');
async function captureScreenshots(url) {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto(url);
// Desktop
await page.setViewportSize({ width: 1920, height: 1080 });
await page.screenshot({
path: 'screenshots/desktop.png',
fullPage: true
});
// Tablet
await page.setViewportSize({ width: 768, height: 1024 });
await page.screenshot({
path: 'screenshots/tablet.png',
fullPage: true
});
// Mobile
await page.setViewportSize({ width: 375, height: 667 });
await page.screenshot({
path: 'screenshots/mobile.png',
fullPage: true
});
await browser.close();
}
captureScreenshots('http://localhost:3000');
実行:node screenshot.js
Puppeteer を使う方法:
// screenshot.js
const puppeteer = require('puppeteer');
async function captureScreenshots(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
// Desktop
await page.setViewport({ width: 1920, height: 1080 });
await page.screenshot({
path: 'screenshots/desktop.png',
fullPage: true
});
// Tablet
await page.setViewport({ width: 768, height: 1024 });
await page.screenshot({
path: 'screenshots/tablet.png',
fullPage: true
});
// Mobile
await page.setViewport({ width: 375, height: 667 });
await page.screenshot({
path: 'screenshots/mobile.png',
fullPage: true
});
await browser.close();
}
captureScreenshots('http://localhost:3000');
PR 説明テンプレート
このテンプレートを使って、視覚的な変更を記録してください:
## Visual Changes
### Desktop (1920x1080)

**Key changes**:
- Updated header navigation layout
- Improved spacing between sections
- Added hover states to buttons
### Tablet (768x1024)

**Key changes**:
- Stacked layout for sidebar
- Touch-friendly button sizes (48x48px)
- Adjusted typography for readability
### Mobile (375x667)

**Key changes**:
- Hamburger menu replaces horizontal nav
- Single column layout
- Bottom sticky CTA button
### Before/After Comparison
#### Before (Bug)

**Issue**: Text overflowing container on mobile
#### After (Fixed)

**Fix**: Applied word-wrap and max-width constraints
### Interaction States
#### Default State

#### Hover State

#### Active/Selected State

#### Error State

#### Loading State

## Responsive Design Notes
- Breakpoints: 768px (tablet), 375px (mobile)
- All touch targets > 44x44px
- Text remains readable at all sizes (min 16px body)
- No horizontal scrolling on any viewport
- Images scale proportionally
## Accessibility Checks
- [ ] Keyboard navigation works
- [ ] Focus states visible
- [ ] Color contrast meets WCAG AA (4.5:1)
- [ ] Alt text on images
- [ ] ARIA labels where needed
スクリーンショットの自動テスト
Playwright Test を使う方法
// tests/visual.spec.js
const { test, expect } = require('@playwright/test');
test.describe('Visual Regression', () => {
test('homepage looks correct on desktop', async ({ page }) => {
await page.goto('http://localhost:3000');
await page.setViewportSize({ width: 1920, height: 1080 });
await expect(page).toHaveScreenshot('homepage-desktop.png');
});
test('homepage looks correct on mobile', async ({ page }) => {
await page.goto('http://localhost:3000');
await page.setViewportSize({ width: 375, height: 667 });
await expect(page).toHaveScreenshot('homepage-mobile.png');
});
});
実行:npx playwright test --update-snapshots(初回にベースラインを生成します)
Storybook + Chromatic を使う方法
コンポーネント単位の視覚的なテストの場合:
- Storybook をセットアップ:
// Button.stories.jsx
export default {
title: 'Components/Button',
component: Button,
};
export const Primary = () => <Button variant="primary">Click me</Button>;
export const Secondary = () => <Button variant="secondary">Click me</Button>;
- Chromatic を統合:
npm install --save-dev chromatic
npx chromatic --project-token=<token>
- CI との統合(GitHub Actions):
# .github/workflows/chromatic.yml
name: Chromatic
on: push
jobs:
chromatic:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npx chromatic --project-token=${{ secrets.CHROMATIC_TOKEN }}
スクリーンショットのチェックリスト
UI の変更を含む PR を提出する前に確認してください:
撮影要件
- デスクトップのスクリーンショット(1920x1080)を撮影した
- タブレットのスクリーンショット(768x1024)を撮影した
- モバイルのスクリーンショット(375x667)を撮影した
- すべてのスクリーンショットを PR にアップロードした
- バグ修正の場合、変更前後の比較を含めた
品質チェック
- スクリーンショットにページ全体が表示されている(途中で切れていない)
- スクリーンショットに localhost の URL が表示されていない
- スクリーンショットに機密データ(PII、キーなど)が含まれていない
- スクリーンショットが鮮明で読みやすい
- ファイル名が内容を表している(例:
desktop-homepage.png)
ドキュメント
- 各ビューポートでの主な変更点を記載した
- レスポンシブ時の動作を説明した
- アクセシビリティに関する注意事項を含めた
- 該当する場合、操作時の状態を記録した
よくある問題と解決策
問題:スクリーンショットのファイルサイズが大きすぎる
問題:スクリーンショットが 5MB 以上あり、PR の読み込みが遅くなります 解決策:アップロードする前に画像を圧縮します
# Using ImageMagick
convert input.png -quality 85 output.png
# Using pngquant
pngquant input.png --output output.png
問題:スクリーンショット間で動的コンテンツが変化する
問題:タイムスタンプやランダムデータによって、スクリーンショットに一貫性がなくなります 解決策:テストでモックデータを使用するか、時間を固定します
// Mock Date
const mockDate = new Date('2025-01-01T00:00:00Z');
jest.useFakeTimers();
jest.setSystemTime(mockDate);
// Or in Playwright
await page.addInitScript(() => {
Date.now = () => 1704067200000; // Fixed timestamp
});
問題:スクリーンショットの差分にフォントのレンダリングの違いが現れる
問題:同じコードでも、OS によって表示が異なります 解決策:一貫した環境を保つために Docker を使用します
FROM mcr.microsoft.com/playwright:v1.40.0-jammy
WORKDIR /app
COPY . .
RUN npm ci
CMD ["npm", "run", "screenshot"]
スクリーンショットの整理
ディレクトリ構成
screenshots/
├── desktop/
│ ├── homepage.png
│ ├── product-list.png
│ └── checkout.png
├── tablet/
│ ├── homepage.png
│ ├── product-list.png
│ └── checkout.png
└── mobile/
├── homepage.png
├── product-list.png
└── checkout.png
命名規則
- 内容が分かる名前を付けます:
desktop-homepage-logged-in.png - 関連する場合は状態を含めます:
mobile-form-error-state.png - バージョンを比較します:
before-header-fix.png、after-header-fix.png
CI/CD との統合
GitHub Actions の例
name: Visual Testing
on: pull_request
jobs:
screenshots:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Build app
run: npm run build
- name: Start app
run: npm start &
- name: Wait for app
run: npx wait-on http://localhost:3000
- name: Capture screenshots
run: node scripts/screenshot.js
- name: Upload screenshots
uses: actions/upload-artifact@v4
with:
name: screenshots
path: screenshots/
ベストプラクティス
推奨事項
- ✅ 3 種類すべてのビューポートサイズをキャプチャします
- ✅ バグ修正の前後を含めます
- ✅ 操作状態(ホバー、アクティブ、エラー)を記録します
- ✅ 大きな画像を圧縮します
- ✅ 内容が分かるファイル名を使用します
- ✅ 重要な変更点をスクリーンショットに注釈として付けます
避けるべきこと
- ❌ モバイルのスクリーンショットを省略します(「デスクトップのみ」はまれです)
- ❌ 機密データを含むスクリーンショットをアップロードします
- ❌ ランダムなビューポートサイズを使用します(標準に従ってください)
- ❌ レスポンシブのブレークポイントを記録し忘れます
- ❌ スクリーンショットだけに頼ります(コードレビューも必要です)
関連スキル
universal-verification-pre-merge- マージ前の検証チェックリストuniversal-testing-webapp-testing- Web アプリケーションのテストパターンtoolchains-javascript-testing-playwright- Playwright テストフレームワークuniversal-debugging-verification-before-completion- 検証ワークフロー
コメント
Markdown 対応