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

推薦する

Mysqlの同時パラメータ調整の詳細な説明

目次クエリキャッシュの最適化概要クエリプロセスクエリキャッシュ構成クエリキャッシュの無効化メモリ管理...

HTML で色を表すには、6 桁の 16 進コード、RGB、またはキーワードを使用します。

HTML で色を表す方法は 3 つありますが、最もよく使われるのは 6 桁の 16 進コード表現です...

MySQL トリガー: 複数のトリガー操作の作成例の分析

この記事では、例を使用して、MySQL で複数のトリガー操作を作成する方法について説明します。ご参考...

CSSブレンドモードとSVGを使用して、製品画像の色を動的に変更します。

数日前、Codepen で @Kyle Wetton が書いた、CSS ブレンディング モードと S...

ユーザーエクスペリエンスの構築

<br />おそらく、あなたは会社に入社したばかりで、その会社が「ユーザビリティ」に関す...

Linux コマンド sort、uniq、tr ツールの詳細な説明

並べ替えツールLinux の sort コマンドは、テキスト ファイルの内容を並べ替えるために使用さ...

SpringBootをDockerにデプロイし、jarパッケージを置き換える方法の詳細な説明

目次プロジェクトディレクトリDockerファイルファイルの展開画像を生成するコンテナを起動するウェブ...

Docker のインストールと構成イメージの高速化の実装

目次DockerバージョンCentOS に Docker エンジンをインストールするシステム要件古い...

MySQLバッチは特定のフィールドのスペースを削除します

Mysql で特定のフィールドからスペースを一括削除する方法はありますか?文字列の前後のスペースだけ...

XHTML Web ページ チュートリアル

この記事は主に、初心者に XHTML の基本的な知識と、XHTML と HTML の違いを理解しても...

vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

目次1. はじめに2. 使用1. vue2とvue3の違い2. ページ上の一部のデータはキャッシュす...

Rancher で Kubernetes 用の標準化された VMware イメージを構築する方法

Kubernetes を学習するときは、Kubernetes 環境で練習する必要があります。ただし、...

Linux で pyenv をインストールする方法

前提条件gitをインストールする必要があるインストール手順1. リモートリポジトリからpyenvをク...

SpringBoot プロジェクトの Docker 環境を実行するときに発生する無限再起動問題の詳細な説明

もしかしたら私の考え方が間違っていたのかもしれないし、問題の説明が少し乱雑だったのかもしれないが、こ...

JS でモバイルのインタラクティブ エクスペリエンスを向上させる方法

目次1. 即時フィードバック1.1 ボタンからの即時フィードバック1.2 継続的なフィードバック1....