js キャンバスはスライダー検証を実現します

js キャンバスはスライダー検証を実現します

この記事の例では、スライダー検証を実装するためのjsキャンバスの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

スライダー検証

さっそく、コードを投稿します。使いたい友達は直接使ってください。理解したいなら、後で私の考えをお伝えします。

<テンプレート>
 <div class="sliderContent">
 <div class="imgDev" :style="'width:' + width + 'px;'">
 <canvas :id="id" :width="幅" :height="高さ"></canvas>
 <キャンバス
 クラス="スライダー"
 :id="id + 'スライダーブロック'"
 :width="幅"
 :height="高さ"
 :style="'lef​​t:' + sliderLeft + 'px;'"
 </キャンバス>
 </div>
 <div class="moveSLider" :style="'width:' + width + 'px'">
 <div class="react" @mousedown.stop="moveBall($event)">
 <div
 クラス="元"
 :style="'lef​​t:' + (sliderLeft + 10) + 'px;'"
 </div>
 </div>
 </div>
 </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
 データ() {
 戻る {
 width: 200, //ボックスの幅 height: 200, //ボックスの高さ。このパラメータは、画像の元の比率が設定されている場合は機能しません。 id: new Date().getTime(),
 r: 9, //半円の半径 w: 40, //スライダーの幅 imgOriginalScale: true, //画像が元のスケールを表示するかどうか sliderLeft: 0, //スライダーの初期位置 rangeValue:4, //スライダーがどの範囲にあるときに正しいとみなされるか imgsrc:require("../assets/img/ver-2.png") //必要な背景画像を導入する };
 },
 マウント() {
 これを初期化します。
 },
 メソッド: {
 初期化() {
 イメージをロードします。
 },
 loadImage(){//画像を読み込む let mainDom = document.getElementById(this.id);
 bg = mainDom.getContext("2d"); とします。
 blockDom = document.getElementById(this.id + "sliderBlock");
 ブロックをblockDom.getContext("2d");
 imgsrc = this.imgsrc; とします。
 img = document.createElement("img"); とします。
 img.style.objectFit = "スケールダウン";
 :::no-loc(img_src):::
 img.onload = () => {
 if (this.imgOriginalScale) {
 // 画像のサイズ変更に基づいて画像の元の比率を計算します mainDom.height = (img.height / img.width) * mainDom.width;
 blockDom.height = (img.height / img.width) * blockDom.width;
 }
 bg.drawImage(img, 0, 0, mainDom.width, mainDom.height);
 this.drawBlock(bg, mainDom.width, mainDom.height, "fill"); // スライダー部分を描画します this.drawBlock(block, blockDom.width, blockDom.height, "clip", img); // スライダー部分を描画します 最初にクリップしてから画像を描画する必要があることに注意してください (ここで画像を渡さないと、画像を制御する方法がありません)
 };
 },
 drawBlock(ctx, width, height, type, img) { //これは、影の部分を描画し、パズルの形状を切り抜くことができる 2 in 1 関数です。let { w, r, sliderLeft } = this;
 //ここは乱数を使っていて、表示位置が毎回違う var x = this.random(30, width - w - r - 1); //ここで最大値にしているのはスライダーが隠れないようにするためなので、スライダーの幅を減算します。半円があるので、半円の位置を減算します var y = this.random(10, height - w - r - 1);
 if (type == "clip"){//ここでは、両方のオブジェクトの y 値が同じであることを確認する必要があります x = sliderLeft;
 y = this.y;
 } それ以外 {
 this.x = x;
 y = y;
 }
 PI = Math.PIとします。
 // 描画 ctx.beginPath();
 //左
 ctx.moveTo(x, y);
 //トップ
 ctx.arc(x + (w + 5) / 2, y, r, -PI, 0, true);
 ctx.lineTo(x + w + 5, y);
 //右
 ctx.arc(x + w + 5, y + w / 2, r, 1.5 * PI, 0.5 * PI, false);
 ctx.lineTo(x + w + 5, y + w);
 //底
 ctx.arc(x + (w + 5) / 2, y + w, r, 0, PI, false);
 ctx.lineTo(x, y + w);
 ctx.arc(x, y + w / 2, r, 0.5 * PI, 1.5 * PI, true);
 ctx.lineTo(x, y);
 if (type == "クリップ") {
 ctx.shadowBlur = 10;
 ctx.shadowColor = "黒";
 }
 ctx.lineWidth = 1;
 ctx.fillStyle = "rgba(0, 0, 0, 0.4)"; //背景色を設定します ctx.stroke();
 ctx[タイプ]();
 もし(画像){
 ctx.drawImage(img, -this.x, 0, 幅, 高さ);
 }
 ctx.globalCompositeOperation = "xor";
 },
 ランダム(最小, 最大) {
 parseInt(Math.floor(Math.random() * (max - min)) + min); を返します。
 },
 moveBall(e){//小さな赤いボールをクリックするとき var oldx = e.pageX;
 document.onmousemove = (e) =>{//ここでドキュメント オブジェクトをバインドする必要があります。そうしないと、ドキュメント オブジェクトを離れたときに移動しません。var x = e.pageX;
 if(this.sliderLeft+x-oldx<=0){//ここで左の境界を判断します this.sliderLeft = 0;
 }else if(this.sliderLeft+x-oldx>=this.width-this.r*2-this.w){//ここで右の境界を判断します this.sliderLeft = this.width-this.r*2-this.w;
 }それ以外{
 this.sliderLeft += x - oldx;
 }
 古いx = x;
 };
 this.laveBall();
 },
 laveBall(){//マウスを離したときに状態をクリアする document.onmouseup = ()=> {
 ドキュメント.onmousemove = null;
 if(this.sliderLeft<(this.x+this.rangeValue)&&this.sliderLeft>(this.x-this.rangeValue)){
 console.log("おめでとうございます、成功しました")
 }else{// 選択されていない場合はスライダーの位置をリセットします this.sliderLeft = 0;
 }
 };
 },
 },
};
</スクリプト>
<style lang="scss" スコープ>
.moveSLider {
 位置: 相対的;
 マージン: 0 自動;
 高さ: 50px;
 .react {
 。元
 位置: 絶対;
 左: 0;
 上位: 50%;
 変換: translate(0, -50%);
 幅: 30ピクセル;
 高さ: 30px;
 背景色: 赤;
 境界線の半径: 50%;
 カーソル: ポインタ;
 }
 位置: 絶対;
 左: 0;
 上位: 50%;
 変換: translate(0, -50%);
 幅: 100%;
 高さ: 20px;
 背景色: ローズブラウン;
 }
}
.imgDev {
 位置: 相対的;
 マージン: 0 自動;
 .スライダー{
 位置: 絶対;
 左: 0;
 上: 0;
 背景色: 透明;
 }
}
</スタイル>

ここで私が遭遇した困難をまとめます

1. 最初は、このパズルの形をどのように描いたらよいか分かりませんでした。その後、Baidu で、実はとても簡単だと知りました。半円と線をつなぎ合わせてできた形が、パズルの形です。

2. パズルのピースを 1 つだけ画像に表示するにはどうすればよいでしょうか。これも非常に簡単です。ctx.clip() 関数を使用して実現できます。ここで注意すべき点は、まずトリミングしてから画像をキャンバスに読み込む必要があることです。そうしないと、トリミングできません。

キーコード

drawBlock(ctx, width, height, type, img) { //影部分の描画とパズルの形状の切り抜きができる2in1関数です。let { w, r, sliderLeft } = this; //wは幅、rは円の半径です。sliderLeftはスライダーの初期位置です。//ここは乱数を使っていて表示位置は毎回違います。var x = this.random(30, width - w - r - 1); //ここで最大値にしているのはスライダーが隠れないようにするためなのでスライダーの幅を減算する必要があります。半円があるので半円の位置を減算する必要があります。var y = this.random(10, height - w - r - 1);
 if (type == "clip"){//ここでは、両方のオブジェクトの y 値が同じであることを確認する必要があります x = sliderLeft;
 y = this.y;
 } それ以外 {
 this.x = x;
 y = y;
 }
 PI = Math.PIとします。
 // 描画 ctx.beginPath();
 //左
 ctx.moveTo(x, y);
 //トップ
 ctx.arc(x + (w + 5) / 2, y, r, -PI, 0, true);
 ctx.lineTo(x + w + 5, y);
 //右
 ctx.arc(x + w + 5, y + w / 2, r, 1.5 * PI, 0.5 * PI, false);
 ctx.lineTo(x + w + 5, y + w);
 //底
 ctx.arc(x + (w + 5) / 2, y + w, r, 0, PI, false);
 ctx.lineTo(x, y + w);
 ctx.arc(x, y + w / 2, r, 0.5 * PI, 1.5 * PI, true);
 ctx.lineTo(x, y);
 if (type == "クリップ") {
 ctx.shadowBlur = 10;
 ctx.shadowColor = "黒";
 }
 ctx.lineWidth = 1;
 ctx.fillStyle = "rgba(0, 0, 0, 0.4)"; //背景色を設定します ctx.stroke();
 ctx[タイプ]();
 if (img){//なぜここで画像を読み込む必要があるのでしょうか? 高さは動的であり、配置する前に計算する必要があるためです。//もう 1 つの理由は、読み込む前に画像をトリミングする必要があることです。ctx.drawImage(img, -this.x, 0, width, height);
 }
},

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JSはドラッグスライダー検証を実装します
  • JavaScript スライダー検証ケース
  • スライダー検証コードを実装するJavaScript
  • ログインスライダー検証を実装するJavaScript
  • JavaScript でドラッグ スライダー パズルの検証機能を実装します (html5、canvas)
  • js はログインを確認するためのスライダーを実装します
  • ネイティブ JS カプセル化ドラッグ検証スライダー実装コード例
  • iQiyi スライダー暗号化の JS リバースエンジニアリングの実装

<<:  Baidu の https 認証プロンプト「http サイトを 301 から https サイトにリダイレクトしてください」の解決方法の詳細な説明

>>:  Windows2008 64 ビット システムでの MySQL 5.7 グリーン バージョンのインストール チュートリアル

推薦する

Centos7.3 での mysql5.7 のインストールと設定のチュートリアル

この記事では、MySQL 5.7のインストールと設定のチュートリアルを参考までに紹介します。具体的な...

CentOS 7 に PHP5 用の suPHP をインストールする方法 (Peng Ge)

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

CSS クロスフェード() を使用して半透明の背景画像効果を実現するサンプルコード

1. 要件の説明特定の要素については、背景background-imageを半透明にしたいが、テキス...

デザイン理論:計画、リソース、コミュニケーションの問題について

<br />多くの中小企業ではこの問題は発生しません。中小企業はデザイナーをサポートし、...

MySQL 最適化のヒント: 重複削除の実装方法の分析 [数百万のデータ]

この記事では、MySQL 最適化のヒントで重複したエントリを削除する方法を例を使って説明します。ご参...

MySQLデータベース操作の基本コマンド

1. データベースを作成します。 データ data _name を作成します。 PHP でデータベー...

Navicat PremiumでSQLファイルをインポートする方法

今日、最終プロジェクトに取り組み始めましたが、今年はMySQLデータベースを使用したため、Navic...

MySQL 8.0 アトミック DDL 構文の詳細な説明

目次01 アトミックDDLの紹介02 一部のDDL操作の実行動作の変更03 DDL 操作のログを表示...

MySQL 8.0.18 はクローンプラグインを使用して MGR 実装を再構築します

3 ノード MGR 内の 1 つのノードに異常があり、MGR クラスターに再度追加する必要があるとし...

Vue プロジェクトでのスキャンコード決済の実装例 (デモ付き)

目次需要背景思考分析UI 表示始める1. 支払いコンポーネントテンプレートを作成する2. 支払いコン...

Kubernetes (k8s) 入門

Kubernetes は面白そうだったので(ギリシャ人なら名前に問題があると思うでしょうが)、ずっと...

Nginx ローカル ディレクトリ マッピング実装コード例

他のデバイスの画像をローカルディレクトリにマウントするなど、サーバー上の静的リソースにアクセスする必...

VueにExcelテーブルプラグインを導入する方法

この記事では、Excelテーブルプラグインを導入するVueの具体的なコードを参考までに共有します。具...

デザイン: 意志の強いデザイナー

<br />長年の専門的なアートデザイン教育を通じて「美とは何か」を学びましたが、「美を...