前端考试界面:带计时器、答题卡、标记功能的交互式界面
前端考试界面:带计时器、答题卡、标记功能的交互式界面
本项目使用 HTML、CSS 和 JavaScript 创建了一个考试界面,包含计时器、答题卡、标记功能等交互功能,方便用户进行在线考试。
1. HTML 代码
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>考试界面</title>
<link rel='stylesheet' type='text/css' href='style.css'>
</head>
<body>
<div class='container'>
<div class='left'>
<div class='timer'>剩余时间:2小时0分0秒</div>
<div class='question question-1'>
<div class='title'>1. 下列哪个不是前端框架?</div>
<div class='options'>
<div class='option'><button></button>Angular</div>
<div class='option'><button></button>React</div>
<div class='option'><button></button>Vue</div>
<div class='option'><button></button>Spring</div>
</div>
<div class='mark'><button>标记</button></div>
</div>
<div class='question question-2'>
<div class='title'>2. 下列哪个不是CSS框架?</div>
<div class='options'>
<div class='option'><button></button>Bootstrap</div>
<div class='option'><button></button>Materialize</div>
<div class='option'><button></button>Bulma</div>
<div class='option'><button></button>jQuery</div>
</div>
<div class='mark'><button>标记</button></div>
</div>
<div class='question question-3'>
<div class='title'>3. 下列哪个不是JavaScript框架?</div>
<div class='options'>
<div class='option'><button></button>jQuery</div>
<div class='option'><button></button>React</div>
<div class='option'><button></button>Angular</div>
<div class='option'><button></button>Vue</div>
</div>
<div class='mark'><button>标记</button></div>
</div>
<div class='question question-4'>
<div class='title'>4. 下列哪个不是前端构建工具?</div>
<div class='options'>
<div class='option'><button></button>Webpack</div>
<div class='option'><button></button>Gulp</div>
<div class='option'><button></button>Grunt</div>
<div class='option'><button></button>Maven</div>
</div>
<div class='mark'><button>标记</button></div>
</div>
<div class='question question-5'>
<div class='title'>5. 下列哪个是前端自动化测试工具?</div>
<div class='options'>
<div class='option'><button></button>Selenium</div>
<div class='option'><button></button>Appium</div>
<div class='option'><button></button>Protractor</div>
<div class='option'><button></button>Cypress</div>
</div>
<div class='mark'><button>标记</button></div>
</div>
</div>
<div class='right'>
<div class='summary'>
<div class='title'>答题卡</div>
<div class='questions'>
<div class='question'><button>1</button></div>
<div class='question'><button>2</button></div>
<div class='question'><button>3</button></div>
<div class='question'><button>4</button></div>
<div class='question'><button>5</button></div>
</div>
</div>
</div>
</div>
<script src='script.js'></script>
</body>
</html>
2. CSS 代码
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
}
.container {
display: flex;
height: 100vh;
}
.left {
flex: 3;
padding: 20px;
background-color: #f1f1f1;
overflow-y: auto;
}
.timer {
font-size: 20px;
margin-bottom: 20px;
}
.question {
margin-bottom: 20px;
border: 1px solid #ccc;
padding: 20px;
}
.title {
font-size: 18px;
margin-bottom: 10px;
}
.options {
margin-bottom: 10px;
}
.option {
display: flex;
align-items: center;
margin-bottom: 10px;
}
button {
width: 20px;
height: 20px;
margin-right: 10px;
border-radius: 50%;
border: none;
}
button.selected {
background-color: #8bc34a;
}
.mark {
display: flex;
justify-content: flex-end;
}
.mark button {
background-color: white;
border: 1px solid red;
color: red;
padding: 5px 10px;
border-radius: 5px;
font-size: 14px;
}
.summary {
padding: 20px;
background-color: #fff;
flex: 1;
}
.title {
font-size: 18px;
margin-bottom: 10px;
}
.questions {
display: flex;
flex-wrap: wrap;
}
.question {
width: 20%;
padding: 10px;
text-align: center;
}
.question button {
width: 100%;
height: 100%;
background-color: white;
border: 1px solid #ccc;
color: #ccc;
font-size: 16px;
border-radius: 50%;
}
.question button.selected {
background-color: #8bc34a;
color: white;
}
.question.current button {
background-color: #8bc34a;
color: white;
}
.question.marked button {
border: 1px solid red;
color: red;
}
3. JavaScript 代码
var time = 7200; // 考试时间,单位为秒
var currentQuestion = 1; // 当前题号
var answers = []; // 答案数组,初始为空
// 获取DOM元素
var timerDOM = document.querySelector('.timer');
var questionDOMs = document.querySelectorAll('.question');
var optionDOMs = document.querySelectorAll('.option button');
var markDOMs = document.querySelectorAll('.mark button');
var questionButtonDOMs = document.querySelectorAll('.questions button');
// 格式化时间
function formatTime(time) {
var hour = Math.floor(time / 3600);
var minute = Math.floor((time % 3600) / 60);
var second = time % 60;
return hour + '小时' + minute + '分' + second + '秒';
}
// 更新计时器
function updateTimer() {
time--;
timerDOM.innerHTML = '剩余时间:' + formatTime(time);
if (time === 0) {
alert('考试时间到!');
}
}
// 更新答题卡
function updateSummary() {
for (var i = 0; i < questionButtonDOMs.length; i++) {
if (answers[i] !== undefined) {
questionButtonDOMs[i].classList.add('selected');
} else {
questionButtonDOMs[i].classList.remove('selected');
}
if (i + 1 === currentQuestion) {
questionButtonDOMs[i].classList.add('current');
} else {
questionButtonDOMs[i].classList.remove('current');
}
if (markDOMs[i].classList.contains('marked')) {
questionButtonDOMs[i].classList.add('marked');
} else {
questionButtonDOMs[i].classList.remove('marked');
}
}
}
// 更新答案
function updateAnswer(question, option) {
answers[question - 1] = option;
}
// 更新选项
function updateOption(question, option) {
for (var i = 0; i < optionDOMs.length; i++) {
if (optionDOMs[i].parentNode.parentNode.parentNode.classList.contains('question-' + question)) {
optionDOMs[i].classList.remove('selected');
}
}
option.classList.add('selected');
}
// 更新标记
function updateMark(question) {
if (markDOMs[question - 1].classList.contains('marked')) {
markDOMs[question - 1].classList.remove('marked');
} else {
markDOMs[question - 1].classList.add('marked');
}
}
// 切换题目
function switchQuestion(question) {
for (var i = 0; i < questionDOMs.length; i++) {
if (questionDOMs[i].classList.contains('question-' + question)) {
questionDOMs[i].classList.remove('hidden');
} else {
questionDOMs[i].classList.add('hidden');
}
}
currentQuestion = question;
updateSummary();
}
// 绑定事件
for (var i = 0; i < optionDOMs.length; i++) {
optionDOMs[i].addEventListener('click', function(event) {
var question = event.target.parentNode.parentNode.parentNode.classList[1].split('-')[1];
var option = event.target;
updateOption(question, option);
updateAnswer(question, option.innerHTML);
updateSummary();
});
}
for (var i = 0; i < markDOMs.length; i++) {
markDOMs[i].addEventListener('click', function(event) {
var question = event.target.parentNode.parentNode.classList[1].split('-')[1];
updateMark(question);
updateSummary();
});
}
for (var i = 0; i < questionButtonDOMs.length; i++) {
questionButtonDOMs[i].addEventListener('click', function(event) {
var question = parseInt(event.target.innerHTML);
switchQuestion(question);
});
}
// 初始化
timerDOM.innerHTML = '剩余时间:' + formatTime(time);
setInterval(updateTimer, 1000);
questionDOMs[0].classList.remove('hidden');
updateSummary();
项目运行
- 将上述 HTML、CSS 和 JavaScript 代码分别保存为
index.html、style.css和script.js文件。 - 在浏览器中打开
index.html文件,即可体验考试界面。
功能说明
- 计时器: 页面右上角显示考试倒计时,初始时剩余 2 小时,当时间到时会弹出提示框。
- 答题卡: 页面右侧下方显示答题卡区域,每个题目对应一个小方框,点击左侧题目对应答案的按钮,答题卡区域对应的小方框变为绿色,表示该题已答题。
- 标记功能: 每个题目右下角有一个标记按钮,点击该按钮,对应题目的小方框右上角会有红色标记,表示该题已标记。再次点击标记按钮,红色标记消失,表示取消标记。
- 切换题目: 左侧题目可以上下滚动查看,点击答题卡区域的题目编号按钮,可以快速切换到该题目。
代码说明
- HTML 代码: 使用
div标签创建了界面布局,使用class属性定义了每个元素的样式类。 - CSS 代码: 定义了界面的样式,包括字体、颜色、布局、按钮样式等。
- JavaScript 代码: 实现计时器、答题卡、标记功能以及切换题目的交互逻辑。
总结
该项目是一个简单的前端考试界面,实现了基本的功能,可以作为学习前端开发的基础练习项目。你可以根据自己的需求修改代码,添加更多功能,例如:
- 添加提交答案功能。
- 添加随机出题功能。
- 添加错题重做功能。
- 添加成绩统计功能。
希望本项目能够帮助你学习前端开发知识。
原文地址: https://www.cveoy.top/t/topic/nM2y 著作权归作者所有。请勿转载和采集!