CSS ペイント API: CSS のような描画ボード

CSS ペイント API: CSS のような描画ボード

1. Canvas画像をCSS背景画像として使用する

CSS ペイント API は、Canvas キャンバスを通常の要素の背景画像として使用することと単純に理解できます (実際には同じではありません)。

つまり、CSS のbackground-image Canvas です。ほとんどの Canvas API を使用して、さまざまな複雑で興味深いグラフィック効果を描画し、Web ページ要素の視覚的な表現をより効率的に強化できます。たとえば、青いボタンは単なる青い背景ではなく、白い雲の効果も付いていて、すばらしいです。

2. CSSペイントAPIを理解するための簡単なケース

たとえば、透明な画像の背景を作成したいとします。次のようなものです:

完全な CSS コードと JS コードは次のとおりです。

。箱 {
    幅: 180ピクセル; 高さ: 180ピクセル;
    /* transparent-grid に名前を付ける */
    背景画像: ペイント(透明なグリッド);
}

次に、グラフィックを描画するための JS をモジュールとしてインポートする必要があります。たとえば、paint-grid.js という名前のファイルを作成し、ページにインポートします。

if (window.CSS) {
    CSS.paintWorklet.addModule('paint-grid.js');
}

paint-grid.js ファイルのコードは次のとおりです。

// transparent-grid の命名と CSS の対応 registerPaint('transparent-grid', class {
    ペイント(コンテキスト, サイズ) {
       // ここに描画コードがあります。
    }
});

上記は、CSS Paint API で使用される固定ルーチンです。

  1. CSS の paint(abc) ;
  2. JS モジュールを追加 CSS.paintWorklet.addModule('xxx.js');
  3. xxx.js 内のコード ルーチンは固定されており、以下のコメント位置に描画コードを記述するだけです。
registerPaint('abc', クラス {
    ペイント(コンテキスト、サイズ、プロパティ) {
       // 描画コードはここに記述します。
    }
});

paint(context, size)の 2 つのパラメータを簡単に紹介します。

コンテクスト

描画コンテキストの完全な名前は PaintRenderingContext2D で、Canvas の CanvasRenderingContext2D と近いものです。すべての API は Canvas からのものであり、まったく同じです。ただし、セキュリティ上の制限により、Canvas の一部の API は使用できません。使用可能な API と使用できない API を次の表に示します。

ペイント可能なAPIペイント利用不可 API
キャンバスステートキャンバス画像データ
キャンバス変換キャンバスユーザーインターフェース
キャンバス合成キャンバステキスト
キャンバス画像スムージングキャンバステキスト描画スタイル
キャンバスの塗りつぶしストロークスタイル
キャンバスシャドウスタイル
キャンバス長方形
キャンバス描画パス
キャンバス描画イメージ
キャンバスパス描画スタイル
キャンバスパス

サイズ

size 、図面のサイズを含むオブジェクトです。データ構造は次のとおりです。

{
    幅: 180,
    高さ: 180
}

sizeのサイズは、 background-sizeプロパティのサイズによって影響を受けます。したがって、繰り返しの背景の場合は、background-repeat を使用して、描画された JS コードをループせずにタイルのループを実行できます。たとえば、これから示すデモ効果も、CSS 部分では次のようにして実現できます。

。箱 {
    幅: 180ピクセル; 高さ: 180ピクセル;
    背景画像: ペイント(透明なグリッド);
    背景サイズ: 16px 16px;
}

次に、paint-grid.js で、白、灰色、灰色、白を塗りつぶすだけで、4 つのグリッドで十分であり、ループは必要ありません。プロパティを使用すると、取得した CSS プロパティとプロパティ値 (CSS 変数値を含む)、およびその他のパラメータを取得できます。

百聞は一見にしかず、こちらをクリックしてください: CSS ペイント API は背景のデモとして透明なグリッドを描画します (現在は Chrome でのみ動作します)

効果は以下のとおりです。

paint-grid.js の完全な描画コードは次のとおりです。

registerPaint('transparent-grid', クラス {
    ペイント(コンテキスト, サイズ) {
        // 2 つのグリッド カラー var color1 = '#fff', color2 = '#eee';
        // グリッドサイズ var unit = 8;
        // 水平軸をループします for (var x = 0; x < size.width; x += unit) {
            (var y = 0; y < size.height; y += 単位) {
                context.fillStyle = (x + y) % (units * 2) === 0 ? color1 : color2;
                context.fillRect(x, y, 単位, 単位);
            }
        }
    }
});

補充:
グリッドのような繰り返し背景の場合は、 background-repeatを使用してタイル状に並べてループさせることができます。描画された JS コードをループさせる必要はありませんが、描画サイズを変更するにはbackground-sizeプロパティを使用する必要があります。たとえば、上記のデモ効果は、CSS 部分では次のようにも実現できます。

。箱 {
    幅: 180ピクセル; 高さ: 180ピクセル;
    背景画像: ペイント(透明なグリッド);
    背景サイズ: 16px 16px;
}

次に、paint-grid.js で、白、灰色、灰色、白を塗りつぶすだけで、4 つのグリッドで十分であり、ループは必要ありません。

registerPaint('transparent-grid', クラス {
    ペイント(コンテキスト, サイズ) {
        // 2 つのグリッド カラー var color1 = '#fff', color2 = '#eee';
        // 2 つの白いグリッド context.fillStyle = color1;
        コンテキスト.fillRect(0, 0, 8, 8);
        コンテキスト.fillRect(8, 8, 8, 8);
        // 2 つの灰色のグリッド context.fillStyle = color1;
        コンテキスト.fillRect(0, 4, 8, 8);
        コンテキスト.fillRect(4, 0, 8, 8);
    }
});

もっと分かりやすく。

3. CSS 変数がペイント API を輝かせる

上記の例は、CSS ペイント API の基本的な使用方法を示しています。ただし、見た目は流行っていますが、CSS ペイント API の優れた機能を反映していません。

考えてみてください。JS と Canvas API を直接使用してグリッドパターンを描画し、それを Base64 に変換して、要素の背景画像として直接表示すれば、同じ効果が得られ、互換性も向上し (IE9+ をサポート)、すべての Canvas API を制限なく使用できるようになります。それに比べて、CSS ペイント API を使用する理由はまったくありません。

それは正しい!静的な背景だけが必要な場合は、キャンバスに直接描画してからBase64画像に変換する方がよいでしょう(
toDataURL() メソッド) または Blob イメージ (toBlob() メソッド)。

CSS ペイント API の利点は、CSS プロパティ値としてレンダリングがリアルタイムで行われ、ブラウザーで自動的に再描画されることです。したがって、描画が CSS 変数に関連付けられている限り、すべてのレンダリング効果がリアルタイムで更新され、再描画されます。これは素晴らしいことです。

上記の透明なグリッドの例を引き続き使用すると、次のようにグリッドの色とグリッドのサイズを CSS 変数として抽出できます。

。箱 {
    幅: 180ピクセル; 高さ: 180ピクセル;
    --color1: #fff;
    --color2: #eee;
    --ユニット: 8;
    背景: ペイント(カスタムグリッド);
}

以下のように、描画時にこれらの定義済み変数を取得できます。

registerPaint('カスタムグリッド', クラス {
    // 3つの変数を取得する static get inputProperties() {
        戻る [
            '--color1',
            '--color2',
            '--単位'
        ]
    }
    ペイント(コンテキスト、サイズ、プロパティ) {
        // 2 つのグリッド カラー var color1 = properties.get('--color1').toString();
        var color2 = properties.get('--color2').toString();
        // グリッドサイズ var unit = Number(properties.get('--units'));
        // 描画コードは前と同じです...
    }
});

静的効果は同じです:

ただし、CSS コードで定義された変数値を変更すると、ペイントの背景画像のリアルタイムの変更効果を確認できます (下の GIF を参照)。

百聞は一見にしかず。こちらをクリックしてください: CSS 変数とペイント API を使って透明なグリッドを描画するデモ

追加のタイマーは必要なく、リアルタイムレンダリング、コントロールが非常に便利です。

CSS Properties & Values API を使用すると、 --unitsなどのすべての変数を合法的な CSS プロパティとして登録できます。その後、 transitionおよびanimationプロパティを使用して、純粋な CSS でペイント背景画像の動きとアニメーションを制御でき、ボタンに浮かぶ雲の効果はまったく問題ありません。

この事例については後ほど紹介します。

Houdini、他の

この記事で紹介したCSS Paint APIはCSS Houdiniの一部であり、最後に記載されているCSS Properties & Values APIも現在ChromeでサポートされているAPIの一部です。 CSS Houdini は CSS プロパティやレイアウトなどをカスタマイズでき、その将来の可能性は無限です。

互換性の問題により、実際のプロジェクトで CSS Paint API を使用する場合は、互換性処理も行う必要があります。例:

。箱 {
    幅: 180ピクセル; 高さ: 180ピクセル;
    背景: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMElEQVQ4T2P8////fwY84P379/ikGRhHDRgWYfDu3Tu86UBQUBB/Ohg1gIFx6IcBABlfVjmYTYi7AAAAAElFTkSuQmCC);
    背景: ペイント(透明なグリッド、何でも);
}

CSS Paint API は、動的なシーンや、リアルタイムの描画とレンダリングを必要とする要件を満たすのに適しています。純粋に静的な表示であれば、JS と Canvas を直接使用して実現できます。テクノロジーのためにテクノロジーを使用する必要はありません。

CSS Houdini とそれに関連する新しいテクノロジーには、遊べるものがたくさんあります。それらについては、今後さらに詳しく紹介していきます。この記事はここで終わりです。お読みいただきありがとうございました!

参照ドキュメント

https://www.w3.org/TR/css-paint-api-1/https://css-houdini.rocks/

最後に、皆さんが興味を持つかもしれない別のことについてお話ししたいと思います。この記事の透明なグリッド効果を実現する最良の方法は、線形グラデーションと CSS3 の複数の背景を使用して、CSS backgroundを直接描画することです。

コードは次のとおりです。

。箱 {
    幅: 180ピクセル; 高さ: 180ピクセル;
    背景色: #fff;
    背景画像: linear-gradient(45deg, #eee 25%, 透明 25%, 透明 75%, #eee 75%, #eee), linear-gradient(45deg, #eee 25%, 透明 25%, 透明 75%, #eee 75%, #eee);
    背景サイズ: 16px 16px;
    背景位置: 0 0, 8px 8px;
}

リアルタイム効果は以下のとおりです。

サイズコントロールは非常に便利で、 animationも自然にサポートします。

この記事はオリジナル記事であり、知識ポイントは頻繁に更新され、いくつかのエラーは修正されます。したがって、トレースしやすく、古くて誤った知識に惑わされることを避け、より良い読書体験を得るために、転載するときは元のソースを維持してください。
この記事のアドレス: https://www.zhangxinxu.com/wordpress/?p=8204

CSS 界の描画ボードである CSS Paint API に関するこの記事はこれで終わりです。CSS Paint API に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

<<:  MySQLデータベース移行におけるデータ文字化けの問題を解決する

>>:  Vue プロジェクトを実行するときに `--fix` オプションで修正できる可能性のある警告のエラー問題を解決します。

推薦する

XHTML 入門チュートリアル: XHTML タグ

XHTML タグの紹介<br />おそらく、前のセクションで、XHTML ファイルと通常...

アリババの中秋節ロゴとウェブサイトのデザインプロセス

<br />まずアイデアを考え、次にスケッチを描き、次にマウスでスケッチし、最後にフラッ...

Vue フロントエンドと Django バックエンドを使用して、一定期間内のデータをクエリする方法

序文開発プロセスでは、すべてのデータではなく特定の期間内のデータをクエリするなど、クエリのフィルタリ...

CSSを使用してアダプティブスクエアを実装する方法の例

伝統的な方法は、正方形を固定形式で書くことです。長さ=幅を直接書き、次のように固定値を書きます。 。...

DockerでSpringbootプロジェクトを実行する方法

1. IDEAの下にあるターミナルをクリックし、mvn clean installと入力します。 次...

Nginx の起動に失敗した場合のいくつかのエラー処理の詳細な説明

Nginx を Web サーバーとして使用する際に、次の問題が発生しました。 1. nginxの起動...

Docker に ElasticSearch 6.x をインストールする詳細なチュートリアル

まず、イメージをプルします(またはコンテナを作成するだけで、自然にプルされます)。 docker p...

Vuexの役割についての深い理解

目次概要コンポーネント間でデータを共有する方法Vuex の原則の紹介Vuexはコンポーネントのグロー...

MySQL トランザクション分離レベルの詳細

serializableシリアル化(問題なし)トランザクションは順次実行する必要があります。前のトラ...

IdeaでTomcatを起動したときに複数のリスナーが報告される問題を解決する

エラーのスクリーンショット例外が発生した場所が見つかりません。解決策: リソースディレクトリにlog...

MySQL 一時テーブルの簡単な使用法

MySQL 一時テーブルは、一時的なデータを保存する必要がある場合に非常に便利です。一時テーブルは現...

MySQLの分離レベルとロックメカニズムの詳細な説明

目次簡単な説明: 1. 取引の4つの特徴2. 複数の同時トランザクションによって発生する問題3. ト...

MySQLでデータをエクスポートするいくつかの方法の詳細な説明

MySQL データをエクスポートする目的は、データベースのバックアップ、テーブル構造のエクスポート、...

mysql order by in の文字順序の詳細な説明 (推奨)

//MySQL ステートメント SELECT * FROM `MyTable` WHERE `id...

JS WebSocket 切断理由とハートビートの仕組みの詳しい説明

1. 切断理由WebSocket が切断される理由は多数あります。WebSocket が切断されたと...