用 Javascript 生成二维码

大家好,这将是一篇很短的文章,我将展示如何为 JavaScript 中的任何内容生成二维码。

显然,我不会从头开始实现所有内容,当我们在 JavaScript 中有大量有用的库时,为什么要这样做。

我遇到了这个很棒的轻量级库,或者你可以说一个简单的脚本qrcodejs。它非常易于使用并且也很可靠。

执行

  • 下载此 zip 文件:qrcodejs

  • 提取它。

  • 现在您可以在您的项目中使用qrcode.jsqrcode.min.js文件。

代码

qrcode.js在 HTML 文件中包含该文件。

...
<script src="./qrcode.js" defer></script>
...

举一个iddiv要显示生成的QR码。这里我用作"qrcode"我的id.

...
<div id="qrcode"></div>
...

现在我们将从该QRCode函数创建一个对象。需要通过id输出的div"qrcode"在这种情况下。

var QR_CODE = new QRCode("qrcode", {
  width: 220,
  height: 220,
  colorDark: "#000000",
  colorLight: "#ffffff",
  correctLevel: QRCode.CorrectLevel.H,
});

correctLevel:L低,M中,H高。

通过调用makeCodeQRCode 对象的方法来生成 QRCode,该方法将data用作其参数。

QR_CODE.makeCode("https://buymeacoffee.com/bibekkakati");

在它会自动将所生成的QR码div,其id在创建对象的QR码已经提供。

例子✨

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>QR Code Generator</title>
    <link rel="stylesheet" href="./css/style.css">
    <script src="./js/qrcode.js" defer></script>
    <script src="./js/script.js" defer></script>
</head>

<body>
    <div class="main" id="main">
        <img src="./assets/qr_logo.svg" alt="" width="68" height="68">
        <input type="text" class="dataBox" name="data" placeholder="Paste your content" id="dataBox" value=""
            autocomplete="false">
        <button class="btn" id="generateBtn">Generate</button>
        <div class="qrdiv hide" id="qrdiv">
            <div class="qrcode" id="qrcode"></div>
            <button class="downloadBtn" id="downloadBtn">Download</button>
        </div>
    </div>
</body>

</html>
function main() {
	const generateBtn = document.getElementById("generateBtn");
	const dataBox = document.getElementById("dataBox");
	const downloadBtn = document.getElementById("downloadBtn");
	const qrcode = document.getElementById("qrcode");
	const qrdiv = document.getElementById("qrdiv");

	const errorClassName = "error";
	const shakeClassName = "shake";
	const dataBoxClassName = "dataBox";
	const toHideClassName = "hide";
	const qrdivClassName = "qrdiv";

	var QR_CODE = new QRCode("qrcode", {
		width: 260,
		height: 260,
		colorDark: "#000000",
		colorLight: "#ffffff",
		correctLevel: QRCode.CorrectLevel.H,
	});

	generateBtn.onclick = function (e) {
		const data = dataBox.value;
		if (data) {
			generateQRCode(data);
		} else {
			markDataBoxError();
		}
	};

	dataBox.onfocus = function (e) {
		const classList = dataBox.classList;

		if (classList.contains(errorClassName)) {
			// Removing error class
			dataBox.className = dataBoxClassName;
		}
	};

	downloadBtn.onclick = function (e) {
		// Image tag
		const img = qrcode.getElementsByTagName("img")[0];
		// Canvas tag
		const canvas = qrcode.getElementsByTagName("canvas")[0];

		// Padding to QRCode
		const padding = 40;

		// Adding padding to width and height
		canvas.width = canvas.width + padding;
		canvas.height = canvas.height + padding;

		// Canvas context
		const context = canvas.getContext("2d");
		// Clearing previous content
		context.clearRect(0, 0, canvas.width, canvas.height);
		// Making the background white
		context.fillStyle = "#ffffff";
		context.fillRect(0, 0, canvas.width, canvas.height);
		// Adding the image of QRCode
		// x and y are padding / 2
		context.drawImage(img, padding / 2, padding / 2);

		// Getting base64 url
		const image = canvas.toDataURL("image/png", 1);
		const filename = "QR_Code_" + Date.now() + ".png";
		downloadImage(image, filename);
	};

	function markDataBoxError() {
		const prevClassName = dataBox.className;
		dataBox.className =
			prevClassName + " " + errorClassName + " " + shakeClassName;
		vibrate();
		setTimeout(() => {
			// Reset class
			dataBox.className = prevClassName + " " + errorClassName;
		}, 500);
	}

	function generateQRCode(data) {
		QR_CODE.clear();
		QR_CODE.makeCode(data);
		// Show QRCode div
		qrdiv.className = qrdivClassName;
	}

	function vibrate() {
		if (Boolean(window.navigator.vibrate)) {
			window.navigator.vibrate([100, 100, 100]);
		}
	}

	function downloadImage(image, filename) {
		// Creating hidden <a> tag to download
		var element = document.createElement("a");
		element.setAttribute("href", image);
		element.setAttribute("download", filename);
		element.setAttribute("class", toHideClassName);
		document.body.appendChild(element);
		element.click();
		document.body.removeChild(element);
	}
}

main();
body {
	padding: 0;
	margin: 0;
	width: 100vw;
	height: 100vh;
}

.main {
	display: flex;
	flex-direction: column;
	align-items: center;
	padding-top: 60px;
}

.dataBox {
	width: 300px;
	height: 30px;
	border-radius: 40px;
	padding: 8px 16px;
	margin: 40px 0 10px 0;
	font-size: 16px;
	outline: none;
	border-color: #03ad91;
	text-align: center;
	border-width: 4px;
}

.btn {
	position: relative;
	height: 50px;
	width: 300px;
	margin: 10px 0;
	padding: 8px 16px;
	text-align: center;
	border-radius: 40px;
	border: none;
	background-color: #03ad91;
	color: #f0f8ff;
	font-weight: 600;
	font-size: 16px;
	-webkit-transition-duration: 0.4s;
	transition-duration: 0.4s;
	text-decoration: none;
	overflow: hidden;
	cursor: pointer;
	box-shadow: 0px 6px 10px #53fcb866;
}

.btn:after {
	content: "";
	display: block;
	position: absolute;
	background: #02e0bb;
	border-radius: 40px;
	padding-top: 300%;
	padding-left: 350%;
	margin-left: -20px !important;
	margin-top: -120%;
	opacity: 0;
	transition: all 0.8s;
}

.btn:active:after {
	padding: 0;
	margin: 0;
	opacity: 1;
	transition: 0s;
}

.qrdiv {
	text-align: center;
}

.qrcode {
	margin: 30px 0;
}

.qrcode > img {
	background-color: #fff;
}

.downloadBtn {
	background: none;
	border: none;
	color: #809180;
	font-weight: 600;
	letter-spacing: 1px;
	cursor: pointer;
	padding: 2px;
}

.downloadBtn:hover {
	border-bottom: dashed #809180 2px;
}

.hide {
	display: none;
}

.error {
	border-color: #e22416;
}

.shake {
	animation: shake 0.5s;
	animation-iteration-count: infinite;
}

@keyframes shake {
	0% {
		transform: translate(1px, 1px) rotate(0deg);
	}
	10% {
		transform: translate(-1px, -2px) rotate(-0.5deg);
	}
	20% {
		transform: translate(-3px, 0px) rotate(0.5deg);
	}
	30% {
		transform: translate(3px, 2px) rotate(0deg);
	}
	40% {
		transform: translate(1px, -1px) rotate(0.5deg);
	}
	50% {
		transform: translate(-1px, 2px) rotate(-0.5deg);
	}
	60% {
		transform: translate(-3px, 1px) rotate(0deg);
	}
	70% {
		transform: translate(3px, 1px) rotate(-0.5deg);
	}
	80% {
		transform: translate(-1px, -1px) rotate(0.5deg);
	}
	90% {
		transform: translate(1px, 2px) rotate(0deg);
	}
	100% {
		transform: translate(1px, -2px) rotate(-0.5deg);
	}
}

GitHub的存储库

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值