キャンバスでPS消しゴムスクラッチカードの効果を実現するためのJSの使用方法の詳細な説明

キャンバスでPS消しゴムスクラッチカードの効果を実現するためのJSの使用方法の詳細な説明

効果のデモンストレーション:

メインJSコード実装

 <div class="box" id="bb">
        <canvas id="cas" width="1366" height="651"></canvas>
    </div>
 
    <script type="text/javascript" charset="utf-8">
        var キャンバス = document.getElementById("cas"),
            ctx = キャンバス.getContext("2d");
        var x1, y1, a = 30,
            タイムアウト、totimes = 100、
            江下 = 30;
        キャンバスの幅 = document.getElementById("bb").clientWidth;
        キャンバスの高さ = document.getElementById("bb").clientHeight;
        var img = 新しい画像();
        画像を拡大
        img.onload = 関数() {
            ctx.drawImage(画像, 0, 0, キャンバス.幅, キャンバス.高さ)
            //ctx.fillRect(0,0,キャンバス.幅,キャンバス)
            タップクリップ()
        }
 
        //globalCompositeOperation関数tapClip()を変更して消去効果を実現します。
            var hastouch = "ontouchstart" in window ? true : false,
                tapstart = hastouch ? "touchstart" : "mousedown",
                tapmove = hastouch ? "touchmove" : "mousemove",
                tapend = hastouch ? "touchend" : "mouseup";
 
            ctx.lineCap = "丸い";
            ctx.lineJoin = "丸め";
            ctx.lineWidth = a * 2;
            ctx.globalCompositeOperation = "destination-out";
 
            canvas.addEventListener(tapstart, 関数(e) {
                clearTimeout(タイムアウト)
                e.preventDefault();
 
                x1 = hastouch ? e.targetTouches[0].pageX : e.clientX - canvas.offsetLeft;
                y1 = hastouch ? e.targetTouches[0].pageY : e.clientY - canvas.offsetTop;
 
                ctx.save();
                ctx.beginPath()
                ctx.arc(x1, y1, 1, 0, 2 * Math.PI);
                ctx.fill();
                ctx.restore();
 
                キャンバスにイベントリスナーを追加します。
                canvas.addEventListener(tapend, 関数() {
                    キャンバスのtapmoveイベントリスナーを削除します。
 
                    タイムアウト = setTimeout(関数() {
                        var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
                        var dd = 0;
                        (var x = 0; x < imgData.width; x += jiange) {
                            (var y = 0; y < imgData.height; y += jiange) {
                                var i = (y * imgData.width + x) * 4;
                                (imgData.data[i + 3] > 0)の場合{
                                    dd++
                                }
                            }
                        }
                        (dd / (imgData.width * imgData.height / (jiange * jiange))< 0.4)の場合{
                            キャンバス.className = "noOp";
                        }
                    }, トゥタイムズ)
                });
 
           
                キャンバスにイベントリスナーを追加します。
                canvas.addEventListener(tapend, 関数() {
                    キャンバスのtapmoveイベントリスナーを削除します。
 
                    タイムアウト = setTimeout(関数() {
                        var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
                        var dd = 0;
                        (var x = 0; x < imgData.width; x += jiange) {
                            (var y = 0; y < imgData.height; y += jiange) {
                                var i = (y * imgData.width + x) * 4;
                                (imgData.data[i + 3] > 0)の場合{
                                    dd++
                                }
                            }
                        }
 
                    }, トゥタイムズ)
 
                });
 
            
        }
    </スクリプト>
    <script type="text/javascript">
        ウィンドウ.setTimeout('CountDown()', 100);
        // 終わり
    </スクリプト>

上記は、JS を使用してキャンバスを PS 消しゴム スクラッチ カードに似せる効果を実現する方法の詳細な内容です。JS の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • js キャンバスは消しゴム効果を実現します
  • スクラッチ宝くじの例を実現する JavaScript キャンバス

<<:  MySQL クエリ キャッシュのグラフィカルな説明

>>:  HTMLテキストボックス(テキスト)は、読み取り専用を実現するために複数の方法で利用できません

推薦する

CSSでフレックス配置を表示する(レイアウトツール)

display: flex レイアウトに関しては、深く理解している人もいますし、私も他の人の作業か...

Ubuntu で中国語入力方法が使えない場合の解決策

Ubuntu では中国語入力方法の解決策はありません。仮想マシンや Ubuntu システムをインスト...

ReactでのsetStateの使用と同期と非同期の使用

React では、this.state を使用して状態を直接変更しても、コンポーネントは再レンダリン...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

GTK ツリービューの原理と使用法の分析

GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...

Linux システムで .sh ファイルを実行する方法

Linux システムで .sh ファイルを実行する方法は 2 つあります。たとえば、ルート ディレク...

WeChatミニプログラム開発のためのコンポーネント設計仕様

WeChat ミニプログラム コンポーネント設計仕様コンポーネントベースの開発という考え方は、私の開...

dockerでpdflatex環境を設定する方法

技術的背景Latex は文書作成、特に記事作成には欠かせないツールであり、必須のテキスト組版ツールで...

js の Array.forEach でループを終了する方法の例

目次forEach() メソッドjs の Array.forEach のループから抜け出す方法解決:...

フロントエンドインタビューに必要なホモロジーとクロスドメインの詳細な説明

序文ご存知のとおり、ブラウザの相同性戦略とクロスドメイン方式も、フロントエンド面接で頻繁に遭遇する問...

MySQL自動シャットダウン問題への対処の実践記録

最近、あるプロジェクトを手伝ったのですが、MySQL マシンがしばらくすると自動的に停止し続けました...

Vue コンポーネント ライブラリ ElementUI はテーブル読み込みツリー データのチュートリアルを実装します

ElementUIは、参考のためにテーブルツリーリストの読み込みチュートリアルを実装しています。具体...

MySQL ユーザーのホスト属性を素早く変更する方法

MySQL にリモートでログインする場合、使用するアカウントには特別な要件があります。アカウントのデ...

CSSはフロートをシミュレートして、画像の左右を囲む中央テキストの効果を実現します。

画像の周囲にテキストを折り返すとは何ですか?これは次の図の効果です。 エフェクトのCSSコードはここ...