亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

js+canvas實現滑動拼圖驗證碼功能

2024-05-06 16:43:19
字體:
來源:轉載
供稿:網友

js,滑動拼圖驗證碼,canvas,驗證碼

上圖為網易云盾的滑動拼圖驗證碼,其應該有一個專門的圖片庫,裁剪的位置是固定的。我的想法是,隨機生成圖片,隨機生成位置,再用canvas裁剪出滑塊和背景圖。下面介紹具體步驟。

首先隨便找一張圖片渲染到canvas上,這里#canvas作為畫布,#block作為裁剪出來的小滑塊。

js;"><canvas width="310" height="155" id="canvas"></canvas><canvas width="310" height="155" id="block"></canvas>var canvas = document.getElementById('canvas') var block = document.getElementById('block') var canvas_ctx = canvas.getContext('2d') var block_ctx = block.getContext('2d') var img = document.createElement('img') img.onload = function() {  canvas_ctx.drawImage(img, 0, 0, 310, 155)  block_ctx.drawImage(img, 0, 0, 310, 155) }; img.src = 'img.jpg'

js,滑動拼圖驗證碼,canvas,驗證碼

下面考慮如何裁剪出拼圖的形狀,拼圖形狀比較復雜,首先我們畫一個正方形,接著上邊的代碼寫:

var x = 150, y = 40, w = 42, r = 10, PI = Math.PI  function draw(ctx) {  ctx.beginPath()  ctx.moveTo(x, y)  ctx.lineTo(x + w, y)  ctx.lineTo(x + w, y + w)  ctx.lineTo(x, y + w)  ctx.clip() } draw(canvas_ctx) draw(block_ctx)

x,y為正方形左上角的坐標,現在先隨便寫后邊生成的時候用隨機數,w為正方形的邊長,r為后邊畫缺口的圓的半徑。我們先把繪圖過程用函數封裝起來,方便后面同時操作背景和滑塊。用clip()方法裁剪圖片后生成一個正方形。

js,滑動拼圖驗證碼,canvas,驗證碼

接下來畫正方形上邊和右邊的圓形:

function draw(ctx) {  ctx.beginPath()  ctx.moveTo(x,y)+  ctx.lineTo(x+w/2,y)+  ctx.arc(x+w/2,y-r+2, r,0,2*PI) //+  ctx.lineTo(x+w/2,y)  ctx.lineTo(x+w,y)+  ctx.lineTo(x+w,y+w/2)+  ctx.arc(x+w+r-2,y+w/2,r,0,2*PI) //+  ctx.lineTo(x+w,y+w/2)  ctx.lineTo(x+w,y+w)  ctx.lineTo(x,y+w)  ctx.lineTo(x,y)  ctx.clip() }

js,滑動拼圖驗證碼,canvas,驗證碼

兩處注釋的位置將圓心往內偏移了2px,實現缺口的樣式。然后是左邊空心的部分,由于clip是裁剪路徑內的部分,因此直接像上面畫圓是不行的,我們開啟一條新的路徑,然后畫圓將這個正方形“遮蓋”出一個缺口,這里會用到 globalCompositeOperation 屬性,'xor'顧名思義。代碼接上邊:

function draw(ctx) {  ctx.beginPath()  ...  ctx.lineTo(x,y)  ctx.clip()+  ctx.beginPath()+  ctx.arc(x,y+w/2, r,1.5*PI,0.5*PI) // 只需要畫正方形內的半圓就行,方便背景圖片的裁剪+  ctx.globalCompositeOperation = "xor"+  ctx.fill()}

js,滑動拼圖驗證碼,canvas,驗證碼

現在一個基本的拼圖形狀有了,我們調整#block的大小,并將裁剪出來的滑塊放入#block中:

img.onload = function() {  ctx.drawImage(img, 0, 0, 310, 155)  block_ctx.drawImage(img, 0, 0, 310, 155)+  var blockWidth = w + r * 2+  var _y = y - r * 2 + 2 // 滑塊實際的y坐標+  var ImageData = block_ctx.getImageData(x, _y, blockWidth, blockWidth)+  block.width = blockWidth+  block_ctx.putImageData(ImageData, 0, _y) }

js,滑動拼圖驗證碼,canvas,驗證碼

現在我們需要把左邊畫布展示原來的圖片,并且摳掉中間滑塊的部分,這里畫路徑的過程都是一樣的,唯一不同只是clip()那里改成fill()即可實現效果,我們前面已經把畫路徑的過程封裝成函數了,稍作改動即可:

- function draw(ctx) {+ function draw(ctx, operation) {  ...- ctx.clip()+ ctx.fillStyle = '#fff'+ ctx[operation]()  ...}+ draw(canvas_ctx, 'fill')+ draw(block_ctx, 'clip')

js,滑動拼圖驗證碼,canvas,驗證碼

接下來就是寫樣式了,略過:

js,滑動拼圖驗證碼,canvas,驗證碼

然后就是寫拖動事件,我們可以在鼠標按下時記錄鼠標位置,然后在拖動時給滑塊設置left值。最后在松開鼠標時,判斷滑塊此時的left值和最開始裁剪滑塊時的x值,如果在一定范圍內就算驗證通過,否則驗證失敗。

最后再加上隨機圖片和隨機剪切位置,基本就ok了。另外可以判斷下鼠標移動時y軸的變化,以判斷是否是“人”在操作,當然web安全這塊神魔亂舞的,我就不班門弄斧了,只是做個簡單判斷就行。

由于沒有給切片邊緣加上邊框或者陰影,導致某些圖片的滑塊可識別度不高,需要后邊完善下(其實是我還沒折騰出來- -),希望懂這塊的大神幫我完善下//

js,滑動拼圖驗證碼,canvas,驗證碼

后邊代碼比較雜亂,就不貼上來了, 查看完整代碼點這里 演示地址 點這里

總結

以上所述是小編給大家介紹的js+canvas實現滑動拼圖驗證碼功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩欧美大师| 亚洲精品美女久久久久| 亚洲天堂成人在线| 国产成人在线亚洲欧美| 日日狠狠久久偷偷四色综合免费| 国产精品一久久香蕉国产线看观看| 日韩av免费网站| 这里只有精品在线观看| 亚洲天堂影视av| 亚洲欧美国产制服动漫| 欧美高清视频在线观看| 日韩亚洲一区二区| 91中文字幕在线观看| 精品国产乱码久久久久久婷婷| 欧美自拍视频在线| 国产成人精品优优av| 国产精品白丝jk喷水视频一区| 欧美日韩免费区域视频在线观看| 日韩中文字幕免费| 91高清免费视频| 精品亚洲国产视频| 国产亚洲欧美一区| 亚洲国产欧美一区二区丝袜黑人| 亚洲日本中文字幕免费在线不卡| 亚洲理论片在线观看| 97国产suv精品一区二区62| 亚洲va欧美va在线观看| 亚洲综合中文字幕68页| 欧美视频专区一二在线观看| 日韩a**中文字幕| 午夜精品www| 国产精品成人aaaaa网站| 日韩精品在线观看一区| 亚洲一区亚洲二区| 日韩在线观看免费网站| 中文字幕一区电影| 国产一区二区精品丝袜| 欧美激情视频一区二区三区不卡| 久久久www成人免费精品张筱雨| 欧美日韩美女在线观看| 国模叶桐国产精品一区| 亚洲天堂男人天堂女人天堂| 国产精品亚洲视频在线观看| 色综合久久久888| 中文国产亚洲喷潮| 欧美日韩亚洲系列| 国外色69视频在线观看| 亚洲第一黄色网| 亚洲成人网在线| 国产精品成人一区二区| 亚洲xxx自由成熟| 亚洲国内高清视频| 中国日韩欧美久久久久久久久| 欧美日韩在线视频一区二区| 成人黄色av播放免费| 性欧美xxxx视频在线观看| 日韩精品欧美激情| 国产欧美日韩免费看aⅴ视频| 久久久久久香蕉网| 欧美性猛交xxxx乱大交极品| 91人人爽人人爽人人精88v| 国产999精品久久久| 91在线播放国产| 欧美理论电影在线观看| 色婷婷久久一区二区| 国产91色在线| 欧美激情aaaa| 久久伊人免费视频| 91久久久亚洲精品| 成人午夜在线视频一区| 国产精品久久久久不卡| 成人免费午夜电影| 国产精品女主播视频| 成人美女av在线直播| 97在线精品视频| 亚洲美女激情视频| 成人av在线天堂| 日韩不卡在线观看| 欧美成人小视频| 97国产在线观看| 国产精品久久久久久久久久尿| 久久天天躁狠狠躁夜夜躁2014| 久久精品在线视频| 欧美放荡办公室videos4k| 亚洲免费成人av电影| www.久久久久| 成人av在线天堂| 97在线日本国产| 国产精品jvid在线观看蜜臀| 国产精品成av人在线视午夜片| 国产裸体写真av一区二区| 国产日产亚洲精品| 国产69久久精品成人| 欧美成人午夜免费视在线看片| 日韩精品极品视频免费观看| 午夜精品一区二区三区在线视频| 欧美国产中文字幕| 91在线看www| 欧美激情亚洲综合一区| 国产精品网站大全| 在线观看精品国产视频| 欧美精品在线免费观看| 亚洲欧美在线免费| 亚洲天堂视频在线观看| 美女撒尿一区二区三区| 久久成人亚洲精品| 97精品久久久中文字幕免费| 亚洲春色另类小说| 北条麻妃久久精品| 欧美专区在线观看| 国产欧美精品一区二区三区-老狼| 亚洲爱爱爱爱爱| 国产精品中文字幕在线| 亚洲午夜女主播在线直播| 日韩av电影中文字幕| 亚洲精品成人网| 国产精品一区二区久久久| 欧美日本国产在线| 久久免费福利视频| 欧美色欧美亚洲高清在线视频| 91精品啪在线观看麻豆免费| 欧美孕妇性xx| 亚洲成年人在线| 伦理中文字幕亚洲| 精品国偷自产在线| 国产精彩精品视频| 日韩久久精品电影| 亚洲成av人片在线观看香蕉| 亚洲视频网站在线观看| 久久av.com| 91九色视频导航| 亚洲色图25p| 日韩欧美第一页| 欧美日韩国产在线| 国产偷国产偷亚洲清高网站| 亚洲天堂av综合网| 久久视频在线视频| 精品国产乱码久久久久久婷婷| 国产精品99蜜臀久久不卡二区| 国产精品观看在线亚洲人成网| 久久视频国产精品免费视频在线| 国产精品视频免费在线观看| 91国在线精品国内播放| 91精品国产高清自在线| 亚洲第一网中文字幕| 欧美日韩ab片| 国产午夜精品全部视频播放| 亚洲国产私拍精品国模在线观看| 国产丝袜高跟一区| 国产精品成人一区二区三区吃奶| 91久久国产婷婷一区二区| 国产精品久久久久久久久影视| 国产成人中文字幕| 国产精品久久久久一区二区| 亚洲丁香久久久| 国产精品午夜国产小视频| 成人激情视频网| 性欧美xxxx交| 精品一区二区三区四区在线| 欧美日本黄视频| 久久综合五月天| 97精品在线视频| 这里只有精品视频在线| 国产精品电影观看|