導入:スライダー ドラッグ検証は現在、多くの場所で使用されています。週末に 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)); マウスダウンイベント
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;//マウスが押された位置を記録し、移動し続けます } } マウス移動イベント
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(); } マウスリリースイベント
検証に合格すると、検証に合格したことを示すプロンプトが表示されます。不足しているブロックをクリアしたり、プロンプトのテキスト内容を変更したりするなど、関連する内容を変更する必要があります。 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を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL 基本チュートリアル パート 1 MySQL5.7.18 のインストールと接続チュートリアル
>>: Docker-compose を使用して GitLab をデプロイする方法
私のおすすめ複数のIEバージョンの共存のためのソリューション以前に IE6、IE7、IE8 の共存に...
目次序文時間型を保存するのに文字列を使用しないでくださいMySQL の日付型日時タイムスタンプTIM...
1. 機能: xargs は、stdin 内のスペースまたは改行で区切られたデータをスペースで区切ら...
JavaScriptは、参考のためにランダムな点呼Webページを作成します。具体的な内容は次のとお...
<br />XHTML と CSS がオブジェクト指向だったらよかったのに。 。太陽は北...
Windows または Linux オペレーティング システムをインストールするかどうかに関係なく、...
Web ページを作成するときに、特定のフォントを使用したい場合は、 @font-faceを介して参照...
1. pom.xmlに次の依存関係を追加します。 <依存関係> <groupId&...
目次リナックス1. SWAPとは2. swappiness は何を調節しますか? 3. スワップ操作...
序文JavaScript では、これは関数呼び出しコンテキストです。この動作が非常に複雑であるからこ...
目次事前分析とは何ですか?変数と関数の準備の違いvar 変数の繰り返し宣言変数と関数の昇格の優先順位...
MySQL の mysql 5.7.18 zip バージョンは、クリックして次のステップをクリックし...
目次1. nodejsをダウンロードする2. ダブルクリックしてインストール3. グローバル npm...
Flex レイアウトの紹介英語の Flex はフレキシブル ボックス、つまり伸縮性のあるボックスを...
実行中のコンテナが終了したときに、コンテナが完全に終了する前に環境をクリーンアップするなど、いくつか...