使い方ガイド
animated-fluent-emojis
の API をすべて紹介します。インストール方法と最初の絵文字については、先に
README をご覧ください。
以下の props はすべてのアダプターで共通です。各フレームワークのセクションでは、そこで prop をどう書くかを説明します。コンポーネントは、絵文字が最初にレンダリングされるときに、asset
site から小さな manifest を取得します。インポート時に取得することはありません。読み込み中、Emoji
は最終的なサイズの空の aria-hidden
プレースホルダーをレンダリングするため、レイアウトはずれません。id が不明な場合は、fallback
ノードをレンダリングします。fallback
がなければ何もレンダリングしません。manifest を読み込めない場合も、fallback
ノードをレンダリングします(なければ何もレンダリングしません)。そして、次のマウント時、次の
preloadEmojis
呼び出し時、またはブラウザーがオンラインに戻ったときに再試行します。
Frameworks
パッケージは 1 つで、フレームワークごとにインポートパスが 1 つあります。configureEmojis
と preloadEmojis はフレームワークに依存せず、animated-fluent-emojis
に置かれています。Preloading と Asset site
を参照してください。すべてのアダプターは 1 つの再生コアを共有し、1 つの適合性スイートに合格しているため、props はどこでも同じように動作します。ADR 0014
を参照してください。
React、Vue、Svelte のアダプターと createEmoji は、キーフレームを
animated-fluent-emojis/style.css
から読み込みます。一度だけインポートしてください。<fluent-emoji>
と Astro コンポーネントは、独自のスタイルを内包しています。
React
React のサブパスから Emoji をインポートします。
import { Emoji } from 'animated-fluent-emojis/react'
import 'animated-fluent-emojis/style.css'0.6 以前からの移行:ルートの Emoji
エクスポートは 0.6 で非推奨となり、0.7 で削除されました。インポートパスを変更するだけで、ほかに変更は不要です。props と動作は同一です。EmojiProps
型も animated-fluent-emojis/react に移動しました。configureEmojis と
preloadEmojis は animated-fluent-emojis に残っています。React
18 と 19 に対応しており、react と react-dom はオプションの peer です。
Vue
Vue 3.3 以降が必要です。Emoji
は、以下の props を camelCase で受け取ります。fallback
スロットは画像を置き換え、イベントは load、error、playbackEnd
です。class、style、data-*
などのその他の属性は、ルートの span に渡されます。
<script setup lang="ts">import { Emoji } from 'animated-fluent-emojis/vue'
import 'animated-fluent-emojis/style.css'
const handlePlaybackEnd = () => { console.log('done')}</script>
<template> <Emoji id="1f44b_wavinghand" :size="64" play-on-hover @playback-end="handlePlaybackEnd" > <template #fallback><span>👋</span></template> </Emoji></template>サーバー上とハイドレーション中は、最終的なサイズの空のプレースホルダーをレンダリングするため、Nuxt でも動作します。
Svelte
Svelte 5 が必要です。Emoji は以下の props を受け取ります。fallback
は snippet で、class、style、attributes
はルートの span に渡されます。コールバックは
onLoad、onError、onPlaybackEnd です。
<script lang="ts"> import { Emoji } from 'animated-fluent-emojis/svelte'
import 'animated-fluent-emojis/style.css'</script>
<Emoji id="1f44b_wavinghand" size={64} playOnHover> {#snippet fallback()}<span>👋</span>{/snippet}</Emoji>サーバーではプレースホルダーを、ハイドレーション後には絵文字をレンダリングするため、SvelteKit でも動作します。パッケージのエクスポートには、コンポーネントのソースを指す
svelte condition があります。
Astro
Astro
5 以降が必要です。コンポーネントはビルド時に絵文字のマークアップをレンダリングするため、スクリプトが実行される前から sprite が HTML に含まれます。そして、小さなスクリプトがブラウザーで再生を開始します。独自のスタイルを内包しているので、インポートするスタイルシートはありません。fallback
という名前付きスロットは、id が不明な場合や画像の読み込みに失敗した場合にレンダリングされます。
---import Emoji from 'animated-fluent-emojis/astro'---
<Emoji id="1f44b_wavinghand" size={64} playOnHover> <span slot="fallback">👋</span></Emoji>props は以下のものからコールバックを除いたもので、class と文字列の style
があります。ルートの span は、コールバックの代わりに
emoji-load、emoji-error、playback-end
を、バブリングする DOM イベントとしてディスパッチします。ブラウザースクリプトは
astro:page-load
でも再実行されるため、ビュートランジションも引き続き動作します。
Plain HTML
animated-fluent-emojis/element をインポートすると、<fluent-emoji>
が登録されます。スタイルシートは不要で、キーフレームはシャドウルートの中にあります。
<script type="module"> import 'animated-fluent-emojis/element'</script>
<fluent-emoji id="1f44b_wavinghand" size="64" play-on-hover> <span slot="fallback">👋</span></fluent-emoji>属性は props をケバブケースで反映したものです。id、size、play-on-hover、animation-iterations、auto-play、playing、skin-tone、alt
があります。真偽値の属性は、値が false
でない限りオンです。同じ名前が、要素の camelCase プロパティとしても存在します(element.playOnHover = true)。プロパティを設定しても、属性は書き換えられません。slot="fallback"
を持つ要素が fallback になります。要素は
emoji-load、emoji-error、playback-end
を、バブリングし composed なイベントとしてディスパッチします。
要素が定義されるまでは、サイズがありません。同じエントリーからエクスポートされている
FLUENT_EMOJI_PRE_UPGRADE_CSS をページの CSS に追加すると、size
属性(ピクセル単位)から占有領域を確保でき、レイアウトシフトを防げます。
Angular, Solid and Preact
これらは、それぞれのテンプレート構文を通じて <fluent-emoji>
を使います。Angular、Solid、Preact
のハウツーガイドを参照してください。Lit、Alpine、htmx も同様で、animated-fluent-emojis/element
をインポートしてタグを書きます。
Without a framework
createEmoji
は任意の DOM ノードにレンダリングし、コントローラーを返します。これはすべてのアダプターに共通する、フレームワーク非依存のコアです。インポートしても DOM には一切触れません。
import { createEmoji } from 'animated-fluent-emojis'
import 'animated-fluent-emojis/style.css'
const controller = createEmoji(document.querySelector('#slot'), { id: '1f44b_wavinghand', size: 64, fallback: () => document.createTextNode('👋'),})
controller.update({ playing: false })controller.destroy()オプションは以下の props に加えて、ルートの span 用の
className、style、attributes、onLoad、onError、onPlaybackEnd
のコールバック、そしてノード、ノードを返す関数、または null のいずれかを取る
fallback です。
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| id | EmojiId or string |
- | 絵文字の一意の識別子。既知の id はオートコンプリートされます |
| size | number or string | 100 | ピクセル、または 2rem や var(--size) などの任意の CSS 長さ |
| playOnHover | boolean | false | ホバー時およびキーボードフォーカス時にアニメーションを再生するかどうか |
| animationIterations | number or ‘infinite’ | 2 | 読み込み時にアニメーションを再生する回数 |
| autoPlay | boolean | true | マウント時にアニメーションを自動再生するかどうか |
| playing | boolean | - | 再生を制御します。true で再生、false で一時停止、省略するとデフォルトのままです |
| onPlaybackEnd | function | - | animationIterations による有限回の再生が終わったときに一度だけ呼ばれます |
| skinTone | SkinTone | ‘default’ | バリエーションを持つ絵文字のスキントーン(後述) |
| alt | string | description | アクセシブルなテキスト。デフォルトは絵文字の説明で、"" は装飾用であることを示します |
| className | string | - | ルートの <span> のクラス名。コンポーネント自身のクラス名とマージされます |
| style | CSSProperties | - | ルートの <span> のインラインスタイル。width と height は size に従います |
| ref | Ref<HTMLSpanElement> |
- | ルートの <span> に転送されます。React 18 と 19 で動作します |
| fallback | ReactNode | glyph | 画像や manifest の読み込みに失敗した場合、または id が不明な場合にレンダリングされます。null は何も表示しません |
| onLoad | function | - | sprite sheet が読み込まれたときに呼ばれます |
| onError | function | - | 画像の読み込みに失敗したときに呼ばれ、manifest が失敗した場合はイベントなしで呼ばれます |
その他の <span>
属性(data-*、aria-*、title、イベントハンドラー)は、ルートに渡されます。数値の
size は丸められ、有限の正の数以外は 100 にフォールバックします。文字列の
size はそのまま CSS に渡されるので、size="2rem" や
size="var(--emoji-size)" が使えます。"48"
のような数字の文字列は数値の 48 として扱われ、それ以外の文字列では画像に
sizes="auto" が付きます。width または height を含む style は size
より優先されます。
skinTone は
'default'、'light'、'medium-light'、'medium'、'medium-dark'、'dark'
のいずれかです。diverse
とマークされた絵文字にのみ適用され、それ以外の絵文字や不明な値の場合は、デフォルトのシートが使われます。DiverseEmojiId
はスキントーンを持つ id の一覧で、id がそのいずれかである場合、skinTone
はそれに対して型付けされます。
Hover and focus
playOnHover
を指定すると、最初の再生のあとで、ポインターが絵文字に入ったときに加えて、絵文字が
<button> または <a>
の中にあり、それがキーボードフォーカス(:focus-visible)を受け取ったときにも、アニメーションが再生されます。
Reduced motion
ユーザーのシステムがモーションの軽減(prefers-reduced-motion: reduce)を求めている場合、autoPlay
は無視され、絵文字はポスターフレーム、つまりアニメーションの最初のフレームで静止します。playOnHover
は、ユーザーが明示的に行う操作であるため、ホバー時とフォーカス時には引き続き再生されます。
Fallback
sprite sheet の読み込みに失敗すると、Emoji
は fallback グリフを表示します。これは絵文字本来の Unicode 文字で、alt
のラベルが付きます。代わりに独自のノードをレンダリングするには fallback
を渡し、何もレンダリングしないようにするには fallback={null} を渡します。
<Emoji id="1f44b_wavinghand" fallback={<span>👋</span>} /><Emoji id="1f44b_wavinghand" fallback={null} />onError
は、画像が失敗したとき(イベント付き)と、manifest が失敗したとき(イベントなし)に実行されます。fallback グリフには manifest が必要なため、manifest 自体が失敗した場合は、明示的な
fallback ノードだけがレンダリングされます。不明な id は fallback
ノードをレンダリングし、なければ何もレンダリングしません。onError
は呼ばれず、開発時には id ごとに一度だけ警告が出ます。manifest のリクエストは 15 秒であきらめ、ほかの失敗と同様に再試行されます。
Playback
自動再生は、sprite
sheet が読み込まれ、絵文字が画面内にあり、タブが表示されるまで待機します。そのため、画面外やバックグラウンドの絵文字はアニメーションしません。非表示のタブではすべての絵文字が一時停止し、タブが戻ると再開します。id
を変更すると、新しい絵文字の最初の再生が改めて始まります。animationIterations
が 0、負の数、または NaN の場合は自動再生が無効になります。Infinity は
'infinite'
と同じです。自動再生が保留されている間、絵文字はポスターフレームを表示します。
再生を自分で制御するには playing を使います。true は animationIterations
回の再生を行い、autoPlay
とモーションの軽減を上書きします(ただし、画像、ビューポート、表示中のタブは引き続き待ちます)。false
は現在のフレームで一時停止します。終了した再生は、切り替えても再開されないため、再生し直すには新しい
key で再マウントしてください。onPlaybackEnd
は有限回の再生が終わったときに一度だけ実行されます。'infinite'
の場合や、再生の途中で絵文字がアンマウントされた場合は、実行されません。
<Emoji id="1f389_partypopper" playing={isOpen} onPlaybackEnd={handleDone} />Images and HD sprite sheets
sprite sheet は loading="lazy" と decoding="async" で読み込まれます。HD
sprite sheet(200px フレーム)を持つ絵文字には、幅ベースの srcSet(100w と
200w)も付き、sizes にはレンダリングされるサイズが設定されます(文字列の
size の場合は auto)。これにより、高密度ディスプレイではブラウザーが @2x
のシートを選びます。
Preloading
preloadEmojis は、どの Emoji
がレンダリングされるよりも前に manifest の取得を開始し、id が渡された場合は、準備ができた時点でそれらの sprite
sheet をリクエストします。reject されることはありません。
import { preloadEmojis } from 'animated-fluent-emojis'
void preloadEmojis()void preloadEmojis(['1f44b_wavinghand', '1f525_fire'], { skinTone: 'medium' })skinTone
は、スキントーンを持つ絵文字について、ウォームアップするバリエーションを選びます。
Asset site
デフォルトでは、manifest と sprite sheet は
https://animated-fluent-emojis-cdn.andryore.dev
から取得されます。以前のアドレスである
https://animated-fluent-emojis.pages.dev
も引き続き使えます。独自のコピーから配信するには、最初の Emoji
がレンダリングされる前に、configureEmojis を一度だけ呼び出します。
import { configureEmojis } from 'animated-fluent-emojis'
configureEmojis({ assetSiteUrl: 'https://emojis.example.com' })Lookup
animated-fluent-emojis/lookup は React に依存せず、Emoji
と manifest を共有するため、Emoji
と併せて追加しても軽量です。すべての関数は manifest を読み込み、読み込めない場合は
undefined または空の配列で解決され、reject されることはありません。
import { extractEmojis, findEmojiByUnicode, searchEmojis,} from 'animated-fluent-emojis/lookup'
await findEmojiByUnicode('👍🏽') // { id: 'yes', skinTone: 'medium' }await extractEmojis('Hi 👋 there') // [{ id, text, index, length }]await searchEmojis('party', { limit: 5 }) // [{ id }]findEmojiByUnicode(text)は 1 つの絵文字を解決し、単一のスキントーン修飾子をskinToneにマッピングします。異なるトーンが混在する場合は、基本の絵文字に解決されます。©や™などの記号は、一致させるために絵文字バリエーションセレクター(U+FE0F)が必要ですが、ZWJ シーケンスは、バリエーションセレクターがなくても一致します(minimally qualified)。- 複数のカタログエントリーが同じグリフを共有している場合、lookup は正規の絵文字を返します。つまり、グリフのコードポイントを接頭辞とする id、それがなければレビュー済みのオーバーライド、それもなければカタログ順で最初のエントリーです。たとえば
❤️は、そのグリフを再利用しているバリアントではなく、ハートに解決されます。スキントーンを指定した場合は、トーンを持つ兄弟エントリーにフォールバックします。 extractEmojis(text)は、テキスト内のカタログにあるすべての絵文字を、ZWJ シーケンスを分割せずに、オフセットと長さとともに見つけます。Intl.Segmenterがない場合は、コードポイントのグルーパーにフォールバックし、どちらの関数も reject されることはありません。searchEmojis(query, { limit })は、大文字と小文字を区別せずに説明文に一致させます。limitのデフォルトは 20 で、正の数でないlimitは無制限を意味しますが、0だけは何も返しません。
Types
ルートは configureEmojis、preloadEmojis、createEmoji と、型
SkinTone、EmojiId、DiverseEmojiId、EmojiController、EmojiOptions、EmojiFallback
をエクスポートします。Emoji コンポーネントと EmojiProps
は 0.7.0 でルートから削除されました。/react
からインポートしてください。/react、/vue、/svelte はそれぞれ独自の Emoji
と EmojiProps をエクスポートします。/astro にはデフォルトエクスポートと
EmojiAstroProps 型があり、/element は FluentEmojiElement
型をエクスポートします。EmojiId
は公開されているすべての id のユニオンで、カタログから生成されます。id
prop の型は EmojiId | (string & {})
なので、既知の id はオートコンプリートされ、インストール済みのバージョンより後にカタログへ追加された id もコンパイルできます。