anime-js
Anime.jsアニメーションライブラリを使用して、パフォーマンスの高いアニメーションを構築するための専門的なガイドラインを提供するスキルです。アニメーションの実装やチューニングが必要な場面で活用できます。
description の原文を見る
Expert guidelines for building performant animations with Anime.js animation library
SKILL.md 本文
Anime.js アニメーションガイドライン
Anime.js、JavaScript、Web アニメーションパフォーマンスの専門家です。アニメーション作成時は以下のガイドラインに従ってください。
コア原則
インストールとインポート
npm install animejs
// フル インポート
import anime from "animejs";
// バンドルサイズを削減するためのモジュールインポート
import { animate, timeline, stagger } from "animejs";
基本的なアニメーション
anime({
targets: ".element",
translateX: 250,
rotate: "1turn",
duration: 800,
easing: "easeInOutQuad"
});
パフォーマンス最適化
フレームレート制御
// 低性能デバイス向けにグローバルフレームレートを調整
anime.suspendWhenDocumentHidden = true;
// 特定のアニメーションのFPSを制御
anime({
targets: ".element",
translateX: 250,
update: function(anim) {
// 必要に応じてカスタムフレームレート制限
}
});
レイアウトプロパティではなくトランスフォームを使用
// 良い例 - GPU加速トランスフォームを使用
anime({
targets: ".element",
translateX: 100, // 良い
translateY: 50, // 良い
scale: 1.2, // 良い
rotate: 45, // 良い
opacity: 0.5 // 良い
});
// 避けるべき - レイアウト再計算の原因
anime({
targets: ".element",
left: 100, // 避ける
top: 50, // 避ける
width: 200, // 避ける
height: 150 // 避ける
});
高頻度更新にはAnimatableを使用
import { Animatable } from "animejs";
// 継続的な更新に最適化(マウストラッキングなど)
const animatable = new Animatable(".cursor", {
x: 0,
y: 0
});
document.addEventListener("mousemove", (e) => {
animatable.x = e.clientX;
animatable.y = e.clientY;
});
タイムラインアニメーション
基本的なタイムライン
const tl = anime.timeline({
easing: "easeOutExpo",
duration: 750
});
tl.add({
targets: ".header",
translateY: [-50, 0],
opacity: [0, 1]
})
.add({
targets: ".content",
translateY: [30, 0],
opacity: [0, 1]
}, "-=500") // 500msのオーバーラップ
.add({
targets: ".footer",
translateY: [30, 0],
opacity: [0, 1]
}, "-=500");
タイムラインコントロール
const tl = anime.timeline({
autoplay: false
});
// コントロールメソッド
tl.play();
tl.pause();
tl.restart();
tl.reverse();
tl.seek(1000); // 1秒の位置へ移動
スタッガーアニメーション
基本的なスタッガー
anime({
targets: ".grid-item",
translateY: [50, 0],
opacity: [0, 1],
delay: anime.stagger(100) // 各要素間に100msの遅延
});
高度なスタッガーオプション
// 中央からスタッガー
anime({
targets: ".grid-item",
scale: [0, 1],
delay: anime.stagger(100, { from: "center" })
});
// グリッドスタッガー
anime({
targets: ".grid-item",
scale: [0, 1],
delay: anime.stagger(50, {
grid: [14, 5],
from: "center"
})
});
// イージング付きスタッガー
anime({
targets: ".item",
translateX: 250,
delay: anime.stagger(100, { easing: "easeOutQuad" })
});
イージング関数
ビルトインイージング
// 一般的なイージング
anime({
targets: ".element",
translateX: 250,
easing: "easeOutExpo" // 高速開始、低速終了
// easing: "easeInOutQuad" // 両端がスムーズ
// easing: "easeOutElastic(1, .5)" // バウンシー
// easing: "easeOutBounce" // バウンス効果
// easing: "spring(1, 80, 10, 0)" // 物理ベース
});
カスタムイージング
anime({
targets: ".element",
translateX: 250,
easing: "cubicBezier(0.25, 0.1, 0.25, 1)"
});
SVGアニメーション
パスアニメーション
const path = anime.path(".motion-path");
anime({
targets: ".element",
translateX: path("x"),
translateY: path("y"),
rotate: path("angle"),
easing: "linear",
duration: 2000,
loop: true
});
ラインドローイング
anime({
targets: "path",
strokeDashoffset: [anime.setDashoffset, 0],
easing: "easeInOutSine",
duration: 1500,
delay: anime.stagger(250)
});
モーフィング
anime({
targets: "path",
d: [
{ value: "M10 10 L90 10 L90 90 L10 90 Z" },
{ value: "M10 50 Q50 10 90 50 Q50 90 10 50 Z" }
],
easing: "easeInOutQuad",
duration: 1000,
loop: true,
direction: "alternate"
});
関数ベースの値
動的な値
anime({
targets: ".element",
translateX: function(el, i) {
return i * 100; // 各要素がさらに移動
},
rotate: function(el, i, total) {
return (360 / total) * i; // 回転を分散
},
delay: function(el, i) {
return i * 50;
}
});
コールバックとイベント
アニメーションイベント
anime({
targets: ".element",
translateX: 250,
begin: function(anim) {
console.log("アニメーション開始");
},
update: function(anim) {
console.log(Math.round(anim.progress) + "%");
},
complete: function(anim) {
console.log("アニメーション完了");
}
});
ループ
anime({
targets: ".element",
translateX: 250,
direction: "alternate",
loop: true,
loopComplete: function(anim) {
console.log("ループ完了");
}
});
React インテグレーション
基本的な React 使用方法
import { useEffect, useRef } from "react";
import anime from "animejs";
function AnimatedComponent() {
const elementRef = useRef(null);
useEffect(() => {
const animation = anime({
targets: elementRef.current,
translateX: 250,
duration: 800
});
return () => {
animation.pause(); // クリーンアップ
};
}, []);
return <div ref={elementRef}>Animated</div>;
}
useCallback でのコントロール
function ControlledAnimation() {
const elementRef = useRef(null);
const animationRef = useRef(null);
const playAnimation = useCallback(() => {
animationRef.current = anime({
targets: elementRef.current,
translateX: [0, 250],
duration: 800
});
}, []);
useEffect(() => {
return () => {
animationRef.current?.pause();
};
}, []);
return (
<>
<div ref={elementRef}>Animated</div>
<button onClick={playAnimation}>Play</button>
</>
);
}
Web Animations API ブリッジ
ネイティブパフォーマンスのためのWAAPI使用
import { wapiAnimate } from "animejs";
// ブラウザのネイティブWeb Animations APIを使用
wapiAnimate(".element", {
translateX: 250,
duration: 800
});
アクセシビリティ
モーション削減への対応
const prefersReducedMotion = window.matchMedia(
"(prefers-reduced-motion: reduce)"
).matches;
anime({
targets: ".element",
translateX: 250,
duration: prefersReducedMotion ? 0 : 800,
easing: prefersReducedMotion ? "linear" : "easeOutExpo"
});
ベストプラクティスまとめ
- レイアウトプロパティではなくトランスフォーム(translate、scale、rotate)を使用
- バンドルサイズを削減するため必要なモジュールのみをインポート
- 複数要素のアニメーションにはスタッガーを使用
- コンポーネントのアンマウント時にアニメーションをクリーンアップ
- 高頻度更新にはAnimatableを使用
- 複雑なシーケンスにはタイムラインを活用
- 動的アニメーションには関数ベースの値を使用
- モーション削減設定への対応
- ネイティブパフォーマンス向けWAPIブリッジの検討
- 低性能デバイスでテスト
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- mindrally
- リポジトリ
- mindrally/skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/mindrally/skills / ライセンス: Apache-2.0
関連スキル
nano-banana-2
inference.sh CLIを通じてGoogle Gemini 3.1 Flash Image Preview(Nano Banana 2)で画像を生成します。テキストから画像を生成する機能、画像編集、最大14枚の複数画像入力、Google Searchグラウンディング機能に対応しています。トリガーワード:「nano banana 2」「nanobanana 2」「gemini 3.1 flash image」「gemini 3 1 flash image preview」「google image generation」
octocode-slides
洗練されたマルチファイル形式のHTMLプレゼンテーションを生成します。6段階のフロー(概要 → リサーチ → アウトライン → デザイン → 実装 → レビュー)で構成されています。各スライドは独立したHTMLファイルとなり、iframeで読み込まれます。「スライドを作成してほしい」「プレゼンテーションを作ってほしい」「HTMLスライドを生成してほしい」「デックを構築してほしい」といった依頼や、ノート・ドキュメント・コードを洗練されたプレゼンテーションに変換する際に使用できます。
gpt-image2-ppt
OpenAIのgpt-image-2を使用して、視覚的に優れたPPTスライドを生成します。Spatial Glass、Tech Blue、Editorial Monoなど10種類のキュレーション済みスタイルに対応し、ユーザーが提供したPPTXファイルを模倣するテンプレートクローンモードも搭載しています。HTMLビューアと16:9形式のPPTXファイルを出力します。プレゼンテーション、スライド、ピッチデック、投資家向けPPT、雑誌風PPTの作成依頼などで活用してください。
nano-banana
Nano Banana PRO(Gemini 3 Pro Image)およびNano Banana(Gemini 2.5 Flash Image)を使用したAI画像生成機能です。以下の場合に活用できます:(1)テキストプロンプトからの画像生成、(2)既存画像の編集、(3)インフォグラフィックス、ロゴ、商品写真、ステッカーなどのプロフェッショナルなビジュアルアセット制作、(4)複数画像での人物キャラクターの一貫性保持、(5)正確なテキスト描画を含む画像生成、(6)AI生成ビジュアルが必要なあらゆるタスク。「画像を生成」「画像を作成」「写真を作る」「ロゴをデザイン」「インフォグラフィックスを作成」「AI画像」「nano banana」またはその他の画像生成リクエストをトリガーとして機能します。
oiloil-ui-ux-guide
モダンでクリーンなUI/UXガイダンス・レビュースキルです。新機能や既存システム(Webアプリ)に対して、実行可能なUI/UX改善提案、デザイン原則、デザインレビューチェックリストが必要な場合に活用できます。CRAP(コントラスト・反復・配置・近接)をベースに、タスクファーストなUX、情報設計、フィードバック・システムステータス、一貫性、affordances、エラー防止・復旧、認知負荷を重視します。モダンミニマルスタイル(クリーン・余白・タイポグラフィ主導)を強制し、不要なテキストを削減、アイコンとしての絵文字を禁止し、統一されたアイコンセットから直感的で洗練されたアイコンを推奨します。
axiom-hig-ref
Apple Human Interface Guidelines リファレンス — 色(セマンティックカラー、カスタムカラー、パターン)、背景(マテリアル階層、ダイナミック背景)、タイポグラフィ(標準スタイル、カスタムフォント、Dynamic Type)、SF Symbols(レンダリングモード、色、多言語対応)、ダークモード、アクセシビリティ、プラットフォーム固有の考慮事項を網羅したガイドラインです。