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` オプションで修正できる可能性のある警告のエラー問題を解決します。

推薦する

MySQLへのJava接続の基礎となるカプセル化の詳細な説明

この記事では、Java接続MySQLの基礎となるカプセル化コードを参考までに紹介します。具体的な内容...

Docker で MySQL サービスをデプロイする方法と、遭遇する落とし穴

最近、ポーターを学んでいます。こんなに強力なものがあったなんて、今まで知らなかった気がします。クラス...

正規表現に基づくあいまい文字列置換を実装するMySQLの方法の分析

この記事では、例を使用して、MySQL を使用して正規表現に基づくあいまい文字列置換を実装する方法を...

vsftp を使用して Linux で FTP サーバーを構築する (パラメータの説明付き)

導入この章では、主に Linux で FTP サーバーを構築するプロセスを紹介します。習得すべき重要...

ミニプログラムは左スライドのドロワーメニューをネイティブに実装します

目次WXS レスポンス イベントプランAページ構造とスタイルWXS イベントコールバック関数WXS ...

MySQLが間違ったインデックスを選択する理由と解決策

MySQL では、テーブルに複数のインデックスを指定できますが、ステートメントの実行時に、使用するイ...

MYSQL メタデータ ロック (MDL ロック) の理論とロック タイプ テスト

目次MYSQL メタデータ ロック (MDL ロック) 学習理論とロック タイプ テスト1. 予備的...

Linuxでスクリーンショットを撮って編集するための最高のツール

メインのオペレーティング システムを Windows から Ubuntu に切り替えたとき、最初に考...

MySQLの指定されたテーブルからデータをエクスポートする例の詳細な説明

指定されたテーブルからデータをエクスポートするMySQLの詳細な説明必要とする: 1. テーブルはす...

Linuxターミナルでファイルを作成する2つの一般的な方法を簡単に理解する

mkdir コマンドを使用して新しいディレクトリを作成できることは誰もが知っていますが、多くの場合、...

Vue Element フロントエンドアプリケーション開発のための従来の JS 処理機能

目次1. 従来のコレクションに対するフィルター、マップ、および削減処理方法2. 再帰処理3. for...

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

Linux の非常に詳細な gcc アップグレード プロセス

目次序文1. 現在のgccバージョン2. gccをインストールする3.gmpのインストール4.MPF...

MySQL 5.7 のパフォーマンスと sys スキーマの監視パラメータの説明 (推奨)

1. パフォーマンス スキーマ: はじめにMySQL 5.7 では、多数の新しい監視項目の導入、ス...

HTML ページでギリシャ文字を使用する方法

ギリシャ文字は、特に数学や物理学などの科学技術分野で非常によく使用される記号列であり、特定の意味を持...