Kinetic Typography Poster キネティック・タイポグラフィポスター
High-energy motion poster featuring alternating angled marquee banners, brutalist color blocks, interactive pause controls, and Swiss modernism aesthetics. 流れるテキストリボンや幾何学ストライプ、一時停止切り替えを備えた動的タイポグラフィポスター。
ライブデモ Live Demo
概要・用途・特徴Overview, Usage & Features
何ができるかWhat it does
High-energy motion poster featuring alternating angled marquee banners, brutalist color blocks, interactive pause controls, and Swiss modernism aesthetics.
流れるテキストリボンや幾何学ストライプ、一時停止切り替えを備えた動的タイポグラフィポスター。
どこで使うかWhere to use
Portfolio, product showcase, landing page.
ポートフォリオ、製品紹介、ランディングページ。
特徴Key features
High-energy motion poster featuring alternating angled marquee banners, brutalist color blocks, interactive pause controls, and Swiss modernism aesthetics.
流れるテキストリボンや幾何学ストライプ、一時停止切り替えを備えた動的タイポグラフィポスター。
調整可能パラメータ Adjustable Parameters
| Parameter | Default | Description |
|---|---|---|
--kt-bg | #f5f046 | Change this CSS custom property to match your brand color. |
実装コード Implementation Code
<div class="demo-stage kt-root"><div class="kt-poster"><div class="kt-header"><span class="kt-stamp">MANIFESTO // 2026</span><button type="button" class="kt-ctrl" aria-pressed="false" aria-label="Toggle typography motion animation"><span class="kt-indicator" aria-hidden="true"></span>FREEZE</button></div><div class="kt-marquee-box kt-tilt"><div class="kt-track kt-track-1"><span class="kt-phrase">KINETIC CADENCE • RADICAL TYPE • UNCOMPROMISED FORM • </span><span class="kt-phrase" aria-hidden="true">KINETIC CADENCE • RADICAL TYPE • UNCOMPROMISED FORM • </span></div></div><div class="kt-accent-strip"><div class="kt-track kt-track-rev"><span class="kt-phrase-bold">BOLD • TENSION • EXPERIMENT • DISRUPT • EVOLVE • </span><span class="kt-phrase-bold" aria-hidden="true">BOLD • TENSION • EXPERIMENT • DISRUPT • EVOLVE • </span></div></div><div class="kt-marquee-box"><div class="kt-track kt-track-2"><span class="kt-phrase">NEVER STATIC • INFINITE LOOP • SYSTEMATIC MOTION • </span><span class="kt-phrase" aria-hidden="true">NEVER STATIC • INFINITE LOOP • SYSTEMATIC MOTION • </span></div></div><div class="kt-footer"><span class="kt-meta">SWISS BRUTALISM × WEB STANDARDS</span><span class="kt-coords">FPS: 60 / SEC: AUTO</span></div></div></div>
<script>
(() => { document.querySelectorAll('.kt-root').forEach((root) => { const btn = root.querySelector('.kt-ctrl'); if (!btn) return; if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) { root.classList.add('kt-paused'); btn.setAttribute('aria-pressed', 'true'); btn.textContent = 'REDUCED MOTION'; btn.disabled = true; btn.setAttribute('aria-label', 'Animation disabled by reduced motion preference'); return; } btn.addEventListener('click', () => { const isPaused = root.classList.toggle('kt-paused'); btn.setAttribute('aria-pressed', String(isPaused)); const ind = document.createElement('span'); ind.className = 'kt-indicator'; ind.setAttribute('aria-hidden', 'true'); btn.textContent = isPaused ? 'PLAY' : 'FREEZE'; btn.prepend(ind); }); }); })();
</script>
.kt-root{--kt-bg:#f5f046;--kt-ink:#0a0a0a;--kt-red:#ff2a2a;--kt-white:#ffffff;display:flex;align-items:center;justify-content:center;min-height:380px;padding:24px 16px;background:#121212;color:var(--kt-ink);font-family:Impact,Haettenschweiler,"Arial Narrow Bold",sans-serif;box-sizing:border-box;width:100%}.kt-root *,.kt-root *::before,.kt-root *::after{box-sizing:border-box}.kt-root .kt-poster{width:100%;max-width:580px;background:var(--kt-bg);border:8px solid var(--kt-ink);border-radius:4px;padding:20px 16px;box-shadow:12px 12px 0 var(--kt-red),0 20px 40px rgba(0,0,0,0.8);overflow:hidden;position:relative}.kt-root .kt-header{display:flex;justify-content:space-between;align-items:center;border-bottom:4px solid var(--kt-ink);padding-bottom:12px;margin-bottom:18px}.kt-root .kt-stamp{font-family:monospace;font-size:12px;font-weight:900;letter-spacing:1px}.kt-root .kt-ctrl{background:var(--kt-ink);color:var(--kt-white);border:none;padding:6px 14px;border-radius:3px;font-family:monospace;font-size:11px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:6px;letter-spacing:1px}.kt-root .kt-ctrl:focus-visible{outline:2px solid var(--kt-red);outline-offset:2px}.kt-root .kt-indicator{width:7px;height:7px;border-radius:50%;background:#00ff66}.kt-root.kt-paused .kt-indicator{background:var(--kt-red)}.kt-root.kt-paused .kt-track{animation-play-state:paused}.kt-root .kt-marquee-box{overflow:hidden;white-space:nowrap;background:var(--kt-ink);color:var(--kt-white);padding:8px 0;border:3px solid var(--kt-ink);margin:8px 0}.kt-root .kt-tilt{transform:rotate(-2deg);box-shadow:0 4px 10px rgba(0,0,0,0.2)}.kt-root .kt-accent-strip{overflow:hidden;white-space:nowrap;background:var(--kt-red);color:var(--kt-white);padding:10px 0;border:3px solid var(--kt-ink);margin:8px 0;transform:rotate(1.5deg)}.kt-root .kt-track{display:inline-flex;width:max-content}.kt-root .kt-phrase{font-size:26px;letter-spacing:1.5px;text-transform:uppercase}.kt-root .kt-phrase-bold{font-size:22px;letter-spacing:2px;font-weight:900;text-transform:uppercase}.kt-root .kt-footer{display:flex;justify-content:space-between;align-items:center;border-top:4px solid var(--kt-ink);padding-top:12px;margin-top:18px;font-family:monospace;font-size:10px;font-weight:800;letter-spacing:1px}@media (max-width:440px){.kt-root .kt-phrase{font-size:20px}.kt-root .kt-phrase-bold{font-size:17px}.kt-root .kt-poster{padding:14px 10px}}@media (prefers-reduced-motion: no-preference){.kt-root .kt-track-1{animation:kt-scroll-left 14s linear infinite}.kt-root .kt-track-rev{animation:kt-scroll-right 12s linear infinite}.kt-root .kt-track-2{animation:kt-scroll-left 18s linear infinite}}@keyframes kt-scroll-left{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}@keyframes kt-scroll-right{0%{transform:translateX(-50%)}100%{transform:translateX(0)}}
@media not all and (prefers-reduced-motion: no-preference){.kt-root *{transition:none!important;animation:none!important}}
.kt-root .kt-header,.kt-root .kt-footer{gap:10px;flex-wrap:wrap}.kt-root .kt-poster{min-width:0}
import { useState, useEffect } from "react";
import "./M-027.css";
function useReducedMotion() {
const [reduced, setReduced] = useState(true);
useEffect(() => {
const media = window.matchMedia("(prefers-reduced-motion: reduce)");
const sync = () => setReduced(media.matches);
sync();
media.addEventListener("change", sync);
return () => media.removeEventListener("change", sync);
}, []);
return reduced;
}
function KineticTypographyPoster() {
const [paused, setPaused] = useState(false);
const reduced = useReducedMotion();
return <div className={"demo-stage kt-root" + (paused || reduced ? " kt-paused" : "")}><div className="kt-poster"><div className="kt-header"><span className="kt-stamp">{"MANIFESTO // 2026"}</span><button type="button" className="kt-ctrl" disabled={reduced} aria-pressed={paused || reduced} onClick={() => setPaused((value) => !value)} aria-label={reduced ? "Animation disabled by reduced motion preference" : "Toggle animation playback"}>{reduced ? "REDUCED MOTION" : paused ? "Resume" : "Pause"}</button></div><div className="kt-marquee-box kt-tilt"><div className="kt-track kt-track-1"><span className="kt-phrase">{"KINETIC CADENCE \u2022 RADICAL TYPE \u2022 UNCOMPROMISED FORM \u2022\xA0"}</span><span className="kt-phrase" aria-hidden="true">{"KINETIC CADENCE \u2022 RADICAL TYPE \u2022 UNCOMPROMISED FORM \u2022\xA0"}</span></div></div><div className="kt-accent-strip"><div className="kt-track kt-track-rev"><span className="kt-phrase-bold">{"BOLD \u2022 TENSION \u2022 EXPERIMENT \u2022 DISRUPT \u2022 EVOLVE \u2022\xA0"}</span><span className="kt-phrase-bold" aria-hidden="true">{"BOLD \u2022 TENSION \u2022 EXPERIMENT \u2022 DISRUPT \u2022 EVOLVE \u2022\xA0"}</span></div></div><div className="kt-marquee-box"><div className="kt-track kt-track-2"><span className="kt-phrase">{"NEVER STATIC \u2022 INFINITE LOOP \u2022 SYSTEMATIC MOTION \u2022\xA0"}</span><span className="kt-phrase" aria-hidden="true">{"NEVER STATIC \u2022 INFINITE LOOP \u2022 SYSTEMATIC MOTION \u2022\xA0"}</span></div></div><div className="kt-footer"><span className="kt-meta">{"SWISS BRUTALISM \xD7 WEB STANDARDS"}</span><span className="kt-coords">{"FPS: 60 / SEC: AUTO"}</span></div></div></div>;
}
export {
KineticTypographyPoster as default
};
.kt-root{--kt-bg:#f5f046;--kt-ink:#0a0a0a;--kt-red:#ff2a2a;--kt-white:#ffffff;display:flex;align-items:center;justify-content:center;min-height:380px;padding:24px 16px;background:#121212;color:var(--kt-ink);font-family:Impact,Haettenschweiler,"Arial Narrow Bold",sans-serif;box-sizing:border-box;width:100%}.kt-root *,.kt-root *::before,.kt-root *::after{box-sizing:border-box}.kt-root .kt-poster{width:100%;max-width:580px;background:var(--kt-bg);border:8px solid var(--kt-ink);border-radius:4px;padding:20px 16px;box-shadow:12px 12px 0 var(--kt-red),0 20px 40px rgba(0,0,0,0.8);overflow:hidden;position:relative}.kt-root .kt-header{display:flex;justify-content:space-between;align-items:center;border-bottom:4px solid var(--kt-ink);padding-bottom:12px;margin-bottom:18px}.kt-root .kt-stamp{font-family:monospace;font-size:12px;font-weight:900;letter-spacing:1px}.kt-root .kt-ctrl{background:var(--kt-ink);color:var(--kt-white);border:none;padding:6px 14px;border-radius:3px;font-family:monospace;font-size:11px;font-weight:700;cursor:pointer;display:flex;align-items:center;gap:6px;letter-spacing:1px}.kt-root .kt-ctrl:focus-visible{outline:2px solid var(--kt-red);outline-offset:2px}.kt-root .kt-indicator{width:7px;height:7px;border-radius:50%;background:#00ff66}.kt-root.kt-paused .kt-indicator{background:var(--kt-red)}.kt-root.kt-paused .kt-track{animation-play-state:paused}.kt-root .kt-marquee-box{overflow:hidden;white-space:nowrap;background:var(--kt-ink);color:var(--kt-white);padding:8px 0;border:3px solid var(--kt-ink);margin:8px 0}.kt-root .kt-tilt{transform:rotate(-2deg);box-shadow:0 4px 10px rgba(0,0,0,0.2)}.kt-root .kt-accent-strip{overflow:hidden;white-space:nowrap;background:var(--kt-red);color:var(--kt-white);padding:10px 0;border:3px solid var(--kt-ink);margin:8px 0;transform:rotate(1.5deg)}.kt-root .kt-track{display:inline-flex;width:max-content}.kt-root .kt-phrase{font-size:26px;letter-spacing:1.5px;text-transform:uppercase}.kt-root .kt-phrase-bold{font-size:22px;letter-spacing:2px;font-weight:900;text-transform:uppercase}.kt-root .kt-footer{display:flex;justify-content:space-between;align-items:center;border-top:4px solid var(--kt-ink);padding-top:12px;margin-top:18px;font-family:monospace;font-size:10px;font-weight:800;letter-spacing:1px}@media (max-width:440px){.kt-root .kt-phrase{font-size:20px}.kt-root .kt-phrase-bold{font-size:17px}.kt-root .kt-poster{padding:14px 10px}}@media (prefers-reduced-motion: no-preference){.kt-root .kt-track-1{animation:kt-scroll-left 14s linear infinite}.kt-root .kt-track-rev{animation:kt-scroll-right 12s linear infinite}.kt-root .kt-track-2{animation:kt-scroll-left 18s linear infinite}}@keyframes kt-scroll-left{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}@keyframes kt-scroll-right{0%{transform:translateX(-50%)}100%{transform:translateX(0)}}
@media not all and (prefers-reduced-motion: no-preference){.kt-root *{transition:none!important;animation:none!important}}
.kt-root .kt-header,.kt-root .kt-footer{gap:10px;flex-wrap:wrap}.kt-root .kt-poster{min-width:0}
仕組みとカスタマイズHow It Works & Customization
仕組みHow it works
Scoped CSS creates the visual design; small vanilla JavaScript handlers update the local demo state.
スコープ化したCSSで描画し、Vanilla JavaScriptでデモ内の状態だけを更新します。
カスタマイズ方法Customization
Change this CSS custom property to match your brand color.
CSSカスタムプロパティでブランドカラーを変更できます。
注意点Caveats
The sample content is fictional. No external assets or libraries are required. Motion follows the operating system preference. Demo labels are English; surrounding documentation supports Japanese and English.
デモ内容は架空です。外部素材・ライブラリは不要。OSの動きを減らす設定に対応します。デモ内のラベルは英語、解説は日英対応です。
よくある質問 Frequently Asked Questions
Does this demo need external libraries? 外部ライブラリは必要ですか?
The sample content is fictional. No external assets or libraries are required. Motion follows the operating system preference. Demo labels are English; surrounding documentation supports Japanese and English.
デモ内容は架空です。外部素材・ライブラリは不要。OSの動きを減らす設定に対応します。デモ内のラベルは英語、解説は日英対応です。
AIへの指示テンプレート AI Prompt Template
以下をAIに貼り付けると実装を依頼できます。 Paste the following into your AI assistant to request implementation.