テキスト
逃げる文字
黒い画面の大きな文字が、マウスやタップした指の近くから押しのけられ、離すとばねのように元へ戻るタイポグラフィ。文字の位置は実際の表示から測ります。
ライセンス 参照のみ
ソースコードは配布していません。
この動きの特徴
- ポインターから文字が逃げる
- 離すとばねで元に戻る
- タッチでもスクロールを妨げない
- 複数配置に対応
- JavaScriptなし・動きを減らす設定では静止表示
導入と調整
使い方
src/Component.astro と src/motion.ts を同じフォルダーに配置して読み込みます。文字は lines に行ごとの配列で渡し、行ごとの大きさは sizes に CSS の値で指定できます。
<PointerAvoid
lines={['さわると', '逃げる文字。']}
sizes={['clamp(22px, 4vw, 40px)', 'clamp(40px, 9vw, 96px)']}
radius={150}
force={80}
hint="マウスを動かす・指でタップすると、近くの文字が逃げます"
/>radiusは文字が反応する距離(px)、forceはポインターの真上での最大の押し出し量(px)です。hintは動きが有効なときだけ表示される短い案内です。asで見出しのタグ(h1/h2/p)を変えられます。
動きの仕組み
motion.tsのmountPointerAvoid(root)が[data-pointer-avoid]ごとに動きを付け、後片付け用の関数を返します。同じページに複数置いても、それぞれ独立して動きます。- 文字の中心位置は実際の表示から測ります。画面幅の変化(ResizeObserver)とWebフォントの読み込み完了で測り直し、ポインターの位置は毎回ルート要素の現在位置から求めるため、スクロールしてもずれません。
- 押し出しの強さは「半径からの近さ × force」で、離す・外れると減衰するばねで元の位置へ戻ります(剛性1000・減衰15・質量0.5)。横方向に押された分だけ、文字が少し傾きます。
- ポインターが文字の中心にちょうど重なったときは、向きが決まらないため真上へ押し出します。
- イベントはすべてpassiveで、
preventDefaultは使いません。タッチ操作では、触れている間だけ文字が逃げ、画面のスクロールはそのまま使えます。 - 読み上げ用には分割前の文章を1つだけ持ち、一文字ずつの表示は読み上げ対象から外しています。
- JavaScriptが使えない環境や
prefers-reduced-motion: reduceのときは何も動かさず、静止した文字のまま表示します。設定を途中で変えた場合も切り替わります。 pagehideでループとイベントをすべて止め、戻る/進むのキャッシュから復元されたときは付け直します。- 奥行き(3D)の表現はありません。動きは平面上の移動と小さな回転だけです。
調整する箇所
- 配色はコンポーネント内の
--pointer-avoid-bg、--pointer-avoid-ink、文字の光は--pointer-avoid-glowで変更できます。 - 既定の文字サイズは
--pointer-avoid-size、文字の間隔は--pointer-avoid-gap、高さは外側から--pointer-avoid-height(既定は100svh)で指定できます。 - ばねの硬さや戻り方は
motion.tsのSTIFFNESS、DAMPING、MASS、傾きの量はROTATE_PER_PXで調整します。
元にした実装
- 元のリポジトリ:
GOUKI-Main/mysite(コミット8f3843bda249b85f8d8330f9dc7f0fce3eb950f6) - 元のファイル:
app/components/ui/avoid-mouse-text.tsx(React と Motion を使用)、app/components/sections/hero.tsx - このカタログでは React と Motion を使わず、Astro と小さなばねの計算に置き換えています。元の実装は文字の位置を固定の幅(60px)で計算していましたが、ここでは実際の表示位置を測っています。
利用条件
元のリポジトリにはライセンスの記載がなく、ライセンスは未設定です。再配布の条件が決まっていないため、現在はソースを配布せず、見た目と動きの参考として掲載しています。
仕様・利用条件
仕様
- 分類
- テキスト
- 更新日
- 2026.10.30
- ライセンス
- 未設定(参照のみ)
- 使用技術
- Astro
ソースと利用条件
参照のみ見た目と動きの見本として掲載しています。
利用条件(ライセンス)がまだ決まっていないため、ソースコードは配布していません。 プレビューでの確認と、1-cost.comでの提案・制作のご相談にお使いください。
- ライセンス
- 未設定
- 公開ファイル
- なし
