效果展示
js图形随机验证码(表单验证)
html代码片段
<form class="formwrap"><div class="item"><input type="text" id="code_input" value="" placeholder="请输入验证码"/><div id="v_container"></div><p class="Error onError textyc"></p></div>
</form>
css样式
.formwrap{width: 400px;box-sizing: border-box;padding: 40px 20px;box-shadow: 0px 0px 2px 3px rgba(0,0,0,0.05);border-radius: 10px;position: relative;margin: auto;margin-top: 200px;}
.formwrap .item{width: 100%;display: flex;display: -webkit-flex;position: relative;justify-content: space-between;-webkit-justify-content: space-between;}
.formwrap .item input{width: calc(100% - 150px);height: 50px;border: 1px solid #ddd;box-sizing: border-box;padding: 0 12px;font-size: 14px;border-radius: 4px;outline: none;}
#v_container{width: 140px;height: 50px;border-radius: 4px;overflow: hidden;}
.formwrap .item .onError{font-size: 12px;color: #f00;position: absolute;bottom: 45px;box-sizing: border-box;padding: 5px;background-color: #ffff;border-radius: 4px;margin-top: 0;z-index: 1;filter: drop-shadow(0px 1px 2px rgba(0,0,0,0.2));}
.formwrap .item .onError::before{content: '';display: block;border: 5px solid transparent;border-top-color: #fff;position: absolute;left: 50%;bottom: -10px;margin-left: -2px;}
.formwrap .item .onError.textyc{opacity: 0;}
js代码片段
gVerify.js插件
!(function(window, document) {var size = 5;//设置验证码长度function GVerify(options) { //创建一个图形验证码对象,接收options对象为参数this.options = { //默认options参数值id: "", //容器IdcanvasId: "verifyCanvas", //canvas的IDwidth: "100", //默认canvas宽度height: "30", //默认canvas高度type: "blend", //图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母code: "",}if(Object.prototype.toString.call(options) == "[object Object]"){//判断传入参数类型for(var i in options) { //根据传入的参数,修改默认参数值this.options[i] = options[i];}}else{this.options.id = options;}this.options.numArr = "0,1,2,3,4,5,6,7,8,9".split(",");this.options.letterArr = getAllLetter();this._init();this.refresh();}GVerify.prototype = {/**版本号**/version: '1.0.0',/**初始化方法**/_init: function() {var con = document.getElementById(this.options.id);var canvas = document.createElement("canvas");this.options.width = con.offsetWidth > 0 ? con.offsetWidth : "100";this.options.height = con.offsetHeight > 0 ? con.offsetHeight : "30";canvas.id = this.options.canvasId;canvas.width = this.options.width;canvas.height = this.options.height;canvas.style.cursor = "pointer";canvas.innerHTML = "您的浏览器版本不支持canvas";con.appendChild(canvas);var parent = this;canvas.onclick = function(){parent.refresh();}},/**生成验证码**/refresh: function() {this.options.code = "";var canvas = document.getElementById(this.options.canvasId);if(canvas.getContext) {var ctx = canvas.getContext('2d');}else{return;}ctx.textBaseline = "middle";ctx.fillStyle = randomColor(180, 240);ctx.fillRect(0, 0, this.options.width, this.options.height);if(this.options.type == "blend") { //判断验证码类型var txtArr = this.options.numArr.concat(this.options.letterArr);} else if(this.options.type == "number") {var txtArr = this.options.numArr;} else {var txtArr = this.options.letterArr;}for(var i = 1; i <=size; i++) {var txt = txtArr[randomNum(0, txtArr.length)];this.options.code += txt;ctx.font = randomNum(this.options.height/2, this.options.height) + 'px SimHei'; //随机生成字体大小ctx.fillStyle = randomColor(50, 160); //随机生成字体颜色 ctx.shadowOffsetX = randomNum(-3, 3);ctx.shadowOffsetY = randomNum(-3, 3);ctx.shadowBlur = randomNum(-3, 3);ctx.shadowColor = "rgba(0, 0, 0, 0.3)";var x = this.options.width / (size+1) * i;var y = this.options.height / 2;var deg = randomNum(-30, 30);/**设置旋转角度和坐标原点**/ctx.translate(x, y);ctx.rotate(deg * Math.PI / 180);ctx.fillText(txt, 0, 0);/**恢复旋转角度和坐标原点**/ctx.rotate(-deg * Math.PI / 180);ctx.translate(-x, -y);}/**绘制干扰线**/for(var i = 0; i < 4; i++) {ctx.strokeStyle = randomColor(40, 180);ctx.beginPath();ctx.moveTo(randomNum(0, this.options.width), randomNum(0, this.options.height));ctx.lineTo(randomNum(0, this.options.width), randomNum(0, this.options.height));ctx.stroke();}/**绘制干扰点**/for(var i = 0; i < this.options.width/4; i++) {ctx.fillStyle = randomColor(0, 255);ctx.beginPath();ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);ctx.fill();}},/**验证验证码**/validate: function(code){var code = code.toLowerCase();var v_code = this.options.code.toLowerCase();if(code == v_code){return true;}else{this.refresh();return false;}}}/**生成字母数组**/function getAllLetter() {var letterStr = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";return letterStr.split(",");}/**生成一个随机数**/function randomNum(min, max) {return Math.floor(Math.random() * (max - min) + min);}/**生成一个随机色**/function randomColor(min, max) {var r = randomNum(min, max);var g = randomNum(min, max);var b = randomNum(min, max);return "rgb(" + r + "," + g + "," + b + ")";}window.GVerify = GVerify;
})(window, document);
<script src="js/jquery.js"></script>
<script src="js/gVerify.js"></script>
<script>
var code_input = $("#code_input").val();
var verifyCode = new GVerify("v_container");
$("#code_input").focus(function(){$(this).parent().find('.onError').text('');$(this).parent().find('.onError').addClass('textyc')
})
$("#code_input").blur(function(){code_input=$(this).val();var res = verifyCode.validate(document.getElementById("code_input").value);if($(this).val()==""){$(this).parent().find('.onError').text('验证码不能为空');$(this).parent().find('.onError').removeClass('textyc')}else if(res){console.log("验证正确");$(this).parent().find('.onError').text('');$(this).parent().find('.onError').removeClass('Error');$(this).parent().find('.onError').addClass('textyc')}else{console.log("验证码错误");$(this).parent().find('.onError').text('验证码错误');$(this).parent().find('.onError').removeClass('textyc')}
});
</script>