- 后端生成验证码图片:服务器端生成一个包含随机字符的图片,并将正确的答案存储起来(在Session中)。
- 前端显示验证码:在前端HTML中,使用
<img>标签来显示后端生成的图片。 - CSS3 美化:使用CSS3来设计验证码及其相关输入框的样式,使其更美观、更友好。
第一步:后端生成验证码图片 (以PHP为例)
这是最核心的一步,服务器需要创建一个图片,画上干扰线、噪点,并写入随机字符。

(图片来源网络,侵删)
generate_captcha.php (后端代码示例)
<?php
// 1. 开启Session
session_start();
// 2. 定义验证码字符集
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$code = '';
$length = 4; // 验证码长度
for ($i = 0; $i < $length; $i++) {
$code .= $chars[mt_rand(0, strlen($chars) - 1)];
}
// 3. 将验证码码存入Session,用于后续验证
$_SESSION['captcha_code'] = $code;
// 4. 创建图片资源
$image = imagecreatetruecolor(120, 40);
$bgcolor = imagecolorallocate($image, 255, 255, 255); // 背景色
imagefill($image, 0, 0, $bgcolor);
// 5. 添加干扰线
for ($i = 0; $i < 5; $i++) {
$color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imageline($image, mt_rand(0, 120), mt_rand(0, 40), mt_rand(0, 120), mt_rand(0, 40), $color);
}
// 6. 添加噪点
for ($i = 0; $i < 100; $i++) {
$color = imagecolorallocate($image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imagesetpixel($image, mt_rand(0, 120), mt_rand(0, 40), $color);
}
// 7. 将验证码写入图片
$textColor = imagecolorallocate($image, 0, 0, 0); // 文字颜色
// 使用 imagettftext 可以使用自定义字体,效果更好
// imagettftext($image, 20, 0, 30, 30, $textColor, 'path/to/your/font.ttf', $code);
// 这里使用更简单的 imagestring
imagestring($image, 5, 30, 12, $code, $textColor);
// 8. 输出图片
header('Content-Type: image/png');
imagepng($image);
// 9. 释放内存
imagedestroy($image);
?>
关键点:
$_SESSION['captcha_code'] = $code;将生成的码存入Session,当用户提交表单时,我们会用这个值去比对用户输入。header('Content-Type: image/png');告诉浏览器这是一个PNG图片。- 这个PHP文件本身就是一个图片,可以直接在
<img>标签的src中引用。
第二步:前端HTML显示验证码
我们创建一个HTML文件,其中包含一个表单,表单中需要有一个 <img> 标签来显示我们刚刚创建的PHP验证码。
index.html (基础HTML结构)

(图片来源网络,侵删)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">带验证码的登录表单</title>
<!-- 引入CSS文件 -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="login-container">
<h2>用户登录</h2>
<form action="login.php" method="post" id="loginForm">
<div class="form-group">
<label for="username">用户名</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" id="password" name="password" required>
</div>
<div class="form-group captcha-container">
<label for="captcha">验证码</label>
<div class="captcha-wrapper">
<!--
src 指向我们后端生成验证码的PHP文件。
我们可以加一个时间戳参数来防止浏览器缓存图片,
导致刷新后验证码不变,这里是使用JS实现的,下面CSS部分会展示另一种方式。
-->
<img id="captcha-img" src="generate_captcha.php" alt="验证码,看不清楚请点击刷新">
<button type="button" id="refresh-btn" class="refresh-btn">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
<path d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"/>
<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z"/>
</svg>
</button>
</div>
<input type="text" id="captcha" name="captcha" placeholder="请输入上方验证码" required>
</div>
<button type="submit" class="login-btn">登录</button>
</form>
</div>
<script>
// 简单的JS刷新验证码功能
document.getElementById('refresh-btn').addEventListener('click', function() {
const captchaImg = document.getElementById('captcha-img');
// 在图片URL后添加一个随机参数,强制浏览器重新请求
captchaImg.src = 'generate_captcha.php?' + new Date().getTime();
});
</script>
</body>
</html>
关键点:
<img src="generate_captcha.php">:这是核心,直接将PHP的输出作为图片源。- 刷新按钮:为了提升用户体验,我们添加了一个刷新按钮,点击它会通过JavaScript改变图片的
srcURL,浏览器会因此重新请求图片,生成一个新的验证码。
第三步:使用CSS3美化验证码区域
我们使用CSS3来让这个表单和验证码区域看起来更专业、更现代。
style.css (CSS3美化代码)
/* 基础样式重置和页面布局 */
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.login-container {
background-color: #ffffff;
padding: 2rem 3rem;
border-radius: 10px;
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 400px;
text-align: center;
}
h2 {
color: #333;
margin-bottom: 1.5rem;
}
.form-group {
margin-bottom: 1.25rem;
text-align: left;
}
label {
display: block;
margin-bottom: 0.5rem;
color: #555;
font-weight: 500;
}
input[type="text"],
input[type="password"] {
width: 100%;
padding: 0.75rem;
border: 1px solid #ddd;
border-radius: 5px;
box-sizing: border-box; /* 确保padding不会增加宽度 */
font-size: 1rem;
transition: border-color 0.3s, box-shadow 0.3s;
}
input[type="text"]:focus,
input[type="password"]:focus {
outline: none;
border-color: #4a90e2;
box-shadow: 0 0 5px rgba(74, 144, 226, 0.3);
}
/* 验证码区域的CSS3美化 */
.captcha-container {
display: flex;
flex-direction: column;
}
.captcha-wrapper {
display: flex;
align-items: center;
gap: 10px; /* 图片和刷新按钮之间的间距 */
}
#captcha-img {
border: 1px solid #ddd;
border-radius: 5px;
height: 40px;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
}
#captcha-img:hover {
transform: scale(1.02);
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
/* 刷新按钮的样式 */
.refresh-btn {
background: none;
border: none;
color: #666;
cursor: pointer;
padding: 8px;
border-radius: 50%;
transition: background-color 0.3s, color 0.3s;
}
.refresh-btn:hover {
background-color: #f0f0f0;
color: #333;
}
.refresh-btn svg {
width: 20px;
height: 20px;
}
/* 登录按钮 */
.login-btn {
width: 100%;
padding: 0.75rem;
background-color: #4a90e2;
color: white;
border: none;
border-radius: 5px;
font-size: 1rem;
font-weight: bold;
cursor: pointer;
transition: background-color 0.3s, transform 0.1s;
}
.login-btn:hover {
background-color: #357abd;
}
.login-btn:active {
transform: scale(0.98);
}
总结与扩展
-
完整流程:
(图片来源网络,侵删)- 用户访问
index.html,看到表单和验证码图片。 - 用户输入用户名、密码和验证码,点击登录。
- 表单数据被发送到
login.php。 login.php从$_SESSION['captcha_code']中取出正确的验证码,与用户提交的$_POST['captcha']进行比对。- 如果一致,则进行登录逻辑;如果不一致,则提示用户“验证码错误”。
- 用户访问
-
CSS3 美化亮点:
- 渐变背景:
background: linear-gradient(...)创建了柔和的背景。 - 阴影效果:
box-shadow为容器和输入框增加了层次感。 - 圆角:
border-radius让设计更现代。 - 过渡动画:
transition为悬停、聚焦等状态添加了平滑的动画效果,提升了交互体验。 - Flexbox布局:使用
display: flex轻松实现了验证码图片和刷新按钮的水平对齐。 - 悬停效果:鼠标悬停在图片和按钮上时的视觉反馈。
- 渐变背景:
-
常见验证码类型:
- 图片验证码:我们上面实现的,最经典。
- 滑动验证码:用户需要按住滑块并拖动到指定位置,这需要更复杂的JS和后端交互来验证滑块的轨迹和时间。
- 点选验证码:图片中显示几个文字,用户需要按顺序点击对应的文字。
这个例子涵盖了从后端生成到前端展示和CSS美化的完整流程,你可以基于此进行扩展和修改。
