<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>jQuery滑动验证解锁插件</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Microsoft YaHei', sans-serif;
background-color: #f5f5f5;
padding: 20px;
}
.slideunlock-container {
width: 300px;
margin: 50px auto;
background-color: #fff;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
padding: 20px;
}
.slideunlock-title {
text-align: center;
margin-bottom: 20px;
color: #333;
}
.slideunlock-slider {
position: relative;
width: 100%;
height: 40px;
background-color: #f0f0f0;
border-radius: 20px;
overflow: hidden;
}
.slideunlock-slider-bg {
position: absolute;
left: 0;
top: 0;
width: 0;
height: 100%;
background-color: #4CAF50;
transition: width 0.3s;
}
.slideunlock-slider-btn {
position: absolute;
left: 0;
top: 0;
width: 40px;
height: 40px;
background-color: #fff;
border-radius: 50%;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
cursor: pointer;
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
}
.slideunlock-slider-btn:after {
content: "→";
color: #666;
font-size: 18px;
}
.slideunlock-slider-tip {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
line-height: 40px;
text-align: center;
color: #666;
z-index: 5;
}
.slideunlock-success {
text-align: center;
margin-top: 15px;
color: #4CAF50;
font-weight: bold;
display: none;
}
.slideunlock-reset {
display: block;
margin: 20px auto 0;
padding: 8px 15px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
display: none;
}
.slideunlock-reset:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="slideunlock-container">
<h3 class="slideunlock-title">请滑动滑块完成验证</h3>
<div class="slideunlock-slider">
<div class="slideunlock-slider-bg"></div>
<div class="slideunlock-slider-btn"></div>
<div class="slideunlock-slider-tip">请按住滑块,拖动到最右边</div>
</div>
<div class="slideunlock-success">验证通过!</div>
<button class="slideunlock-reset">重新验证</button>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
(function($) {
$.fn.slideunlock = function(options) {
var settings = $.extend({
successLabelTip: "验证通过!",
duration: 200,
resetBtn: true,
callback: function() {}
}, options);
return this.each(function() {
var $container = $(this);
var $slider = $container.find('.slideunlock-slider');
var $btn = $slider.find('.slideunlock-slider-btn');
var $bg = $slider.find('.slideunlock-slider-bg');
var $tip = $slider.find('.slideunlock-slider-tip');
var $success = $container.find('.slideunlock-success');
var $reset = $container.find('.slideunlock-reset');
var isMouseDown = false;
var startX = 0;
var maxWidth = $slider.width() - $btn.width();
var isSuccess = false;
// 初始化
$success.text(settings.successLabelTip);
// 鼠标按下事件
$btn.on('mousedown touchstart', function(e) {
if (isSuccess) return;
isMouseDown = true;
startX = e.type === 'mousedown' ? e.pageX : e.originalEvent.touches[0].pageX;
$btn.addClass('active');
e.preventDefault();
});
// 鼠标移动事件
$(document).on('mousemove touchmove', function(e) {
if (!isMouseDown || isSuccess) return;
var moveX = e.type === 'mousemove' ? e.pageX : e.originalEvent.touches[0].pageX;
var offsetX = moveX - startX;
if (offsetX < 0) {
offsetX = 0;
} else if (offsetX > maxWidth) {
offsetX = maxWidth;
success();
}
$btn.css('left', offsetX);
$bg.css('width', offsetX);
});
// 鼠标释放事件
$(document).on('mouseup touchend', function() {
if (!isMouseDown || isSuccess) return;
isMouseDown = false;
$btn.removeClass('active');
if (parseInt($btn.css('left')) < maxWidth) {
reset();
}
});
// 验证成功
function success() {
isSuccess = true;
$tip.hide();
$success.fadeIn(settings.duration);
if (settings.resetBtn) {
$reset.fadeIn(settings.duration);
}
settings.callback.call(this);
}
// 重置滑块
function reset() {
$btn.animate({left: 0}, settings.duration);
$bg.animate({width: 0}, settings.duration);
}
// 重置按钮事件
$reset.on('click', function() {
isSuccess = false;
$success.hide();
$reset.hide();
$tip.show();
reset();
});
});
};
})(jQuery);
// 初始化插件
$(document).ready(function() {
$('.slideunlock-container').slideunlock({
successLabelTip: "验证成功!",
callback: function() {
console.log("验证通过回调函数");
// 这里可以添加验证通过后的操作
}
});
});
</script>
<!-- 示例链接 -->
<div style="text-align: center; margin-top: 50px;">
</div>
</body>
</html>