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 パネル コマンド リスト

推薦する

Linux におけるドライバモジュールのパラメータ転送プロセスの分析

ドライバーモジュールに渡すパラメータ名、タイプ、権限を宣言します。 module_param(変数名...

デザインスキルを向上させる良い方法

いわゆる才能(左脳と右脳)つまり、芸術的な才能があるかどうかは、人間の左脳と右脳の分業によって主に決...

CSS スティッキー配置位置の詳細な説明: スティッキー問題の落とし穴

前書き: position:sticky は CSS ポジショニングの新しい属性です。相対ポジショニ...

CSS3 クリックボタン円形進行ティック効果実装コード

目次8. CSS3 クリックボタンの円形進捗チェック効果8.1 画像プレビュー8.2 index.h...

::before/:before と ::after/:after の使用に関する深い理解

パート1: 基礎1. :active や :hover などの疑似クラスとは異なり、これらはすべて疑...

vue3.0 sfcのセットアップの変更について簡単に説明します。

目次序文標準的なSFCの書き方スクリプト設定可変露出部品の取り付け小道具カスタムイベント要約する序文...

Centos システムの指定された場所に Nginx をインストールする方法

Centos システムの指定された場所に Nginx をインストールするにはどうすればいいですか?は...

Chrome プラグイン (拡張機能) 開発ガイド (完全デモ)

目次前面に書かれた序文ChromeプラグインとはChrome プラグイン開発を学ぶことの意義は何です...

mysql のインデックスと FROM_UNIXTIME に関する問題

ゼロ、背景今週の木曜日にたくさんのアラートを受け取りました。DBA に確認を依頼したところ、遅いクエ...

Linux の grep コマンドと egrep コマンドの詳細な説明

反復/egrep構文: grep [-cinvABC] 'word' ファイル名-c...

shtml includeの使い方

これを応用することで、ウェブサイトの一部の公開領域を独立したページにすることができ、その後、この技術...

js と jQuery での Ajax の使用例の詳細

目次ネイティブJS GETリクエストの送信方法投稿リクエストの送信方法パラメータ付きのGETリクエス...

Windows Server 2016 リモート デスクトップ サービスを展開するためのクイック スタート ガイド

現在、2016サーバーは、win2008や2012よりも優れたマルチサイトhttpsサービスをサポー...

JavaScript Proxyオブジェクトの詳細な説明

目次1. プロキシとは何ですか? 2. 使い方は? 1. プロキシを使用する簡単な例2. 対象オブジ...

HTML テーブル マークアップ チュートリアル (5): ライト ボーダー カラー属性 BORDERCOLORLIGHT

表では、左上の境界線の色を個別に定義したり、セルの右下の境界線の色を定義したりできます。これら 2 ...