Vue は QR コード スキャン機能を実装します (スタイル付き)

Vue は QR コード スキャン機能を実装します (スタイル付き)

必要:
vue を使用して QR コードのスキャンを実現します。

プラグイン:
QRコードリーダー;

プラグインのダウンロード

npm インストール --save vue-qrcode-reader

知らせ:
コードをスキャンするには、カメラを https プロトコルでのみ呼び出すことができます。
vue.config.js で devServer を設定できます: {https: true}
または、前の記事を参照して、フロントエンドでNuxtフレームワークを使用し、ローカルhttpsアクセスを構成し、ローカル証明書を構成します。

ここに画像の説明を挿入

<テンプレート>
  <div>
    <p class="error">{{ エラー }}</p>
    <!--エラーメッセージ-->

    <p class="デコード結果">
      スキャン結果:
      {{ 結果 }}
    </p>
    <!--スキャン結果-->

    <qrcode-stream @decode="onDecode" @init="onInit" style="height: 100vh;">
      <div>
        <div class="qr-scanner">
          <div class="box">
            <div class="line"></div>
            <div class="angle"></div>
          </div>
        </div>
      </div>
    </qrcode-stream>
  </div>
</テンプレート>

<スクリプト>
// プラグインをダウンロード // cnpm install --save vue-qrcode-reader

// インポート import { QrcodeStream } from 'vue-qrcode-reader'

エクスポートデフォルト{
  // コンポーネントを登録: { QrcodeStream },

  データ() {
    戻る {
      結果: '', // スキャン結果情報 error: '' // エラーメッセージ }
  },

  メソッド: {
    onDecode(結果) {
      アラート(結果)
      this.result = 結果
    },

    非同期 onInit(promise) {
      試す {
        約束を待つ
      } キャッチ(エラー){
        if (error.name === 'NotAllowedError') {
          this.error = 'エラー: カメラへのアクセスを許可する必要があります'
        } それ以外の場合 (error.name === 'NotFoundError') {
          this.error = 'エラー: このデバイスにはカメラがありません'
        } それ以外の場合 (error.name === 'NotSupportedError') {
          this.error = 'エラー: セキュリティ コンテキストが必要です (HTTPS、localhost)'
        } それ以外の場合 (error.name === 'NotReadableError') {
          this.error = 'エラー: カメラが使用中です'
        } そうでない場合 (error.name === 'OverconstrainedError') {
          this.error = 'エラー: カメラの取り付けが不適切です'
        } そうでない場合 (error.name === 'StreamApiNotSupportedError') {
          this.error = 'エラー: このブラウザはストリーミング API をサポートしていません'
        }
      }
    }
  }
}
</スクリプト>

<スタイルスコープ>
。エラー {
  フォントの太さ: 太字;
  色: 赤;
}
</スタイル>

<スタイルスコープ>
    /* * {
      マージン: 0;
      パディング: 0;
    }
    体 {
      高さ: 700ピクセル;
      マージン: 0;
    } */

    .qrスキャナー{
      背景画像:
        線形勾配(0度,
          透明 24%、
          RGBA(32, 255, 77, 0.1) 25%,
          RGBA(32, 255, 77, 0.1) 26%,
          透明 27%、
          透明度74%、
          RGBA(32, 255, 77, 0.1) 75%,
          RGBA(32, 255, 77, 0.1) 76%,
          透明度77%、
          透明)、
        線形勾配(90度、
          透明 24%、
          RGBA(32, 255, 77, 0.1) 25%,
          RGBA(32, 255, 77, 0.1) 26%,
          透明 27%、
          透明度74%、
          RGBA(32, 255, 77, 0.1) 75%,
          RGBA(32, 255, 77, 0.1) 76%,
          透明度77%、
          透明);
      背景サイズ: 3rem 3rem;
      背景位置: -1rem -1rem;
      幅: 100%;
      /* 高さ: 100%; */
      高さ:100vh;
      位置: 相対的;
      背景色: #1110;

      /* 背景色: #111; */
    }

    .qr-スキャナー .box {
      幅: 213px;
      高さ: 213px;
      位置: 絶対;
      左: 50%;
      上位: 50%;
      変換: translate(-50%, -50%);
      オーバーフロー: 非表示;
      境界線: 0.1rem実線rgba(0, 255, 51, 0.2);
      /* 背景: url('http://resource.beige.world/imgs/gongconghao.png') 繰り返しなし 中央 中央; */
    }

    .qr-スキャナー .line {
      高さ: calc(100% - 2px);
      幅: 100%;
      背景: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%);
      下境界線: 3px 実線 #00ff33;
      変換: translateY(-100%);
      アニメーション: レーダービーム 2 秒無限交互;
      アニメーションタイミング関数: 立方ベジェ(0.53, 0, 0.43, 0.99);
      アニメーション遅延: 1.4秒;
    }

    .qr-scanner .box:after、
    .qr-scanner .box:before,
    .qr-scanner .angle:after,
    .qr-scanner .angle:before {
      コンテンツ: '';
      表示: ブロック;
      位置: 絶対;
      幅: 3vw;
      高さ: 3vw;

      境界線: 0.2rem 透明実線;
    }

    .qr-scanner .box:after、
    .qr-スキャナー .box:before {
      上: 0;
      上の境界線の色: #00ff33;
    }

    .qr-scanner .angle:after,
    .qr-scanner .angle:before {
      下部: 0;
      境界線下部の色: #00ff33;
    }

    .qr-scanner .box:before,
    .qr-scanner .angle:before {
      左: 0;
      左境界線の色: #00ff33;
    }

    .qr-scanner .box:after、
    .qr-scanner .angle:after {
      右: 0;
      右境界線の色: #00ff33;
    }

    @keyframes レーダービーム {
      0% {
        変換: translateY(-100%);
      }

      100% {
        変換: translateY(0);
      }
    }
  </スタイル>

さて、コードスキャン機能をコードビュープロジェクトに実装しましょう

プロジェクトアドレス: https://github.com/wkl007/vue-scan-demo.git
このプロジェクトは主にコードスキャン機能です。コアコードは

 <div class="scan">
    <div id="bcid">
      <div style="height:40%"></div>
      <p class="tip">...読み込み中...</p>
    </div>
    <フッター>
      <button @click="startRecognize">1. コントロールを作成する</button>
      <button @click="startScan">2. スキャンを開始する</button>
      <button @click="cancelScan">3. スキャンを終了する</button>

      <button @click="closeScan">4. コントロールを閉じる</button>
    </フッター>
  </div>
</テンプレート>

<スクリプトタイプ='text/ecmascript-6'>
  スキャン = null とする

  エクスポートデフォルト{
    データ () {
      戻る {
        コード URL: ''、
      }
    },
    メソッド: {
      // スキャンコントロールを作成する startRecognize () {
        それを = これとする
        if (!window.plus) 戻り値
        スキャン = 新しい plus.barcode.Barcode('bcid')
        scan.onmarked = マーク済み

        関数 onmarked (タイプ、結果、ファイル) {
          スイッチ(タイプ){
            ケースプラス.バーコード.QR:
              タイプ = 'QR'
              壊す
            ケースプラス.バーコード.EAN13:
              タイプ = 'EAN13'
              壊す
            ケースプラス.バーコード.EAN8:
              タイプ = 'EAN8'
              壊す
            デフォルト:
              タイプ = 'その他' + タイプ
              壊す
          }
          結果 = result.replace(/\n/g, '')
          that.codeUrl = 結果
          アラート(結果)
          スキャンを閉じる()

        }
      },
      // スキャンを開始する startScan () {
        if (!window.plus) 戻り値
        スキャン開始()
      },
      // スキャンを終了する cancelScan () {
        if (!window.plus) 戻り値
        スキャン.キャンセル()
      },
      // バーコード認識コントロールを閉じる closeScan () {
        if (!window.plus) 戻り値
        スキャンを閉じる()
      },
    }
  }
</スクリプト>
<スタイル lang="less">
  .スキャン{
    高さ: 100%;

    #bcid {
      幅: 100%;
      位置: 絶対;
      左: 0;
      右: 0;
      上: 0;
      下部: 3rem;
      テキスト配置: 中央;
      色: #fff;
      背景: #ccc;
    }

    フッター {
      位置: 絶対;
      左: 0;
      下部:1rem;
      高さ: 2rem;
      行の高さ: 2rem;
      zインデックス: 2;
    }
  }
</スタイル>

Vue のスタイル付きコードスキャン機能の実装に関するこの記事はこれで終わりです。Vue コードスキャン機能の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue を通じて QR コードスキャン機能を実装する
  • Vue - QR コードのフロントエンド生成の例
  • VueでQRコードを動的に生成する方法
  • Vue WeChat は QR コードをスキャンしますが、Apple は画像しか保存できません (解決策)
  • Vueのキャンバスを使ってQRコードと画像ポスターの合成を実現する方法
  • vue-qr を使用して Vue の QR コードを生成する方法について深く理解する

<<:  Linuxターミナルでファイルを作成する2つの一般的な方法を簡単に理解する

>>:  Baota Linux パネル コマンド リスト

ブログ    

推薦する

Vueはブラウザ側のコードスキャン機能を実装します

背景少し前にブラウザカメラの取得とスキャンコード認識の機能を作りました。その際の知識ポイントと具体的...

Vue.js $refs 使用例の説明

プロパティやイベントがあるにもかかわらず、JavaScript で子コンポーネントに直接アクセスする...

JavaScript エラー処理 try..catch...finally + は throw+TypeError+RangeError をカバーします

目次1. 目的2. 文法3. 練習する1. 目的通常、エラーが発生すると、スクリプトは直ちに停止し、...

データ URI スキームを使用して Web ページに画像を埋め込む方法の紹介

データ URI スキームを使用すると、HTML、CSS、Javascript などで使用できるインラ...

純粋な CSS で実装された大きなドロップダウン メニューのサンプル コード

これは純粋に CSS で実装された大きなドロップダウン メニューです。この大きなメニューは、js コ...

知らないかもしれないLinuxのファイル権限管理方法

なぜ権限管理が必要なのでしょうか? 1. コンピュータ リソースは限られているため、コンピュータ リ...

アカウントとパスワードを記憶する機能を実現するVueの考え方とプロセス

目次実装のアイデアアカウント パスワードを保存する方法は 3 つあります。機能インターフェースアカウ...

分散ロックの原理と3つの実装方法の詳細な説明

現在、ほぼすべての大規模な Web サイトとアプリケーションは分散方式で展開されています。分散シナリ...

ナビゲーションバーのドロップダウンメニューのサンプルコードを実装するためのHTML+CSS

効果コード内の画像は自分で変更できますドロップダウンメニューのHTMLコード <ヘッダークラ​...

JavaScript に関する 6 つの奇妙で便利な点

目次1. 解体のヒント2. デジタルセパレーター3. try...catch...finally が...

変換を使用して純粋な CSS ポップアップ メニューを実装するためのサンプル コード

序文トップメニューを作成する場合、ポップアップのセカンダリメニューを作成する必要があります。 以前の...

Vue3における7種類のコンポーネント通信の詳細

目次1. Vue3コンポーネント通信方式2. Vue3通信の使い方2.1 小道具2.2 $エミット2...

HTMLは入力完了を検出する機能を実装する

入力が進行中かどうかを検出するには、「onInput(event)」を使用しますコンテンツが変更され...

MySQLのファジークエリの要約

1. 一般的な使用法: (1)%で使用する% は 1 つ以上の文字のワイルドカードを表します。たとえ...

Linux の vsftpd サービス構成の簡単な分析 (匿名、ユーザー、仮想ユーザー)

vsftpd の概要vsftpd は「very secure FTP daemon」の略称で、セキ...