从一篇前端大佬文章中我学到了很多

我们先看下页面是怎么样的:

功能很简单,就是复制下面的二维码图片,然后粘贴到文本框中,且显示在框的正中间,最后点击识别按钮,把识别二维码的结果展示到下面。

源代码:

<!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>qrcode</title><style>.area {height: 200px;border: 1px dashed skyblue;background-color: #fff;display: grid;place-items: center;margin-top: 20px;}.area:focus {border-style: solid;}.area:empty::before {content: '或粘贴图片到这里';color: gray;}.button {margin: 1rem auto;width: 160px;height: 40px;font-size: 112.5%;background-color: #eb4646;color: #fff;border: 0;border-radius: 0.25rem;margin-top: 1.5rem;}</style></head><body><div class="container"><input id="file" class="file" type="file" accept="image/png" /><div id="area" class="area" tabindex="-1"></div></div><p align="center"><button id="button" class="button">识别</button></p><p id="result" align="center"></p><p align="center">方便大家复制的示意图:<br /><imgsrc="./qrcode.png"style="margin-top: 10px"/></p><script>var reader = new FileReader()reader.onload = function (event) {area.innerHTML = '<img src="' + event.target.result + '">'}document.addEventListener('paste', function (event) {var items = event.clipboardData && event.clipboardData.itemsvar file = nullif (items && items.length) {// 检索剪切板itemsfor (var i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {file = items[i].getAsFile()break}}}// 此时file就是剪切板中的图片文件if (file) {reader.readAsDataURL(file)}})file.addEventListener('change', function (event) {const file = event.target.files && event.target.files[0]if (file) {reader.readAsDataURL(file)}})button.addEventListener('click', function () {if ('BarcodeDetector' in window) {// 创建检测器const barcodeDetector = new BarcodeDetector({formats: ['qr_code']})const eleImg = document.querySelector('#area img')if (eleImg) {barcodeDetector.detect(eleImg).then(barcodes => {console.log('barcodes', barcodes)barcodes.forEach(barcode => {result.innerHTML = `<span class="success">解析成功,结果是:</span>${barcode.rawValue}`})}).catch(err => {result.innerHTML = `<span class="error">解析出错:${err}</span>`})} else {result.innerHTML = `<span class="error">请先粘贴二维码图片</span>`}} else {result.innerHTML = `<span class="error">当前浏览器不支持二维码识别</span>`}})</script></body>
</html>

背景交代完成,现在就来一点点的分析代码的精妙之处。

CSS部分

tabindex = -1

<div id="area" class="area" tabindex="-1"></div>

当我看到tabindex这个属性时,完全不知道它的用法,于是我继续在张鑫旭大佬的博客中搜索,找到一篇叫《HTML tabindex属性与web网页键盘无障碍访问》的文章,这里简要说下这个属性的用法和作用。

tabindex是一个与键盘访问行为息息相关的属性,它是一个全局属性,即所有 HTML 标签都可以用的属性,比如id,class等属性。因此,它就可以在div上使用。另外,这个属性没有兼容性问题,放心使用。

我们平常可能感觉不到它的价值,但是一旦我们的鼠标坏掉了或者没电了,我们就只能使用键盘来操作。亦或者在电视机上,或者投影设备上访问我们的网页的时候,我们只能使用遥控器上的按钮,可以看出是电脑的键盘。就算设备都完全正常,对于资深用户而言,键盘访问可以大大提高我们的使用效率。

当一个元素设置tabindex属性值为-1的时候,元素会变得focusable。focusable指的是元素可以被鼠标 或者 JS focus,在 chrome 浏览器下表现为会有outline发光效果,IE浏览器下是虚框,同时能够响应focus事件。

默认的focusable元素有<a>, <area>, <button>, <input>, <object>, <select> 以及 <textarea>。

但是,tabindex = -1不能被键盘的tab键进行focus。这种鼠标可以focus,但是键盘却不能focus的状态,只要tabindex属性值为负值就可以了。

因此,代码中利用了这一特性,设置div被focus的样式,当鼠标点击div时,我们可以改变它的边框,如下:

.area:focus {border-style: solid;}

tabindex属性值是一个整数,它是用来决定被tab键focus的顺序,顺序越小越先被focus,但是 0除外,如下div被focus的顺序依次是:1,2,3。

<div id="area" class="area" tabindex="1"></div>
<div class="area" tabindex="3"></div>
<div class="area" tabindex="2"></div>

那tabindex="0"又是怎么回事呢?

元素设置tabindex="-1",可以鼠标和 JS 可以focus,但键盘不能focus。

tabindex="0"和tabindex="-1"的唯一区别就是键盘也能focus,但是被focus的顺序是最后的,也就是当你使用tab进行聚焦时,最后才会聚集到tabindex="0"的元素。

<div>设置了tabindex="0",从键盘访问的角度来讲,相对于<div>元素变成了<button>元素。

垂直居中

垂直居中是一个常用的需求了,我经常使用flex来完成:

display: flex;
align-items: center;
justify-content: center;

在大佬的文章中使用了一个新的用法:

display: grid;
place-items: center;

place-items 属性是以下属性的简写:align-items、justify-items。

这样当粘贴图片时,图片就居中显示了。

:empty::before

当div元素没有内容时,.area:empty样式会生效,同时为了显示一段提示内容,使用了伪元素::before,在content写入提示内容。

.area:empty::before {content: '或粘贴图片到这里';color: gray;
}

这个 css 样式平时用的少,所以这里特意的记录下,以免自己忘记。

JS部分

copy paste 事件

document.addEventListener('paste', function (event) {var items = event.clipboardData && event.clipboardData.itemsvar file = nullif (items && items.length) {// 检索剪切板itemsfor (var i = 0; i < items.length; i++) {if (items[i].type.indexOf('image') !== -1) {file = items[i].getAsFile()break}}}// 此时file就是剪切板中的图片文件if (file) {reader.readAsDataURL(file)}
})

这两个事件都属于ClipboardEvent事件(剪切板事件),还有一个cut剪切事件。

wrap.oncopy = function(event){}
wrap.oncut = function(event){}
wrap.onpaste = function(event) {}

目前,大部分软件上的内容都是可以被复制粘贴的,这是因为软件对操作系统复制粘贴操作的实现,软件都会把复制剪切的内容存入操作系统的剪切板上。同样,浏览器也对操作系统的复制剪切板进行了实现,属于浏览器的自身的实现。

浏览器复制剪切的默认行为是触发浏览器的 copy 事件,将 copy 的内容存入操作系统的剪切板中。

那如何干预浏览器的这种默认的复制粘贴操作呢?

可以通过event.preventDefault阻止事件的默认行为,即当触发这三个事件时,阻止对系统剪切板的数据操作。然后,我们对数据进行加工后,重新写入到剪贴板。

比如,当用户复制我们网站的内容时,可以在数据后面加一个版权的相关信息。

<div id="wrap">这是复制的复制内容</div><script>var wrap = document.getElementById('wrap')wrap.oncopy = function (event) {// 通过copy事件监听,阻止将选中内容复制到系统剪切板上event.preventDefault() // 获取选中内容对象const selection = document.getSelection() // selection对象重构了toSring()方法,获取selection对象的选中内容var selectContent = selection.toString() var dealContent =selectContent +'转载请联系作者,内容地址:xxxxx'// 把重写后的内容写入到剪贴板  event.clipboardData.setData('text/plain', dealContent)}</script>

ClipboardEvent 事件有个最重要的属性clipboardData,该属性值是DataTransfer对象,这个对象在拖拽场景中经常使用,后面会专门写一篇文章来说说这个对象。

new BarcodeDetector解析二维码

// 创建检测器
const barcodeDetector = new BarcodeDetector({formats: ['qr_code']
})
barcodeDetector.detect(eleImg).then(barcodes => {console.log('barcodes', barcodes)barcodes.forEach(barcode => {result.innerHTML = `<span class="success">解析成功,结果是:</span>${barcode.rawValue}`})}).catch(err => {result.innerHTML = `<span class="error">解析出错:${err}</span>`})

浏览器提供了原生的API来解析二维码和条形码,即 Barcode Detection API。

formats表示要解析那种码,如下图所示:

这个 API 有一些兼容性的问题,在生成环境中还是尽量使用第三方库。

但是,作为前端开发,也应该时刻关注浏览器的发展,尽早的使用上最新好用的功能。

总结

通过学习上面的代码,可以发现自己在 css,js 方面上的不足,原因是缺乏探索性,老是用已有的知识来解决问题,或者直接去 github 上找第三方库,其实可以使用最简单的方式实现。


原文链接:
https://juejin.cn/post/7248874230862233655

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/211127.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js下载安装教程

一、下载安装包 1、百度网盘自提链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Bbw895MtUgjlfZylPHCCxw 提取码&#xff1a;x89v 2、进入官网下载 https://nodejs.org/zh-cn/download/ 选择对应版本&#xff0c;我这里选的windows64位版本 二、安装程序 1、…

C# Demo--汉字转拼音

1.Nuget安装NPOI及Pinyin4net 2.Demo 代码部分 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NPOI.SS.UserModel; using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using System.IO;…

【每日易题】Leetcode上Hard难度的动态规划题目——地下城游戏的实现

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;博主最近一直在钻研动态规划算法&#xff0c;最近在Leetcode上刷题的时候遇到一个Hard难度的动态规划题&#xff0c;今天就借此机会来给大家分享…

win11 install oh-my-posh

安装配置 下载 Nerd Fonts 字体 oh-my-posh font installNerd Fonts 网站下载&#xff0c;解压后右击安装 为终端设置 Nerd Fonts 字体 修改 Windows 终端设置&#xff08;默认快捷方式&#xff1a;CTRL SHIFT ,&#xff09;&#xff0c;在settings.json文件defaults属性下添…

在Linux上优化HTTP服务器的性能

在Linux上优化HTTP服务器的性能是一个涉及多个方面的任务&#xff0c;包括服务器硬件、网络设置、软件配置和内容优化。以下是一些关键的优化建议&#xff1a; 选择合适的HTTP服务器软件 Linux上有多种HTTP服务器软件&#xff0c;如Apache、Nginx、Lighttpd等。选择适合您需求…

uView ui 1x uniapp 表格table行内容长度不一导致高度不统一而出现的不对齐问题

问题 因为td单元格内空长度不定导致行单元格未对齐 解决&#xff1a; 重置td的高度&#xff1a;height:100% 改为height:auto !import <u-table><u-tr v-for"(item,index) in Lineinfo.Cust_Name" ><u-td style"height: auto !important;back…

8_企业架构缓存中间件分布式memcached

企业架构缓存中间件分布式memcached 学习目标和内容 1、能够理解描述网站业务访问流程 2、能够理解网站业务的优化方向 3、能够描述内存缓存软件Memcached的作用 4、能够通过命令行操作Memcached 5、能够操作安装php的memcached扩展 extension 6、能够实现session存储到memcach…

前端vue导出PPT幻灯片,使用pptxgen.js,超详细(赋原数据)

即上一篇文章最终代码 前端vue导出PPT&#xff0c;使用pptxgen.js 前端vue导出PPT&#xff0c;使用pptxgen.js 一个平台下有10个国家&#xff0c;这个是后端返回数据固定的&#xff0c;每一个国家下面有10个物流方式&#xff0c;这10个物流方式是这10个国家都有的&#xff0c;…

第二十一章 网络通信

21.1网络程序设计基础 21.1.1局域网与互联网 服务器是指提供信息的计算机程序&#xff0c;客户机是指请求信息的计算机程序。网络用于连接服务器与客户机&#xff0c;实现两者间的相互通信。 21.1.2网络协议 1. IP协议 IP是Internet Protocol的简称。 TCP/IP模式是一种层…

Ubuntu18.04 本地安装CVAT标注工具

写在前面&#xff1a; 1、如果直接clone最新版本的cvat&#xff0c;python版本最好安装3.8的&#xff0c;因为其中部分代码的语法只有高版本的python才可以支持。 2、安装完成以后本地登陆可能出现"cannot connect to cvat server"的错误&#xff0c;可以从Cannot …

使用求2个字符串最短编辑距离动态规划算法实现 git diff 算法 java 实现

测试类 MyDiffTest.java&#xff1a; import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.List;public class MyDiffTest {private static String path "\\xxx\\";private static List<String> lines…

【PUSDN】SpringBoot的jar进行解压后,替换其中的文件重新生成新的jar-SW

当你解压Spring Boot的JAR文件时&#xff0c;实际上是在打开一个压缩文件&#xff0c;类似于ZIP。你可以按照以下步骤进行替换文件并重新生成新的JAR&#xff1a; 解压原始的JAR文件&#xff1a; 使用任何ZIP工具&#xff08;如WinRAR、7-Zip或命令行工具&#xff09;&#xf…

[论文精读]序列建模使大视觉模型的规模化学习成为可能

本博客是一篇最新论文的精读&#xff0c;论文为UC伯克利大学及约翰霍普金斯大学相关研究者新近(2023.12.1)在arxiv上上传的《Sequential Modeling Enables Scalable Learning for Large Vision Models》 。知名科技新媒体“新智元”给与本文极高评价&#xff0c;并以《计算机视…

Linux(统信UOS) 发布.Net Core,并开启Https,绑定证书

实际开发中&#xff0c;有时会需要为小程序或者需要使用https的应用提供API接口服务&#xff0c;这就需要为.Net Core 配置https&#xff0c;配置起来很简单&#xff0c;只需要在配置文件appsettings.json中添加下面的内容即可 "Kestrel": {"Endpoints": …

一文带你了解云计算的未来发展趋势与优势

试问现在IT圈还有什么技术比较火&#xff1f;云在数字世界中扮演一个非常重要的角色&#xff0c;目前云计算还不算技术“红海”&#xff0c;它正处于高速发展前期的技术领域&#xff0c;现在早早转型过去&#xff0c;可能还能赶上一波技术红利&#xff0c;连目前大火的ChatGPT …

STM32-新建工程(标准库)

目录 STM32F10x新建工程&#xff08;标准库&#xff09; 移植文件夹 新建工程 添加启动文件和必需文件 在工程中加载新添加的文件 在工程中添加文件路径 在工程中添加main函数 添加lib库 添加必需文件 添加宏定义 点亮LED&#xff08;标准库&#xff09; STM32F10x新…

力扣题:字符的统计-12.4

力扣题-12.4 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;657. 机器人能否返回原点 解题思想&#xff1a;进行统计即可 class Solution(object):def judgeCircle(self, moves):""":type moves: str:rtype: bool""&qu…

安装获取mongodb

目录 本地安装 获取云上资源 获取Atlas免费数据库 本地连接数据库 在Atlas中连接数据库 本文适合初学者或mongodb感兴趣的同学来准备学习测试环境&#xff0c;或本地临时开发环境。mongodb是一个对用户非常友好的数据库。这种友好&#xff0c;不仅仅体现在灵活的数据结构和…

pre标签展示代码块

pre样式 添加背景色、边框、以及调整了字体大小。 pre { border: 1px solid #999; page-break-inside: avoid; display: block; padding: 3px 3px 2px; margin: 0 0 10px; font-size: 13px; line-height: 20px; word-break: break-all; word-wrap: break-word; /* white-space:…

​HTML代码混淆技术:原理、应用和实现方法详解

​HTML代码混淆技术&#xff1a;原理、应用和实现方法详解 HTML代码混淆是一种常用的反爬虫技术&#xff0c;它可以有效地防止爬虫对网站数据的抓取。本文将详细介绍HTML代码混淆技术的原理、应用以及实现方法&#xff0c;帮助大家更好地了解和运用这一技术。 一、HTML代码混淆…