js實(shí)現(xiàn)移動(dòng)端圖片滑塊驗(yàn)證功能
之前寫過一篇uniapp框架的滑塊驗(yàn)證,今天抽個(gè)空用原生js實(shí)現(xiàn)這個(gè)功能,pc端暫時(shí)不做,因?yàn)閜c端只要把touch事件改成mouse事件就能實(shí)現(xiàn),這里就不再重復(fù)寫了。
(最新完美版本,js+canvas實(shí)現(xiàn),兼容pc,ie9和移動(dòng),js+cavans實(shí)現(xiàn)圖片滑塊驗(yàn)證)
老樣子,還是先看效果

原理和上篇uniapp的滑塊一樣,不一樣的是這里是純js實(shí)現(xiàn),代碼是全部是自己寫的,有不清楚的可以留言。
下面是全部代碼:
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.sliderModel {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
display: none;
}
.title {
width: 100%;
height: 60px;
font-size: 18px;
color: #333;
display: flex;
align-items: center;
justify-content: center;
}
.cont {
position: relative;
background: #fff;
width: 300px;
border-radius: 8px;
overflow: hidden;
padding-bottom: 20px;
}
.imgWrap {
position: relative;
width: 280px;
height: 150px;
border-radius: 8px;
margin: 0 auto;
overflow: hidden;
}
#sliderRefresh {
position: absolute;
top: 20px;
right: 30px;
cursor: pointer;
color: green;
}
.img {
display: block;
width: 100%;
height: 100%;
}
.sliderOver {
position: absolute;
left: 0;
top: 0;
width: 50px;
height: 50px;
background: #ddd;
box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3);
}
.smartImg {
position: absolute;
z-index: 2;
left: 0;
top: 0;
width: 50px;
height: 50px;
overflow: hidden;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.simg {
position: absolute;
display: block;
width: 280px;
height: 150px;
}
.sliderBox {
width: 280px;
margin: 10px auto 0;
height: 36px;
position: relative;
}
.sliderF {
width: 100%;
height: 100%;
z-index: 3;
}
.sliderS {
cursor: pointer;
position: absolute;
left: 0;
top: 0;
z-index: 2;
height: 36px;
width: 36px;
background: #007cff;
border-radius: 36px;
display: flex;
justify-content: center;
align-items: center;
}
.icon {
width: 20px;
height: 20px;
}
.bgC {
position: absolute;
z-index: 1;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 100%;
height: 30px;
border-radius: 30px;
line-height: 30px;
font-size: 14px;
color: #999999;
box-shadow: inset 0 0 4px #ccc;
text-align: center;
overflow: hidden;
}
.bgC_left {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
width: 0;
height: 28px;
border-top-left-radius: 28px;
border-bottom-left-radius: 28px;
line-height: 28px;
font-size: 14px;
background-color: #eee;
box-shadow: inset 0 0 4px #ccc;
text-align: center;
}
.showMessage {
text-align: center;
font-size: 14px;
height: 30px;
line-height: 30px;
}
#closeBtn {
position: fixed;
z-index: 10;
bottom: 10px;
left: 50%;
}
</style>
</head>
<body>
<div id="clickBtn">點(diǎn)擊</div>
<div class="sliderModel">
<div class="cont">
<div class="title">圖形驗(yàn)證</div>
<div id="sliderRefresh">刷新</div>
<div class="imgWrap" id="imgWrap">
<img class="img" src="" />
<div class="sliderOver" id="sliderOver"></div>
<div class="smartImg" id="smartImg">
<img class="simg" src="" />
</div>
</div>
<div class="sliderBox">
<div class="sliderF" id="slider">
<div class="sliderS" id="sliderBtn">
<img class="icon" src="images/slider/sangangy.png" />
</div>
</div>
<div class="bgC">
拖動(dòng)左邊滑塊完成上方拼圖
<div class="bgC_left" id="bgC_left"></div>
</div>
</div>
<div class="showMessage">
</div>
</div>
</div>
<div id="closeBtn">關(guān)閉</div>
</body>
<script src="slider.js"></script>
<script>
var object = {
bImg: 'imgWrap',
sImg: 'smartImg',
sImgOver: 'sliderOver',
sliderF: 'slider',
sliderBtn: 'sliderBtn',
sliderBg: 'bgC_left',
refreshBtn: 'sliderRefresh',
range: 5,
imgArr: ['images/sliderz/1.jpg', 'images/sliderz/2.jpg', 'images/sliderz/3.jpg', 'images/sliderz/4.jpg',
'images/sliderz/5.jpg'
],
refreshCallback: function (e) {
var showMessage = document.getElementsByClassName('showMessage')[0];
showMessage.innerHTML = "";
showMessage.style.color = "#333";
},
callback: function (e) {
var showMessage = document.getElementsByClassName('showMessage')[0];
if (!e) {
showMessage.innerHTML = "驗(yàn)證失敗,請(qǐng)重新驗(yàn)證";
showMessage.style.color = "red";
} else {
showMessage.innerHTML = "驗(yàn)證成功!";
showMessage.style.color = "green";
}
},
}
var mSlider = null;
document.getElementById('clickBtn').onclick = function () {
document.getElementsByClassName('sliderModel')[0].style.display = "flex";
mSlider = new window.mobileSlider(object)
}
document.getElementById('closeBtn').onclick = function () {
document.getElementsByClassName('sliderModel')[0].style.display = "none";
}
</script>
</html>
js部分(slider.js)
(function () {
function mobileSlider(params) {
var object = {
bImg: params.bImg, //大圖片的盒子
sImg: params.sImg, //圖片上的小圖片
sImgOver: params.sImgOver, //圖片上的占位區(qū)域
sliderF: params.sliderF, //滑塊的父元素
sliderBtn: params.sliderBtn, //滑塊
sliderBg: params.sliderBg, //滑塊滑動(dòng)過程中的背景塊
refreshBtn: params.refreshBtn, //刷新按鈕
range: params.range, //驗(yàn)證通過的運(yùn)行范圍值
imgArr: params.imgArr, //圖片數(shù)組
refreshCallback: params.refreshCallback, //刷新回調(diào)
callback: params.callback //驗(yàn)證回調(diào)函數(shù),true為成功,false為失敗
};
var sliderF = document.getElementById(object.sliderF);
var sliderBtn = document.getElementById(object.sliderBtn);
var sliderBg = document.getElementById(object.sliderBg);
var sImg = document.getElementById(object.sImg);
var bImg = document.getElementById(object.bImg);
var sImgOver = document.getElementById(object.sImgOver);
var refreshBtn = document.getElementById(object.refreshBtn);
var max_left = sliderF.offsetWidth - sliderBtn.offsetWidth;
var sImgBeginLeft = 0;
function refresh() {
sliderBtn.style.left = sliderBg.style.width = 0;
sImgBeginLeft = 0;
var ram = Math.random();
var imgIndex = Math.floor(object.imgArr.length * ram);
var imgSrc = object.imgArr[imgIndex];
bImg.getElementsByClassName('img')[0].src = sImg.getElementsByClassName('simg')[0].src = imgSrc;
sImgOver.style.left = Math.floor(bImg.offsetWidth / 2 + bImg.offsetWidth / 2 * ram - sImgOver.offsetWidth - 6) + "px";
sImg.style.left = sImgBeginLeft = Math.floor((bImg.offsetWidth / 2 - sImgOver.offsetWidth) * ram) + "px";
sImgOver.style.top = sImg.style.top = Math.floor((bImg.offsetHeight - sImgOver.offsetWidth - 10) * ram + 10) + "px";
sImg.getElementsByClassName('simg')[0].style.left = -Math.floor(bImg.offsetWidth / 2 + bImg.offsetWidth / 2 * ram - sImgOver.offsetWidth - 6) + "px";
sImg.getElementsByClassName('simg')[0].style.top = -Math.floor((bImg.offsetHeight - sImgOver.offsetWidth - 10) * ram + 10) + "px";
object.refreshCallback(true)
}
refresh();
sliderBtn.ontouchstart = function (e) {
var ev = e || window.event
var downX = ev.touches[0].pageX;
var sImgLeft = parseInt(sImg.style.left);
this.ontouchmove = function (e) {
var ev = e || window.event;
var leftX = ev.touches[0].pageX - downX;
leftX = leftX < 0 ? 0 : (leftX < max_left ? leftX : max_left)
sliderBtn.style.left = leftX + 'px';
sliderBg.style.width = leftX + sliderBtn.offsetWidth / 2 + "px";
sImg.style.left = leftX + sImgLeft + "px";
}
this.ontouchend = function (e) {
this.ontouchmove = null; //移除移動(dòng)事件
var sImgLeft = parseInt(sImg.style.left);
var sImgOverLeft = parseInt(sImgOver.style.left);
if (Math.abs(sImgOverLeft - sImgLeft) < object.range) {
object.callback && object.callback(true)
} else {
object.callback && object.callback(false)
var timer = null,
step = 10;
var sliderBtnLeft = parseInt(sliderBtn.style.left)
timer = setInterval(function () {
sliderBtnLeft -= step;
step += 5;
if (sliderBtnLeft <= 0) {
clearInterval(timer);
sliderBtnLeft = 0;
sliderBtn.style.left = sliderBg.style.width = 0;
sImg.style.left = parseInt(sImgBeginLeft) + "px"
}
sliderBtn.style.left = sliderBg.style.width = sliderBtnLeft + "px";
sImg.style.left = sliderBtnLeft + parseInt(sImgBeginLeft) + "px"
}, 20)
}
}
};
refreshBtn.ontouchstart = function () {
refresh()
}
}
window.mobileSlider = mobileSlider;
})()
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaScript實(shí)現(xiàn)滑塊驗(yàn)證碼
- JavaScript實(shí)現(xiàn)登錄滑塊驗(yàn)證
- js canvas實(shí)現(xiàn)滑塊驗(yàn)證
- JavaScript實(shí)現(xiàn)滑塊驗(yàn)證解鎖
- js+cavans實(shí)現(xiàn)圖片滑塊驗(yàn)證
- js實(shí)現(xiàn)滑動(dòng)滑塊驗(yàn)證登錄
- javascript實(shí)現(xiàn)支付寶滑塊驗(yàn)證碼效果
- php+js實(shí)現(xiàn)的拖動(dòng)滑塊驗(yàn)證碼驗(yàn)證表單操作示例【附源碼下載】
- Vue 實(shí)現(xiàn)拖動(dòng)滑塊驗(yàn)證功能(只有css+js沒有后臺(tái)驗(yàn)證步驟)
- 基于JS組件實(shí)現(xiàn)拖動(dòng)滑塊驗(yàn)證功能(代碼分享)
- JavaScript實(shí)現(xiàn)滑塊驗(yàn)證案例
相關(guān)文章
JS動(dòng)態(tài)添加option和刪除option(附實(shí)例代碼)
option的添加和刪除通過js實(shí)現(xiàn)及動(dòng)態(tài)創(chuàng)建select,本例提供實(shí)例的完整代碼,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04
詳解JS如何實(shí)現(xiàn)文字溢出時(shí)用省略號(hào)...顯示
這篇文章主要為大家詳細(xì)介紹了JavaScript如何實(shí)現(xiàn)當(dāng)文本內(nèi)容過長時(shí),中間顯示省略號(hào)...,兩端正常展示,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
JS結(jié)合bootstrap實(shí)現(xiàn)基本的增刪改查功能
這篇文章主要介紹了JS結(jié)合bootstrap實(shí)現(xiàn)基本的增刪改查功能,需要的朋友可以參考下2016-07-07
js調(diào)用后臺(tái)servlet方法實(shí)例
今天做歷史記錄查詢功能,遇到了前后臺(tái)方法互相調(diào)用的問題,研究了一下,把成功經(jīng)驗(yàn)記錄一二。2013-06-06
echarts實(shí)現(xiàn)餅圖與樣式設(shè)置
這篇文章介紹了echarts實(shí)現(xiàn)餅圖與樣式設(shè)置的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
前端調(diào)用后端接口時(shí)的超時(shí)問題解決辦法
這篇文章主要給大家介紹了關(guān)于如何解決前端調(diào)用后端接口時(shí)的超時(shí)問題,還詳細(xì)介紹了在Vue項(xiàng)目中配置axios的全局超時(shí)時(shí)間、使用遞歸和Promise.race()處理異步請(qǐng)求超時(shí)的最佳實(shí)踐,需要的朋友可以參考下2024-12-12
原創(chuàng)javascript小游戲?qū)崿F(xiàn)代碼
javascript小游戲?qū)崿F(xiàn)代碼,喜歡用javascript實(shí)現(xiàn)游戲效果代碼的朋友可以參考下。2010-08-08
Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法
這篇文章主要介紹了Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法,涉及JavaScript中toString方法與split方法的使用技巧,需要的朋友可以參考下2015-12-12
javascript或asp實(shí)現(xiàn)的判斷身份證號(hào)碼是否正確兩種驗(yàn)證方法
在網(wǎng)頁中經(jīng)常需要輸入正確的身份證號(hào)碼,只能通過程序來驗(yàn)證身份證格式。根據(jù)身份證號(hào)碼生成的原理,就是驗(yàn)證后面幾位就可以了。2009-11-11
javascript 文本框水印/占位符(watermark/placeholder)實(shí)現(xiàn)方法
html5為表單元素(type為text/password/search/url/telephone/email)新增了一個(gè)placeholder屬性,為輸入框提供一種提示2012-01-01

