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 グリーン バージョンのインストール チュートリアル

推薦する

CSS3で実装された6つの境界遷移効果

6つの効果実装コードhtml <h1>CSS 境界遷移</h1> <セ...

CCS におけるマージン: トップ崩壊問題を解決する

HTML 構造は次のとおりです。 CCS 構造は次のとおりです。 ページ効果図は次のとおりです。 こ...

Centos7でmysql5.7.19のデータ保存場所を移動する方法

シナリオ: データ量が増加すると、MySQL が配置されているディスクがいっぱいになり、より大きなス...

Node.js のワーカー スレッドの詳細な理解

目次概要Node.js における CPU バウンド アプリケーションの歴史CPUを集中的に使用する操...

docker公式mysqlイメージのカスタム構成の詳細な説明

インストール時間を節約するために、公式の mysql docker イメージを使用して mysql ...

HTMLはWEB標準の開発の中心的な基盤です

HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...

Docker プライマリ ネットワーク ポート マッピング構成

ポートマッピングDocker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネ...

WeChatアプレットのサイレントログインとカスタムログイン状態の維持の詳細な説明

目次1. 背景2. サイレントログインとは何ですか? 3. カスタムログイン状態を維持する方法4. ...

IE 環境での css-vars-ponyfill の使用に関する詳細な説明 (nextjs ビルド)

css-vars-ポニーフィルCSS 変数を使用して Web ページのスキニングを実現すると、互換...

Reactは無限ループスクロール情報を実装する

この記事では、無限ループスクロールを実現するためのReactの具体的なコードを参考までに紹介します。...

CentOS7 での PostgreSQL 11 の詳細なインストールと設定のチュートリアル

1. 公式ウェブサイトアドレス公式サイトではインストールの参考手順が紹介されています。公式サイトを見...

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...

MySql 5.6.36 64 ビット グリーン バージョンのインストール グラフィック チュートリアル

MySQL のインストールについてはインターネット上に多くの記事がありますが、今日ノート PC にイ...

VMWare14.0.0のUbuntu仮想マシンで共有フォルダを設定する

これは私の最初のブログ投稿です。時間の制約があるため、どのようにフォーマットすればよいかわかりません...

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

目次1. 原則の概要クエリキャッシュシステム変数1. クエリキャッシュを持つ2. クエリキャッシュ制...