ui
pendulum swing / swing animation / hanging sway
吊り下げたタグやバッジが上の吊り点を軸に振れ、往復ごとに振れ幅を落として止まる動き。肝は回転の中心を要素の中ではなく吊り点に置くことで、中心で回すとその場の首振りにしか見えない。
02 — Prompt template
03 — Params
angle(押された直後の振れ角 deg) — 範囲 2〜30 / 初期 14
最初の一振りの最大角。タグや札は8〜15degが自然。常時揺らすなら1〜3degに抑える。25degを超えると吊り具から外れそうに見える。pivot(吊り点までの距離 px) — 範囲 0〜60 / 初期 18
要素の上辺から吊り点までの紐の長さ。transform-originのYをこの分だけマイナスにする。16〜24pxが実測の相場。0だと上辺が蝶番になり、吊り下げではなく扉のあおりに見える。period(1往復の時間 s) — 範囲 0.6〜3.6 / 初期 1.6
小物は1.2〜2sが自然。実物の振り子は紐が長いほど遅いので、pivotを伸ばしたら周期も伸ばす。1s未満だと揺れではなく震えに見える。damping(半往復ごとに残る振れ幅 %) — 範囲 30〜100 / 初期 60
折り返すたびに振れ幅が何%残るか。55〜70%で3〜4往復して止まる。40%以下はすぐ止まり重たい物に、100%は減衰せず揺れ続ける常時スイングになる。
04 — Vocab
transform-origin(要素の外) — 変形の基準点は要素の外にも置ける。50% -18px のようにマイナス値にすると、上辺より上の点を軸に弧を描いて振れる。
減衰振動(damped oscillation) — 往復するたびに振れ幅が一定の比率で小さくなる揺れ。比率を決めておくと「何往復で止まるか」が狙って作れる。
振り子の周期 — 振り子は紐が長いほどゆっくり揺れる(周期は長さの平方根に比例)。吊り点を遠くしたのに周期が同じだと、軽すぎる物に見える。
重ね合わせ — 揺れている最中に押されたら、新しい揺れを今の揺れに足す。角度をリセットしないので、連続で押しても跳ねずに揺れが大きくなる。
05 — NG → OK examples
NG
言い方: 「「タグを吊り下げてる感じでゆらゆら揺らして」」
なぜNG: 回転の中心が指定されないので、transform-origin: center のまま rotate されてタグがその場で首を振るだけになる。振れ幅も一定のまま延々と往復し、触れても何も起きないか、押した瞬間に角度が0へ飛ぶ実装が返ってくる。
OK
言い方: 「「pendulum swingで。transform-origin: 50% -18px(上の吊り点)を軸に rotate。押されたら14degで振り出し、周期1.6s、半往復ごとに振れ幅を60%へ減衰させて止める。紐は要素と一緒に回し、フックは動かさない。reduced-motionでは静止」」
なぜOK: 軸の位置・振れ角・周期・減衰を全部数値で渡している。特に「吊り点を軸に」の一言が首振りと吊り下げを分け、「減衰させて止める」が揺れっぱなしで落ち着かない画面を防ぐ。
