vue實現(xiàn)二維碼掃碼功能(帶樣式)
需求:
利用vue實現(xiàn)二維碼掃描;
插件:
QRCodeReader;
插件下載
npm install --save vue-qrcode-reader
注意:
需要在https協(xié)議下才可以調(diào)用相機(jī),實現(xiàn)掃碼。
可以通過配置vue.config.js中的devServer:{https:true}
或參照前文章 前端使用Nuxt框架,配置本地https訪問 配置本地證書
<template> <div> <p class="error">{{ error }}</p> <!--錯誤信息--> <p class="decode-result"> 掃描結(jié)果: <b>{{ result }}</b> </p> <!--掃描結(jié)果--> <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> </template> <script> // 下載插件 // cnpm install --save vue-qrcode-reader // 引入 import { QrcodeStream } from 'vue-qrcode-reader' export default { // 注冊 components: { QrcodeStream }, data() { return { result: '', // 掃碼結(jié)果信息 error: '' // 錯誤信息 } }, methods: { onDecode(result) { alert(result) this.result = result }, async onInit(promise) { try { await promise } catch (error) { if (error.name === 'NotAllowedError') { this.error = 'ERROR: 您需要授予相機(jī)訪問權(quán)限' } else if (error.name === 'NotFoundError') { this.error = 'ERROR: 這個設(shè)備上沒有攝像頭' } else if (error.name === 'NotSupportedError') { this.error = 'ERROR: 所需的安全上下文(HTTPS、本地主機(jī))' } else if (error.name === 'NotReadableError') { this.error = 'ERROR: 相機(jī)被占用' } else if (error.name === 'OverconstrainedError') { this.error = 'ERROR: 安裝攝像頭不合適' } else if (error.name === 'StreamApiNotSupportedError') { this.error = 'ERROR: 此瀏覽器不支持流API' } } } } } </script> <style scoped> .error { font-weight: bold; color: red; } </style> <style scoped> /* * { margin: 0; padding: 0; } body { height: 700px; margin: 0; } */ .qr-scanner { background-image: linear-gradient(0deg, transparent 24%, rgba(32, 255, 77, 0.1) 25%, rgba(32, 255, 77, 0.1) 26%, transparent 27%, transparent 74%, rgba(32, 255, 77, 0.1) 75%, rgba(32, 255, 77, 0.1) 76%, transparent 77%, transparent), linear-gradient(90deg, transparent 24%, rgba(32, 255, 77, 0.1) 25%, rgba(32, 255, 77, 0.1) 26%, transparent 27%, transparent 74%, rgba(32, 255, 77, 0.1) 75%, rgba(32, 255, 77, 0.1) 76%, transparent 77%, transparent); background-size: 3rem 3rem; background-position: -1rem -1rem; width: 100%; /* height: 100%; */ height: 100vh; position: relative; background-color: #1110; /* background-color: #111; */ } .qr-scanner .box { width: 213px; height: 213px; position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); overflow: hidden; border: 0.1rem solid rgba(0, 255, 51, 0.2); /* background: url('http://resource.beige.world/imgs/gongconghao.png') no-repeat center center; */ } .qr-scanner .line { height: calc(100% - 2px); width: 100%; background: linear-gradient(180deg, rgba(0, 255, 51, 0) 43%, #00ff33 211%); border-bottom: 3px solid #00ff33; transform: translateY(-100%); animation: radar-beam 2s infinite alternate; animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99); animation-delay: 1.4s; } .qr-scanner .box:after, .qr-scanner .box:before, .qr-scanner .angle:after, .qr-scanner .angle:before { content: ''; display: block; position: absolute; width: 3vw; height: 3vw; border: 0.2rem solid transparent; } .qr-scanner .box:after, .qr-scanner .box:before { top: 0; border-top-color: #00ff33; } .qr-scanner .angle:after, .qr-scanner .angle:before { bottom: 0; border-bottom-color: #00ff33; } .qr-scanner .box:before, .qr-scanner .angle:before { left: 0; border-left-color: #00ff33; } .qr-scanner .box:after, .qr-scanner .angle:after { right: 0; border-right-color: #00ff33; } @keyframes radar-beam { 0% { transform: translateY(-100%); } 100% { transform: translateY(0); } } </style>
好,下面在一段代碼vue項目中實現(xiàn)掃碼功能
項目地址:https://github.com/wkl007/vue-scan-demo.git
項目主要是做的一個掃碼的功能
核心代碼為
<div class="scan"> <div id="bcid"> <div style="height:40%"></div> <p class="tip">...載入中...</p> </div> <footer> <button @click="startRecognize">1.創(chuàng)建控件</button> <button @click="startScan">2.開始掃描</button> <button @click="cancelScan">3.結(jié)束掃描</button> <button @click="closeScan">4.關(guān)閉控件</button> </footer> </div> </template> <script type='text/ecmascript-6'> let scan = null export default { data () { return { codeUrl: '', } }, methods: { // 創(chuàng)建掃描控件 startRecognize () { let that = this if (!window.plus) return scan = new plus.barcode.Barcode('bcid') scan.onmarked = onmarked function onmarked (type, result, file) { switch (type) { case plus.barcode.QR: type = 'QR' break case plus.barcode.EAN13: type = 'EAN13' break case plus.barcode.EAN8: type = 'EAN8' break default: type = '其它' + type break } result = result.replace(/\n/g, '') that.codeUrl = result alert(result) that.closeScan() } }, // 開始掃描 startScan () { if (!window.plus) return scan.start() }, // 關(guān)閉掃描 cancelScan () { if (!window.plus) return scan.cancel() }, // 關(guān)閉條碼識別控件 closeScan () { if (!window.plus) return scan.close() }, } } </script> <style lang="less"> .scan { height: 100%; #bcid { width: 100%; position: absolute; left: 0; right: 0; top: 0; bottom: 3rem; text-align: center; color: #fff; background: #ccc; } footer { position: absolute; left: 0; bottom: 1rem; height: 2rem; line-height: 2rem; z-index: 2; } } </style>
到此這篇關(guān)于vue實現(xiàn)掃碼功能,帶樣式的文章就介紹到這了,更多相關(guān)vue掃碼功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue vuex vue-rouert后臺項目——權(quán)限路由(適合初學(xué))
這篇文章主要介紹了vue vuex vue-rouert后臺項目——權(quán)限路由,通過本文可以很清除的捋清楚vue+vuex+vue-router的關(guān)系,本版本非常簡單,適合初學(xué)者,需要的朋友可以參考下2017-12-12詳解vue2.0 資源文件assets和static的區(qū)別
這篇文章主要介紹了詳解vue2.0 資源文件assets和static的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Vue filter 過濾當(dāng)前時間 實現(xiàn)實時更新效果
這篇文章主要介紹了Vue filter 過濾當(dāng)前時間 實現(xiàn)實時更新效果,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12