使用js进行简单的滑块验证是目前比较流行的验证方式,示例和代码实现如下:
按照示例讲解,首先,需要三张图,分别是背景图,盘子,苹果。
背景图是不动的,盘子的位置是随机的,随机数应该由随机数产生,调节盘子图片的left属性改变位置。即盘子的left属性为验证码。
苹果图在range控件的mousemove和valuechange时间下,苹果的位置根据range控件的拉动而改变。
根据苹果和盘子的相对位置进行判断,验证成功可以直接提交表单也间接控制某一button是否可用。
代码如下:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>滑动验证提交示例</title> <style> .yz-bg { border: 1px solid #000; height: 100px; width: 200px; background:url(../images/UI/y1.jpg) no-repeat center; } .yz-rdm { background:url(../images/UI/y2.png) no-repeat center; width:76px;height:36px; position: relative; bottom:-61px; left: 64px; } .yz-apple { background:url(../images/UI/y3.png) no-repeat center; width:60px;height:30px; position: relative; bottom:-28px; left: 72px; } input[type=range] { width: 200px; -webkit-appearance: none; border-radius: 10px; /*这个属性设置使填充进度条时的图形为圆角*/ } /*input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; }*/ input[type=range]::-webkit-slider-runnable-track { height: 15px; border-radius: 10px; /*将轨道设为圆角的*/ box-shadow: 0 1px 1px #def3f8, inset 0 .125em .125em #0d1112; /*轨道内置阴影效果*/ } input[type=range]:focus { outline: none; } input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; height: 25px; width: 25px; margin-top: -5px; /*使滑块超出轨道部分的偏移量相等*/ background: #ffffff; border-radius: 50%; /*外观设置为圆形*/ border: solid 0.125em rgba(205, 224, 230, 0.5); /*设置边框*/ box-shadow: 0 .125em .125em #3b4547; /*添加底部阴影*/ } </style> </head> <body> <form id="form1" runat="server"> <div > <div class="yz-bg "> <div runat="server" id="rmd" class="yz-rdm"></div> <div class="yz-apple" id="conSlide"></div> </div> <input type="range" id="range" value="0" onchange="rangechange()" onmousemove="rangechange()"/> </div> </form> </body> <script> function rangechange() { range.max = 160; conSlide.style.left = (range.value - 10) + "px"; var btn = document.getElementById("ContentPlaceHolder1_btn_comment"); var rmd = document.getElementById("ContentPlaceHolder1_rmd"); if (Math.abs(range.value - 10 - rmd.offsetLeft) < 10) { btn.disabled = false; btn.value = "回复"; btn.style.backgroundColor = "#3366ff"; } else { btn.value = "失效"; btn.disabled = true; btn.style.backgroundColor = "gray"; } } </script> </html>
目前基本实现了滑块验证的功能,虽然盘子位置随机数是服务器产生,但盘子的left属性是可读的,因此input-range的数值区间可以估算得出。更安全的做法可以:在后台把盘子和背景图片叠层为一张图片,拖拽range控件时与后台保存的随机数进行验证。前台代码改变不大。