JavaScript でドラッグ スライダー パズルの検証機能を実装します (html5、canvas)

JavaScript でドラッグ スライダー パズルの検証機能を実装します (html5、canvas)

導入:

スライダー ドラッグ検証は現在、多くの場所で使用されています。週末に 1 つ作成しようと思い、誰かが使用できるかどうかを確認するためにここに掲載しました。 効果:

実装のアイデア:

キャンバスを使用してソース イメージを描画し、塗りつぶされた四角形を描画して、不足している効果を実現します (四角形の座標はランダムです)。

別のキャンバスを使用してドラッグ ブロックを描画し、drawImage を使用して、前の手順の正方形領域と同じ座標とサイズの元のイメージをキャプチャします。これが検証イメージとして使用され、検証イメージは左端に配置されます。

ドラッグ ブロックでマウスを押してからドラッグすると、ドラッグ ブロックと検証グラフがマウスとともに移動し、一定の範囲に達したらマウスを放すと検証が実行されます。

検証が成功すると、「検証が成功しました」というメッセージが表示されます。検証が成功しなかった場合は、ドラッグしたブロックと検証図が左端に戻ります。

3 つのコンストラクタ イメージ コンストラクタ

//画像オブジェクト ImageDraw コンストラクタ関数 ImageDraw(o,obj){
		this.id=''、
		this.image=0, //画像オブジェクト(必須)
		this.sx=0, //画像スライスの開始x位置(画像全体を表示する場合は必要ありません)
		this.sy=0, //画像スライスの開始y位置(画像全体を表示する場合は必要ありません)
		this.sWidth=0, //画像スライスの開始幅(画像全体を表示する場合は入力する必要はありません)
		this.sHeight=0, //画像スライスの開始高さ(画像全体を表示する場合は入力する必要はありません)
		this.dx=0, //画像ターゲットのx位置(必須)
		this.dy=0, //画像ターゲットのy位置(必須)
		this.dWidth=0, //画像ターゲットの表示幅(幅が拡大縮小されていない場合は入力する必要はありません)
		this.dHeight=0 //画像のターゲットの高さ(高さが拡大縮小されない場合は入力する必要はありません)
		
		これをinit(o,obj);
	}
	ImageDraw.prototype.init=関数(o,obj){
		for(var key in o){
			this[キー]=o[キー];
		}
		これを返します。
	}
	ImageDraw.prototype.render=関数(コンテキスト){
		描画(コンテキスト、これ);
		関数draw(コンテキスト,obj) {
			var ctx =コンテキスト;
			ctx.save();
			
			if(!obj.image || getType(obj.dx)=='undefined' || getType(obj.dy)=='undefined'){
				throw new Error("画像を描画するためのパラメータが見つかりません");	
				戻る;
			} 
			ctx.translate(obj.dx,obj.dy);
			if(getType(obj.sx)!='undefined' && getType(obj.sy)!='undefined' && obj.sWidth && obj.sHeight && obj.dWidth && obj.dHeight){
				// 表示時に画像を切り取って拡大縮小します ctx.drawImage(obj.image, obj.sx, obj.sy, obj.sWidth, obj.sHeight, 0, 0, obj.dWidth, obj.dHeight);
			}それ以外の場合(obj.dWidth && obj.dHeight){
				ctx.drawImage(obj.image, 0, 0, obj.dWidth, obj.dHeight); // 元の画像、表示時に拡大縮小されます }else{
				ctx.drawImage(obj.image,0, 0); // 元の画像、表示時にスケーリングなし }
			ctx.restore();
		}
	}
	ImageDraw.prototype.isPoint=関数(pos){
		//マウス位置の x と y はそれぞれ dx と dy より大きく、x と y はそれぞれ dx+dWidth と dy+dHeight より小さくなければなりません
		if(pos.x>this.dx && pos.y>this.dy && pos.x<this.dx+this.dWidth && pos.y<this.dy+this.dHeight ){//現在の画像オブジェクトの範囲内であることを示します。true を返します。
		}
		false を返します。
	}

スクエアコンストラクター

関数 Rect(o){
		this.x=0,​​//x座標 this.y=0,//y座標 this.width=100,//幅 this.height=40,//高さ this.thin=true,//細い線		
		これをinit(o);
	}
	
	Rect.prototype.init = 関数 (o) {
		for(var key in o){
			this[キー]=o[キー];
		}
	}
	Rect.prototype.render = 関数 (コンテキスト) {
		this.ctx=コンテキスト;
		innerRender(これを);
			
		関数innerRender(obj){
			var ctx = obj.ctx;
			ctx.save()
			ctx.beginPath();
			ctx.translate(obj.x,obj.y);
			
			if(obj.lineWidth){
				ctx.lineWidth = obj.lineWidth;
			}
			if(obj.thin){
				ctx.translate(0.5,0.5);
			}
			ctx.rect(0,0,obj.width,obj.height);
			if(obj.fill){//塗りつぶされていますか? obj.fillStyle?(ctx.fillStyle=obj.fillStyle):null;
				ctx.fill();
			}
			if(obj.stroke){//ストロークするかどうか obj.strokeStyle?(ctx.strokeStyle=obj.strokeStyle):null;
				ctx.stroke();
			}	
		 	ctx.restore();
		}
	 	これを返します。
	}

テキストコンストラクタ

関数 Text(o){
		this.x=0,​​//x座標 this.y=0,//y座標 this.text='',//コンテンツ this.font=null;//フォント this.textAlign=null;//配置		
		これをinit(o);
	}
	
	Text.prototype.init=function(o){
		for(var key in o){
			this[キー]=o[キー];
		}
	}
	Text.prototype.render=function(context){
		this.ctx=コンテキスト;
		innerRender(これを);
			
		関数innerRender(obj){
			var ctx = obj.ctx;
			ctx.save()
			ctx.beginPath();
			ctx.translate(obj.x,obj.y);
			
			フォントサイズは、
				ctx.font=obj.font;
			}
			(obj.textAlign)の場合{
				ctx.textAlign=obj.textAlign;
			}
			if(obj.fill){//塗りつぶされていますか? obj.fillStyle?(ctx.fillStyle=obj.fillStyle):null;
				ctx.fillText(obj.text,0,0);
			}
		 	ctx.restore();
		}
	 	これを返します。
	}

ソースグラフと不足しているブロックを描画する

var img = new ImageDraw({image:this.imgObj[0],dx:0, dy:0 ,dWidth:640,dHeight:360},this);
		this.renderArr.push(画像);
 
var x = _.getRandom (100, 580); // x は 100 ~ 580 の間 var y = _.getRandom (0, 300); // y は 0 ~ 300 の間		
		this.validPos={x:x,y:y};
		//不足しているブロックを描画する var rect = new Rect({
			x:x、
			y:y、
			幅:60,
			高さ:60,
			塗りつぶし:true、
			塗りつぶしスタイル: 'グレー'
		})
		this.renderArr.push(rect);
		
		//検証ブロックストリップを描画する var rect = new Rect({
				x:0,
				y:360,
				幅:640,
				高さ:40,
				塗りつぶし:true、
				塗りつぶしスタイル:'#E8E8E8'
		})
		this.renderArr.push(rect);
		
		//テキストを描画する var text = new Text({
			x:300,
			y:390,
			テキスト:「スライダーをドラッグして確認します」
			フォント:'18px セリフ',
			テキスト配置:'center',
			塗りつぶし:true、
			// 塗りつぶしスタイル: '白'
		});
		this.renderArr.push(テキスト);

ページ効果は以下のとおりです

検証図を描き、ブロックをドラッグする

注: 検証グラフを描画するための座標は、前の手順で欠落しているブロックを描画するための座標と同じです。

var pos = this.validPos; // 前のステップで描画された欠落ブロックの座標。検証画像はこの座標に従ってインターセプトされる必要があります。 var img = new ImageDraw({image:this.imgObj[0],sx:pos.x,sy:pos.y,sWidth:60,sHeight:60,dx:0, dy:pos.y,dWidth:60,dHeight:60},this);
this.renderArr2.push(画像);
		
var img1 = new ImageDraw({image:this.imgObj[1],dx:0, dy:360,dWidth:40,dHeight:40},this);
this.renderArr2.push(img1);

効果画像:

キャンバス 2 イベントの追加

//キャンバスにクリック イベントを追加します。canvas2.addEventListener('mousedown',this.mouseDown.bind(this));
canvas2.addEventListener('mouseup',this.mouseUp.bind(this));
canvas2.addEventListener('mousemove',this.mouseMove.bind(this));

マウスダウンイベント

  • マウスが浮かないように、マウスが押されたときの x 座標を記録します。
  • スライダーをドラッグせずに移動しないようにするには、移動フラグを true に変更します。
Slider.prototype.mouseDown=function(e){
			var pos = _.getOffset(e); //マウスの位置を取得します if(!this.block) return;
			if(this.block.isPoint(pos)){//押された位置がスライダーの位置になります this.move=true;//移動可能であることを示します this.downX=pos.x;//マウスが押された位置を記録し、移動し続けます }
	}

マウス移動イベント

  • 検証グラフとスライダーは、マウスクリックの初期 X 座標を減算して移動します。
  • 一定の範囲を超えると、キャンバスの範囲外への移動を防ぐために、それ以上移動できなくなります。
Slider.prototype.mouseMove = 関数(e) {
		if(!this.move) return ;//移動マークがfalseの場合は直接戻ります var pos = _.getOffset(e);
		pos.x -= this.downX; //マウスの初期クリック位置を減算する if(pos.x>580){
			戻る ;
		}
		this.update(pos);//移動 }
	//更新 Slider.prototype.update=function(pos){
		//スライダーと検証チャートの座標を変更する _.each(this.renderArr2,function(item){
			if(アイテム){
				アイテム.dx = pos.x;
			}
		});
		
		// 描画 this.render();
	}

マウスリリースイベント

  • マウスでマークを false に移動します。
  • 検証範囲に到達する前にマウスを放すと、スライダーと検証グラフは左端に戻ります。
  • 検証グラフの動きが一定の範囲に達すると、検証に合格したことを意味します。

検証に合格すると、検証に合格したことを示すプロンプトが表示されます。不足しているブロックをクリアしたり、プロンプトのテキスト内容を変更したりするなど、関連する内容を変更する必要があります。

Slider.prototype.mouseUp=function(e){
		this.move = false;
		var pos = _.getOffset(e);
			pos.x -= this.downX;
		var validPos = this.validPos; // 座標を検証します if(Math.abs(pos.x-validPos.x )<=10){ // 検証に合格しました (x 位置の差は一定の範囲内に収まります)
			コンソールログ('pass')
			this.suc();
		}else{//検証に失敗しました this.update({x:0});
		}
		これをレンダリングします。
	}
	
	スライダー.prototype.suc=関数(){
		this.renderArr.splice(2,1);//不足しているブロックをクリアします this.block=null;
		//スライダーと検証チャートをクリアします。this.renderArr2.length=0;
		//ストリップの色を変更します。this.renderArr[1].fillStyle='#78C430';
		
		var テキスト = this.renderArr[2];
		//プロンプトコンテンツの変更 text.fillStyle='white';
		text.text="検証に成功しました";
	}

成功した後は次のようになります。

完全なコードをダウンロードする

ドラッグスライダーパズル検証のJavaScript実装(html5、キャンバス)に関するこの記事はこれで終わりです。ドラッグスライダーパズル検証のより関連性の高いjs実装コンテンツについては、123WORDPRESS.COMの以前の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMを応援していただければ幸いです。

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

<<:  MySQL 基本チュートリアル パート 1 MySQL5.7.18 のインストールと接続チュートリアル

>>:  Docker-compose を使用して GitLab をデプロイする方法

推薦する

Docker マイクロサービス用の ETCD クラスターの構築に関する詳細なチュートリアル

目次etcdの機能etcdが独自の高可用性クラスタを構築するには、主に3つの形式があります。今回構築...

Vue-Routerのルート設定の詳しい説明

目次導入ルート内のオブジェクト属性パス: 文字列コンポーネント: コンポーネント | () =>...

MySQL のデータ削除とデータ テーブル メソッドの例

MySQL でデータやテーブルを削除するのは非常に簡単ですが、削除するとすべてのデータが消えてしまう...

Vue2.x および Vue3.x のカスタム命令の使用方法とフック関数の原理を理解する

目次Vue2.x の使用法グローバル登録部分登録使用フック機能フック関数のパラメータVue3.x の...

Linux で xargs コマンドを使用する詳細なチュートリアル

みなさんこんにちは。私は梁旭です。 Linux を使用しているときに、いくつかのコマンドを連結する必...

el-select のスタイルを変更する方法の詳細な説明: popper-append-to-body と popper-class

elementUI が提供する el-select コンポーネントのスタイルを変更する方法この問題...

HTML内の画像はbase64でエンコードされた文字列に直接置き換えられます

最近、画像はあるのに外部画像リソースが参照されていないウェブページを見つけました。気になりました。コ...

ウェブデザイン研究における XHTML の応用の概要

<br />一般的に、「標準的な Web ページ」のファイル構成は XHTML CSS ...

Vueのフロントエンドとバックエンドのデータのやり取りと表示を理解する方法

目次1. 技術概要2. 技術的な詳細1. インターフェースからバックエンドデータを取得する2. フロ...

デザインのヒント: きっと気に入っていただけると思います

<br />このタイトルを見ると、見覚えがあるかもしれません。多くのウェブサイトが同様の...

Linux 上のカラフルな猫

Linux システムを使用したことがある友人なら、 catコマンドを使用したことがあるはずです。もち...

Linux ディスクのマウント、パーティション分割、容量拡張操作を実装する方法

基本概念操作の前に、まずいくつかの基本的な概念を理解する必要がありますディスクLinux システムで...

MySQL テーブルとデータベースでデータを分割する方法

目次1. 縦方向のスライス1.1 垂直データベース1.2 垂直テーブル分割2. 水平(横断)セグメン...

js のマクロタスクとマイクロタスクについての簡単な説明

目次1. JavaScriptについて2. JavaScript イベントループ3. マクロタスクと...

Linuxにログインする際の文字セットの問題を解決する方法

文字セットエラーは常に存在するロケール: LC_CTYPE をデフォルト ロケールに設定できません:...