Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HTML-in-Canvasで作る未来のWeb UI表現

HTML-in-Canvasで作る未来のWeb UI表現

フロントエンドカンファレンス関西2026の発表資料。
https://2026.frontend-conf.osaka.jp/

■概要
HTML-in-Canvasという新しいAPIをオリジナルのデモで解説。
HTML・CSSから見た利点、Canvasタグから見た利点を掘り下げます。

派手な演出だけでなく、ウェブ開発でも役立つ場面を紹介。

■動画配信
YouTubeで発表(再収録)を公開しました。
本スライドはデモが多いので、Speker DeckではなくYouTubeでの視聴をオススメします。
https://www.youtube.com/watch?v=CRnSDIaGvxY

Avatar for IKEDA Yasunobu

IKEDA Yasunobu

October 12, 2026

More Decks by IKEDA Yasunobu

Other Decks in Programming

Transcript

  1. HTML-in-Canvasとは HTML・CSS Canvas <article> <img src="P3324910.jxl"> <div> <h1> </h1> <button>

    </button> </div> </article> セーヌ川の夜景 もっと見る article { display: flex; } img { width: 200px; } ブラウザーがレイアウト 見た目を 取り込む セーヌ川の夜景 もっと見る HTMLの見た目をCanvasへ
  2. “今年もっとも予想外で驚かされた 機能は……HTML-in-Canvas!” Chris Coyier CSS-Tricks創設者 New Things You Should Know

    About HTML Here in Mid 2026(2026年9月2日公開) Master.dev / https://blog.master.dev/new-things-you-should-know-about-html-here-in-mid-2026/
  3. “Webでできることが大きく変わる、 めったにない瞬間のひとつです。” Una Kravets Google Chrome / UI & Tooling

    DevRel Lead What's new in Web UI(Google I/O 2026)(2026年5月22日公開) Chrome for Developers / https://www.youtube.com/watch?v=uT7MVcCQ4rw&t=2093s
  4. Canvasでのテキスト描画は貧弱 ctx.font = 'bold 56px "Noto Sans JP Variable"'; ctx.fillText(

    " ); 吾輩は猫である。名前はまだ無い。どこで生れたか見当がつかぬ。", 24, 88 このコードの描画結果 折り返しができない
  5. HTMLとCSSを使った文字組 適用するCSS .description { /* CSS */ } 未指定 CSSの適用結果

    HTMLとCSSで2026年の Web UIを作る。文字や画 像をCanvasに取り込み、 エフェクトを適用。 右端で自動的に折り返せる
  6. HTMLとCSSを使った文字組 適用するCSS .description { /* */ font-feature-settings: "palt" 1; }

    文字詰め CSSの適用結果 HTMLとCSSで2026年の Web UIを作る。文字や画像 をCanvasに取り込み、エフ ェクトを適用。 字間を詰められる
  7. HTMLとCSSを使った文字組 適用するCSS .description { /* */ font-feature-settings: "palt" 1; /*

    */ line-break: strict; } 文字詰め 厳密な禁則処理 CSSの適用結果 HTMLとCSSで2026年の Web UIを作る。文字や画像 をCanvasに取り込み、エ フェクトを適用。 小さい仮名を行頭に置かない
  8. HTMLとCSSを使った文字組 適用するCSS .description { /* */ font-feature-settings: "palt" 1; /*

    */ line-break: strict; /* */ word-break: auto-phrase; } 文字詰め 厳密な禁則処理 文節で折り返す CSSの適用結果 HTMLとCSSで2026年の Web UIを作る。文字や 画像をCanvasに取り込み、 エフェクトを適用。 助詞などの後ろで折り返し
  9. HTMLとCSSを使った文字組 適用するCSS .description { /* */ font-feature-settings: "palt" 1; /*

    */ line-break: strict; /* */ word-break: auto-phrase; /* */ text-autospace: normal; } 文字詰め 厳密な禁則処理 文節で折り返す 日本語と英語の間に余白 CSSの適用結果 HTMLとCSSで2026年の Web UIを作る。文字や 画像をCanvasに取り込み、 エフェクトを適用。 日本語と英語の間に余白
  10. Canvasタグの中にHTMLフォーム <canvas content="drawable"> <form drawable> <label for="name"> 名前 </label> <input

    id="name"> <button> </button> </form> </canvas> 送信 デモを開く 別タブで開く
  11. Canvas 2Dの実装手順 1 HTMLの準備 2 Canvasへ描画 イベント <canvas content="drawable"> paint

    <div drawable> Canvasに描くカード Canvasの子要素としてHTMLを配置 drawElementImage() HTMLの更新通知を受け取り描き直す Canvas 2Dのクリック位置は、ブラウザーが自動で同期
  12. HTML の子要素をレイアウト <!-- Canvas --> <canvas id="canvas" width="280" height="200" content="drawable">

    を付けた要素を描画対象にする --> に描くカード クリック <!-- drawable <div id="card" drawable> <p>Canvas </p> <button> 0</button> </div> </canvas> ブラウザーの表示結果
  13. JavaScript const canvas = document.querySelector("#canvas"); const card = document.querySelector("#card"); const

    ctx = canvas.getContext("2d"); ブラウザーから イベントを受け取り描画 // paint canvas.addEventListener("paint", () => { ctx.reset(); ctx.drawElementImage(card, 0, 0); }); canvas.requestPaint(); ブラウザーの表示結果 Canvasに描くカード クリック 0
  14. JavaScript const canvas = document.querySelector("#canvas"); const card = document.querySelector("#card"); const

    ctx = canvas.getContext("2d"); ブラウザーから イベントを受け取り描画 // paint canvas.addEventListener("paint", () => { ctx.reset(); 右へ 、下へ40移動 ctx.translate(100, 40); // 100 ctx.drawElementImage(card, 0, 0); }); canvas.requestPaint(); ブラウザーの表示結果 Canvasに描くカード クリック 0
  15. JavaScript const canvas = document.querySelector("#canvas"); const card = document.querySelector("#card"); const

    ctx = canvas.getContext("2d"); ブラウザーから イベントを受け取り描画 // paint canvas.addEventListener("paint", () => { ctx.reset(); 右へ 、下へ40移動 時計回りに15°回転 ctx.translate(100, 40); // 100 ctx.rotate(Math.PI / 12); // ctx.drawElementImage(card, 0, 0); }); canvas.requestPaint(); ブラウザーの表示結果 Canvasに 描くカ クリック 0 Canvas 2Dでは ヒットエリアも自動同期 ード
  16. CSSの日本語組版をPNGへ .card { /* */ font-feature-settings: "palt"; text-autospace: normal; line-break:

    strict; word-break: auto-phrase; overflow-wrap: anywhere; 日本語の文字組・英語との間隔 文字幅と上下の余白 } /* */ text-fit: shrink; .card__title { white-space: nowrap; text-box: trim-both text; } 出力したPNG
  17. 比較項目 CSSの文字組 HTMLの更新 Webフォント 外部画像 入力・文字選択 SVGの<foreignObject> SVG画像 → Canvas

    SVG内のHTMLにCSSを指定 SVG画像を作り直す 外部URLからは読み込み不可 外部URLのままでは表示不可 不可 HTML-in-Canvas ページのCSSを利用 paintイベントで更新 ページのフォントを利用 HTML内の画像を利用 可能 マシンリーダブル SVG化のオーバーヘッドなし
  18. Canvasタグの歴史 2004 brush Canvas 2D 2011 view_in_ar WebGL 2018 memory

    OffscreenCanvas 2023 developer_board WebGPU 2026 html HTML-in-Canvas WebKitにCanvas要素を導入 WebGL 1.0仕様公開。GPUで3D描画 Worker側で描画可能に GPUで描画・計算 HTML・CSSのレイアウトをCanvasへ Canvas 2D・WebGL・WebGPUで利用