web前端之行为验证码、不同设备和屏幕尺寸呈现不同大小、元素宽度根据视口宽度进行调整、元素或图片裁剪、图片验证码

MENU

  • 前言
  • 版本一(html+JS+css)
  • 版本二(html+JS+css+canvas)


前言

1、版本一的样式比较齐全;
2、版本二的JS逻辑和功能效果比较完善,且是别人的代码,后续会对样式进行完善。[Gitee | 哔哩哔哩];
3、两个版本各有千秋,主要学习里面的一些技巧,这里主要介绍版本一的样式技巧;
4、行为验证码一般是后端实现,而且大概率是使用第三方插件,因为涉及到的逻辑和内容比较多,前后端实现起来都比较麻烦。


版本一(html+JS+css)

案例公共样式

body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;min-height: 100vh;
}

案例一(clip-path裁剪的应用)

<style>.clip_path {width: 300px;height: 300px;background-color: #ff0000;}.clip_path:first-child {float: left;background-color: #0000ff;clip-path: inset(50px 20px 30px 40px round 10px);}
</style><div><div class="clip_path"></div><div class="clip_path"></div>
</div>

案例一解析

代码块中包含两个<div>元素,每个元素都有类名为clip_path。此外,还有一些CSS样式被应用于这些元素。


CSS样式部分
1、clip_path类指定了一个固定的宽度(300像素)、高度(300像素)和背景颜色(红色)的区域。
2、clip_path:first-child选择器用于选择第一个具有类名clip_path的元素,并对其应用特定样式。
2.1、float: left;将第一个元素左浮动,使其在其右侧的元素之前显示。
2.2、background-color: #0000ff;将第一个元素的背景颜色更改为蓝色。
2.3、clip-path: inset(50px 20px 30px 40px round 10px);将剪切路径应用于第一个元素,剪切路径的形状是一个矩形,内边距为50px 20px 30px 40px,并且角是圆形的,半径为10px。


HTML部分
两个<div>元素被包含在一个外部<div>中。
每个<div>元素都有类名为clip_path,因此它们都受到了相同的CSS样式的影响。


综上所述,代码将显示两个相同大小的红色方块,但第一个方块的背景颜色为蓝色,并具有一种剪切路径,使其内部形成一个圆角矩形区域。


案例一效果图

case11


案例二(clamp最大值最小值的应用)

<style>.clamp {width: clamp(300px, 50vw, 600px);height: 300px;background-color: #ff0000;}
</style><div class="clamp"></div>

案例二解析

一段简单的HTML和CSS代码段,用于创建一个具有限制宽度的元素。


1、<style>标签用于在HTML文档中定义CSS样式。
2、.clamp是一个CSS类选择器,它用于选择具有类名为"clamp"的HTML元素。
3、width: clamp(300px, 50vw, 600px);是一个CSS属性,它使用clamp()函数来设置元素的宽度。clamp()函数接受三个参数,分别是最小宽度、首选宽度和最大宽度。在这个例子中,元素的宽度将被限制在300像素、视窗宽度的50%和600像素之间,以保证在不同设备和屏幕尺寸下有不同的大小。
4、height: 300px;设置元素的高度为300像素。
5、background-color: #ff0000;设置元素的背景颜色为红色。


<div class=“clamp”></div>是一个HTML<div>元素,它具有一个类名为"clamp",因此应用了上述定义的CSS样式。这个<div>元素将具有限制宽度的特性,宽度将根据视窗宽度和定义的最小和最大宽度进行调整,以便在不同设备和屏幕尺寸下呈现出不同的大小。


案例二效果图

case21


case22


功能效果图

imageverificationCodeV11


imageverificationCodeV12


imageverificationCodeV13


html

<div id="captcha"><div id="handle"><span onmousedown="onmousedownFn()" mousemove="mousemoveFn()"></span></div>
</div>

JavaScript

const captcha = document.querySelector('#captcha');
const handle = document.querySelector('#handle');
const button = document.querySelector('#handle span');
const oLeft = handle.getBoundingClientRect().left;
const buttonWidth = button.getBoundingClientRect().width;
let flag = false;function onmousedownFn() {flag = true;
}window.addEventListener('mousemove', ({ clientX }) => {if (flag) {captcha.style.setProperty('--moved', `${clientX - oLeft - buttonWidth / 2}px`);}
});window.addEventListener('mouseup', ({ clientX }) => {if (flag) {const dis = clientX - oLeft;if (dis >= 430 && dis <= 450) {captcha.classList.add('passed');alert('验证通过!');} else {captcha.style.setProperty('--moved', '0px');}flag = false;}
});

style

* {margin: 0;padding: 0;
}body {--width: 400px;--height: 260px;--puzzle-width: 80px;--puzzle-height: 80px;--moved: 0px;background-color: #008b8b;width: 100vw;height: 100vh;display: flex;justify-content: center;align-items: center;
}#captcha {width: var(--width);height: var(--height);background-image: url('https://cn.bing.com/th?id=OHR.AlmondBloom_ZH-CN9441550492_1920x1080.jpg');background-size: cover;background-position: center;position: relative;border-radius: 4px;box-shadow: 0px 2px 4px rgba(0, 0, 0, .3);
}#captcha::before,
#captcha::after {display: flex;position: absolute;content: '';width: inherit;height: inherit;background-image: inherit;background-size: inherit;background-position: inherit;clip-path: inset( calc((var(--height) - var(--puzzle-height)) / 2) var(--puzzle-width) calc((var(--height) - var(--puzzle-height)) / 2) calc(var(--width) - var(--puzzle-width) * 2));
}#captcha::after {transform: translateX(clamp( calc(var(--width) * -1), calc(var(--width) * -1 + var(--moved)), var(--puzzle-width)));transition: .25s all ease-in-out;cursor: pointer;
}#captcha:active::after {transition: none;
}#captcha::before {background-color: rgba(0, 0, 0, .6);background-blend-mode: multiply;
}#handle {height: 30px;width: calc(var(--width) + var(--puzzle-width) * 2);border-radius: 18px;background-color: #eeeeee;box-shadow: inset 0 0 12px rgba(0, 0, 0, .2);border: 3px solid #eeeeee;position: absolute;bottom: -50px;left: calc(var(--puzzle-width) * 2 * -1);
}#handle span {width: var(--puzzle-width);height: inherit;display: block;border-radius: inherit;background-color: #fff;box-shadow: 0 0 6px rgba(0, 0, 0, .25), 0 2px 4px rgba(0, 0, 0, .3);cursor: move;transform: translateX( clamp( 0px, var(--moved), calc(var(--width) + var(--puzzle-width))));cursor: pointer;transition: .25s all ease-in-out;
}#captcha:active #handle span {transition: none;
}#captcha.passed::before,
#captcha.passed::after,
#captcha.passed #handle {opacity: 0;
}

版本二(html+JS+css+canvas)

效果图

imageverificationCodeV21


imageverificationCodeV22


imageverificationCodeV23


html

<div class="container"><div id="captcha" style="position: relative;"></div><div id="msg"></div>
</div><script src="./indexV2.js"></script>
<script>captcha.init(document.getElementById('captcha'), function() {document.getElementById('msg').innerHTML = '验证成功';setTimeout(() => {document.getElementById('msg').innerHTML = '';}, 2000);}, function() {document.getElementById('msg').innerHTML = '验证失败';setTimeout(() => {document.getElementById('msg').innerHTML = '';}, 1000);})
</script>

JavaScript

(function(win) {// 滑块边长let l = 42,// 滑块半径r = 10,// canvas宽度w = 310,//canvas高度h = 155,PI = Math.PI;// 滑块的实际边长const ll = l + r * 2;// 获取指定区间内的随机数function getRandomNumberByRange(start, end) {return Math.round(Math.random() * (end - start) + start);}// 创建元素function createElement(tagName) {return document.createElement(tagName);}// 创建画布function createCanvas(width, height) {const canvas = createElement('canvas');canvas.width = width;canvas.height = height;return canvas;}// 获取随机图片function getRandomImg() {// 这个网站可以生成随机图片return 'https://picsum.photos/300/150/?image=' + getRandomNumberByRange(0, 100);}// 创建图片function createImg(onload) {const img = createElement('img');img.crossOrigin = 'Anonymous';img.onload = onload;img.onerror = () => {img.src = getRandomImg();}img.src = getRandomImg();return img;}// 添加样式function addClass(tag, className) {tag.classList.add(className);}// 移除样式function removeClass(tag, className) {tag.classList.remove(className);}// 绘制function draw(ctx, operation, x, y) {ctx.beginPath();ctx.moveTo(x, y);ctx.lineTo(x + l / 2, y);ctx.arc(x + l / 2, y - r + 2, r, 0, 2 * PI);ctx.lineTo(x + l / 2, y);ctx.lineTo(x + l, y);ctx.lineTo(x + l, y + l / 2);ctx.arc(x + l + r - 2, y + l / 2, r, 0, 2 * PI);ctx.lineTo(x + l, y + l / 2);ctx.lineTo(x + l, y + l);ctx.lineTo(x, y + l);ctx.lineTo(x, y);ctx.fillStyle = '#fff';ctx[operation]();ctx.beginPath();ctx.arc(x, y + l / 2, r, 1.5 * PI, 0.5 * PI);ctx.globalCompositeOperation = 'xor';ctx.fill();}// 求和function sum(x, y) {return x + y;}// 求平方function square(x) {return x * x;}// 验证码类class captcha {// 构造器constructor(el, success, fail) {this.el = el;this.success = success;this.fail = fail;}// 初始化init() {this.initDOM();this.initImg();this.draw();this.bindEvents();}// 初始化DOMinitDOM() {const canvas = createCanvas(w, h),block = canvas.cloneNode(true),sliderContainer = createElement('div'),sliderMask = createElement('div'),slider = createElement('div'),refreshIcon = createElement('div'),sliderIcon = createElement('span'),text = createElement('span');block.className = 'block';sliderContainer.className = 'slider-container';sliderMask.className = 'slider-mask';slider.className = 'slider';refreshIcon.className = 'refresh-icon';sliderIcon.className = 'slider-icon';text.className = 'slider-text';text.innerHTML = '向右滑动滑块填充拼图';const el = this.el;el.appendChild(canvas);el.appendChild(refreshIcon);el.appendChild(block);slider.appendChild(sliderIcon);sliderMask.appendChild(slider);sliderContainer.appendChild(sliderMask);sliderContainer.appendChild(text);el.appendChild(sliderContainer);Object.assign(this, {canvas,block,sliderContainer,refreshIcon,slider,sliderMask,sliderIcon,text,canvasCtx: canvas.getContext('2d'),blockCtx: block.getContext('2d')});}// 初始化图像initImg() {const img = createImg(() => {this.canvasCtx.drawImage(img, 0, 0, w, h);this.blockCtx.drawImage(img, 0, 0, w, h);const y = this.y - r * 2 + 2;const imageData = this.blockCtx.getImageData(this.x, y, ll, ll);this.block.width = ll;this.blockCtx.putImageData(imageData, 0, y);});this.img = img;}// 绘画draw() {this.x = getRandomNumberByRange(ll + 10, w - (ll + 10));this.y = getRandomNumberByRange(10 + r * 2, h - (ll + 10));draw(this.canvasCtx, 'fill', this.x, this.y);draw(this.blockCtx, 'clip', this.x, this.y);}// 清除clean() {this.canvasCtx.clearRect(0, 0, w, h);this.blockCtx.clearRect(0, 0, w, h);this.block.width = w;}// 绑定事件bindEvents() {this.el.onselectstart = () => false;this.refreshIcon.onclick = () => {this.reset();}let originX, originY, trail = [],isMouseDown = false;this.slider.addEventListener('mousedown', function(e) {originX = e.x;originY = e.y;isMouseDown = true;});document.addEventListener('mousemove', (e) => {if (!isMouseDown) return false;const moveX = e.x - originX;const moveY = e.y - originY;if (moveX < 0 || moveX + 38 >= w) return false;this.slider.style.left = moveX + 'px';var blockLeft = (w - 40 - 20) / (w - 40) * moveX;this.block.style.left = blockLeft + 'px';addClass(this.sliderContainer, 'slider-container-active');this.sliderMask.style.width = moveX + 'px';trail.push(moveY);});document.addEventListener('mouseup', (e) => {if (!isMouseDown) return false;isMouseDown = false;if (e.x == originX) return false;removeClass(this.sliderContainer, 'slider-container-active');this.trail = trail;const spliced = this.verify();if (spliced) {addClass(this.sliderContainer, 'slider-container-success');this.success && this.success();} else {addClass(this.sliderContainer, 'slider-container-fail');this.fail && this.fail();setTimeout(() => {this.reset();}, 1000);}});}// 重置reset() {this.sliderContainer.className = 'slider-container';this.slider.style.left = 0;this.block.style.left = 0;this.sliderMask.style.width = 0;this.clean();this.img.src = getRandomImg();this.draw();}// 验证verify() {const left = parseInt(this.block.style.left);//10表示容错率,值越小,需要拼得越精确return Math.abs(left - this.x) < 10;}}win.captcha = {init: function(element, success, fail) {new captcha(element, success, fail).init();}}
}(window));

style

* {margin: 0;padding: 0;background-color: #333333;
}body {/* 方便演示,满屏居中 */height: 100vh;display: flex;justify-content: center;align-items: center;
}/* 小拼图 */.block {position: absolute;left: 0;top: 0;
}/* 滑动条 */.slider-container {position: relative;text-align: center;width: 310px;height: 40px;line-height: 40px;margin-top: 15px;background-color: #f7f9fa;color: #45454c;border: 1px solid #e4e7eb;
}.slider-mask {position: absolute;left: 0;top: 0;height: 40px;border: 0px solid #1991fa;background-color: #d1e9fe;
}.slider {position: absolute;left: 0;top: 0;width: 40px;height: 40px;background: #fff;box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);cursor: pointer;transition: background 0.2s linear;
}.slider-icon {position: absolute;left: 13px;top: 15px;width: 14px;height: 10px;background: url(/images/icon_light.png) 0 -26px;background-size: 34px 471px;
}/* 滑动条活动态 */.slider-container-active .slider {height: 38px;top: -1px;border: 1px solid #1991fa;
}.slider-container-active .slider-mask {height: 38px;border-width: 1px;
}/* 滑动条成功态 */.slider-container-success .slider {height: 38px;top: -1px;border: 1px solid #52ccba;background-color: #52ccba !important;
}.slider-container-success .slider-mask {height: 38px;border: 1px solid #52ccba;background-color: #d2f4ef;
}/* 成功图标 */.slider-container-success .slider-icon {background-position: 0 0 !important;
}/* 滑动条失败态 */.slider-container-fail .slider {height: 38px;top: -1px;border: 1px solid #f57a7a;background-color: #f57a7a !important;
}.slider-container-fail .slider-mask {height: 38px;border: 1px solid #f57a7a;background-color: #fce1e1;
}/* 失败图标 */.slider-container-fail .slider-icon {background-position: 0 -83px !important;
}.slider-container-active .slider-text,
.slider-container-success .slider-text,
.slider-container-fail .slider-text {display: none;
}.slider:hover {background: #1991fa;
}.slider:hover .slider-icon {background-position: 0 -13px;
}.refresh-icon {position: absolute;right: 0;top: 0;width: 34px;height: 34px;background: url(/images/icon_light.png) 0 -437px;background-size: 34px 471px;cursor: pointer;
}#msg {height: 20px;line-height: 20px;text-align: center;margin-top: 15px;
}

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

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

相关文章

CRC计算流程详解和FPGA实现

一、概念 CRC校验&#xff0c;中文翻译过来是&#xff1a;循环冗余校验&#xff0c;英文全称是&#xff1a;Cyclic Redundancy Check。是一种通过对数据产生固定位数的校验码&#xff0c;以检验数据是否存在错误的技术。 其主要特点是检错能力强、开销小&#xff0c;易于电路实…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 概述 深度神经网络&#xff08;Deep Neural Network…

SQLiteC/C++接口详细介绍sqlite3_stmt类(六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;七&#xff09; 17. sqlite3_clear_bindings函数 sqlite3_clear_bindings函…

Day44:WEB攻防-PHP应用SQL盲注布尔回显延时判断报错处理增删改查方式

目录 PHP-MYSQL-SQL操作-增删改查 PHP-MYSQL-注入函数-布尔&报错&延迟 基于布尔的SQL盲注-逻辑判断(需要有回显,没回显搞不了)跟union需要的条件差不多 基于时间的SQL盲注-延时判断(不需要任何回显) 基于报错的SQL盲注-报错回显(需要报错回显&#xff0c;没报错回…

【LabVIEW FPGA入门】FPGA 存储器(Memory)

可以使用内存项将数据存储在FPGA块内存中。内存项以2kb为倍数引用FPGA目标上的块内存。每个内存项引用一个单独的地址或地址块&#xff0c;您可以使用内存项访问FPGA上的所有可用内存。如果需要随机访问存储的数据&#xff0c;请使用内存项。 内存项不消耗FPGA上的逻辑资源&…

leetcode 2671

leetcode 2671 题目 例子 思路1 使用哈希&#xff0c; unordered_map 是基于hash 实现的key,val 存储。 代码1 class FrequencyTracker {unordered_map<int, int>m;public:FrequencyTracker() { }void add(int number) {if(m.find(number) m.end()){m.insert({num…

备战蓝桥杯---牛客寒假算法基础集训6

1.并查集数学 分析&#xff1a; 首先我们知道算数基本定理&#xff0c;如果两个数有大于1的质因子&#xff0c;那么我们就需要把他们放在同一个集合&#xff0c;因此我们可以用欧拉刷出1e6范围内的素数&#xff0c;然后依次看输入的数。 拿202*2*5举例子&#xff0c;我们在求…

算法系列--链表刷题(二)

&#x1f495;"轻舟已过万重山"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–链表刷题(二) 今天为大家带来的是算法系列--链表刷题(二),带来了几道经典的有关链表的面试题(合并K个有序列表) 1.两数相加 https://leetcode.cn/problems/a…

测试ALPHA开发板CAN1的设备树文件

一. 简介 前面一篇文章学习了 ALPHA开发板上的 CAN接口的设备节点信息&#xff0c;文章如下&#xff1a; ALPHA开发板修改CAN的设备树节点信息-CSDN博客 本文对设备树文件进行测试&#xff0c;即开发板加载 .dtb设备树文件。 二. 加载测试 CAN的设备树文件 1. 拷贝设备树…

fiddler过滤器使用,隐藏图片、js、css请求

如果抓包过程中不想查看图片、js、css请求&#xff0c;或者只想抓某个ip或者某个网页下的请求&#xff0c;可以在过滤器中设置。 &#xff08;1&#xff09;没有开启过滤器 可以看出所有的请求都会抓取&#xff0c;cs、js、图片请求都有 &#xff08;2&#xff09;开启过滤器 …

dubbo 源码系列之-集群三板斧---负载均衡(二)

在上一课时我们了解了 LoadBalance 接口定义以及 AbstractLoadBalance 抽象类的内容&#xff0c;还详细介绍了 ConsistentHashLoadBalance 以及 RandomLoadBalance 这两个实现类的核心原理和大致实现。本课时我们将继续介绍 LoadBalance 的剩余三个实现。 LeastActiveLoadBala…

MySQL | 视图

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 1.1. 创建视图 create view 视图名 as select语句&#xff1b; 创建测…

hcip实验

一、实验拓扑 二、实验划分 AR1的Serial3/0/0接口&#xff1a;192.168.1.1/24&#xff1b; AR2的Serial3/0/0接口&#xff1a;192.168.1.2/24&#xff1b; AR2的Serial3/0/1和4/0/0的聚合接口&#xff1a;192.168.2.2/24&#xff1b; AR3的Serial3/0/0和3/0/1的聚合接口&am…

网络安全实训Day8

写在前面 网络工程终于讲完了。这星期到了网络安全技术部分。 网络安全实训-网络安全技术 网络安全概述 信息安全&#xff1a;所有保障计算机硬件、系统、软件、数据不因有意或无意的行为导致的服务中断、数据损坏或丢失等安全事件的保障技术 网络安全&#xff1a;基于计算机…

C/C++之内存旋律:星辰大海的指挥家

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、C/C内存分布 我们先来了解一下C/C内存分配的几个区域&#xff0c;以下面的代码为例来看…

机器学习——决策树剪枝算法

机器学习——决策树剪枝算法 决策树是一种常用的机器学习模型&#xff0c;它能够根据数据特征的不同进行分类或回归。在决策树的构建过程中&#xff0c;剪枝算法是为了防止过拟合&#xff0c;提高模型的泛化能力而提出的重要技术。本篇博客将介绍剪枝处理的概念、预剪枝和后剪…

C语言内存函数(1)【memcpy函数的使用与模拟实现】【memmove函数的使用和模拟实现】

关于内存函数有四个函数需要我们学习。分别是memcpy&#xff0c;memmove&#xff0c;memset和memcmp。都在头文件string.h里面。 一.memcpy函数的使用 一提到这个函数&#xff0c;我们可能会联想到strcpy函数&#xff0c;但strcpy函数是针对字符串的拷贝。但是我们在写代码的…

百度文心一言(ERNIE bot)API接入Android应用

百度文心一言&#xff08;ERNIE bot&#xff09;API接入Android应用实践 - 拾一贰叁 - 博客园 (cnblogs.com) Preface: 现在生成式AI越来越强大了&#xff0c;想在android上实现一个对话助手的功能&#xff0c;大概摸索了一下接入百度文心一言API的方法。 与AI助手交换信息的…

C++类的6个默认成员函数(构造)

C类和对象基础-CSDN博客https://blog.csdn.net/lh11223326/article/details/136834917?spm1001.2014.3001.5501 目录 1.构造函数 概念 特性 2.析构函数 概念 特性 3.拷贝构造函数 概念 特征 4.赋值运算符重载&#xff08;构造实现&#xff09; 运算符重载 赋值运算…

Kafka快速入门及使用

入门 官网 简介 Kafka是一个分布式的流媒体平台应用&#xff1a; 消息系统日志收集用户行为追踪流式处理 特点 高吞吐量消息持久化高可靠性高扩展性 常用术语 Broker&#xff1a;集群中的服务器Zookeeper&#xff1a;服务管理Topic&#xff1a;主题&#xff0c;Kafka发…