
效果预览


本系统可用于学校、企业、机构等举办知识问答竞赛活动时的出题系统,系统设计需求根据本人经验所得:
点击开始:随机出题(两种题型),题目晃动,开始按钮变暂停按钮。
参赛选手喊停,则点击暂停按钮,题目停止晃动。
点击答案:先公布第一题的答案,再次点击公布第二题的答案。
本系统按照以上需求进行设计与开发
未涉及到数据库,数据结构对js小白来说会比较复杂。
代码冗余,但是数据可维护性强。
本系统仅供学习,由原作者:Bpvank自主设计与开发,未经允许,禁止转发、商用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>【HTML+CSS】知识竞赛问答随机出题系统</title>
<!-- LOGO -->
<link rel="shortcut icon" type="image/x-icon" href="img/favicon.png" />
<!-- CSS -->
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<!-- 背景装饰元素 -->
<img src="img/element01.png" class="background_element01">
<img src="img/element02.png" class="background_element02">
<img src="img/element03.png" class="background_element03">
<!-- 标题 -->
<div class="titleBox">
<h2>LOGO</h2>
<h1>2022 知识竞赛问答随机出题系统</h1>
</div>
<!-- 主要内容 -->
<div class="main">
<!-- 标题 -->
<h1 class="title">青春心向党,走进互联网</h1>
<!-- 出题区 -->
<div class="topicBox">
<div class="content01">
<!-- 党政爱国题 -->
<h3>
<p>
<!-- 题型 -->
<span>【党政爱国题】</span>
<!-- 题目 -->
<span id="topic01">问题?</span>
</p>
<!-- 答案 -->
<p class="answer">
<span id="A1">A、</span>
<span id="B1">B、</span>
<span id="C1">C、</span>
<span id="D1">D、</span>
</p>
</h3>
</div>
<!-- 互联网题 -->
<div class="content02">
<h3>
<p>
<!-- 题型 -->
<span>【互联网题】</span>
<!-- 题目 -->
<span id="topic02">问题?</span>
</p>
<!-- 答案 -->
<p class="answer">
<span id="A2">A、</span>
<span id="B2">B、</span>
<span id="C2">C、</span>
<span id="D2">D、</span>
</p>
</h3>
</div>
</div>
<!-- 开始、答案按钮 -->
<div class="buttonBox">
<input type="button" value="开始" id="begin">
<input type="button" value="答案" id="answer" name="one">
</div>
<!-- 版权声明 -->
<p>· 本系统仅供学习,由原作者:Bpvank自主设计与开发,未经允许,禁止转发、商用 ·</p>
</div>
<!-- JS -->
<script type="text/javascript" src="js/index.js"></script>
</body>
</html> /* 清除内、外间距 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* 添加背景图片 */
body{
background: url(../img/background.png) no-repeat center top;
background-size: cover;
background-attachment: fixed;
user-select: none;
}
/* 背景装饰元素 */
.background_element01{
width: 10%;
position: absolute;
top: 150px;
left: 50px;
pointer-events: none;
}
.background_element02{
width: 25%;
position: absolute;
right: 0;
pointer-events: none;
}
.background_element03{
width: 23%;
position: absolute;
right: 0;
bottom: 0;
pointer-events: none;
}
/* 标题、LOGO */
.titleBox{
width: 100%;
height: 100px;
padding: 20px;
margin-bottom: 20px;
}
.titleBox>h2{
color: darkred;
}
.titleBox>h1{
color: darkred;
text-align: center;
font-size: 40px;
}
/* 主要内容 */
.main{
width: 65%;
background: darkred;
padding: 10px;
margin: 0 auto;
border-radius: 20px;
box-shadow: 3px 3px 0 goldenrod;
}
.main .title{
color: white;
text-align: center;
line-height: 55px;
}
.main>p{
font-size: 10px;
color: white;
text-align: center;
letter-spacing: 2px;
}
.topicBox{
width: 90%;
height: 70%;
margin: 10px auto;
font-size: 20px;
font-weight: bold;
text-align: left;
background: white;
border-radius: 10px;
padding: 20px;
line-height: 40px;
box-shadow: 3px 3px 0 goldenrod;
}
.topicBox>div{
width: 100%;
height: 200px;
}
.topicBox>div:nth-child(1){
border-bottom: 3px solid darkred;
margin-bottom: 20px;
}
/* 按钮样式 */
.buttonBox{
width: 100%;
text-align: center;
}
.buttonBox input{
width: 200px;
height: 50px;
margin: 10px 20px;
font-size: 28px;
font-weight: bold;
border-radius: 10px;
outline: none;
box-shadow: 3px 3px 0 rosybrown;
color: darkred;
border: 0px;
}
/* 答案样式 */
.answer span{
margin-right: 30px;
font-size: 23px;
}
/* 正确答案样式 */
.correct_answer{
background: darkred;
color: white;
} 小提示:代码演示只使用了三条数据,数据多一些效果会更好哦~
数据结构:
{
topic: "", // 题目
select: { // 答案选择
A: "",
B: "",
C: "",
D: ""
},
answer: "", // 正确答案
} 代码:
// 党政爱国题库
var content01 = [{
topic: "五四运动标志着中国()?",
select: {
A: "A、封建主义的寿终正寝",
B: "B、新民主主义革命的开端",
C: "C、共产党走上历史舞台",
D: "D、资产阶级革命的转变"
},
answer: "B",
},
{
topic: "以下没有参加中国共产党第一次全国代表大会的是()?",
select: {
A: "A、陈独秀",
B: "B、毛泽东",
C: "C、董必武",
D: "D、李达"
},
answer: "A",
}, {
topic: "1935年1月,中国中央政治局在长征途中举行()?",
select: {
A: "A、遵义会议",
B: "B、俄界会议",
C: "C、洛川会议",
D: "D、古田会议"
},
answer: "A",
}];
// 互联网题库
var content02 = [{
topic: "下面哪一项的电子邮件链接是正确的()?",
select: {
A: "A、xxx.com.cn",
B: "B、xxx@.net",
C: "C、xxx@com",
D: "D、xxx@xxx.com"
},
answer: "D",
}, {
topic: "在html中,用于定义表格列的标签是()?",
select: {
A: "A、table",
B: "B、boby",
C: "C、td",
D: "D、tr"
},
answer: "C",
}, {
topic: "WWW是()?",
select: {
A: "A、因特网",
B: "B、万维网",
C: "C、局域网",
D: "D、外网"
},
answer: "B",
}];
// ---------------- 以上为本系统的数据,只有三条数据,仅供演示 ----------------
// 数据结构分析:采用的是数组对象,数组中存储的是对象
/*
{
topic: "", // 题目
select: { // 答案选择
A: "",
B: "",
C: "",
D: ""
},
answer: "", // 正确答案
}
*/
// 记住此数据结构,后面代码中使用到不会进行介绍
// 查找(开始、答案)按钮
var begin = document.getElementById("begin"); // 开始
var answer = document.getElementById("answer"); // 答案
// 获取两个题区放题目的span标签
var topic01 = document.getElementById("topic01");
var topic02 = document.getElementById("topic02");
// 获取两个题区放答案的span标签
var A1 = document.getElementById("A1");
var B1 = document.getElementById("B1");
var C1 = document.getElementById("C1");
var D1 = document.getElementById("D1");
var A2 = document.getElementById("A2");
var B2 = document.getElementById("B2");
var C2 = document.getElementById("C2");
var D2 = document.getElementById("D2");
// 禁用答案按钮
answer.disabled = true;
// 点击开始按钮
begin.onclick = () => {
// 当前按钮的value值为开始,则进行开始的一系列操作
if (begin.value == '开始') {
begin.value = '暂停';
// 清除正确答案的样式 移除class
A1.classList.remove("correct_answer");
B1.classList.remove("correct_answer");
C1.classList.remove("correct_answer");
D1.classList.remove("correct_answer");
A2.classList.remove("correct_answer");
B2.classList.remove("correct_answer");
C2.classList.remove("correct_answer");
D2.classList.remove("correct_answer");
// 判断数组中是否只剩最后一题,是的话则不用点击暂停就可以直接点击答案
if (content01.length == 1 || content02.length == 1) {
answer.disabled = false;
begin.disabled = false;
}
let fn = () => {
// 根据题库数组的长度获取随机数,有两个题库,两种题型
var content01_index = parseInt(Math.random() * content01.length);
var content02_index = parseInt(Math.random() * content02.length);
// 1题区题目内容 = 党政爱国题库里面随机的一个题目
topic01.innerText = content01[content01_index].topic;
// 2题区题目内容 = 互联网题库里面随机的一个题目
topic02.innerText = content02[content02_index].topic;
// 1题区内容的答案
A1.innerText = content01[content01_index].select.A;
B1.innerText = content01[content01_index].select.B;
C1.innerText = content01[content01_index].select.C;
D1.innerText = content01[content01_index].select.D;
// 2题区内容的答案
A2.innerText = content02[content02_index].select.A;
B2.innerText = content02[content02_index].select.B;
C2.innerText = content02[content02_index].select.C;
D2.innerText = content02[content02_index].select.D;
// 点击答案按钮
answer.onclick = () => { // 第一次点击答案按钮,出第一题的答案
// 为什么需要做这个判断呢? 因为需要出两次答案,需点击两次按钮
if (answer.name == 'one') {
answer.name = 'two';
// content01[content01_index].answer 获取当前题目的正确答案
// 此处为什么+1呢? 因为html中给答案标签命名为A1.A2.B1.B2
var answer1 = document.getElementById(content01[content01_index].answer + "1");
// 给正确答案添加class属性,该class写好了正确答案的样式
answer1.className = 'correct_answer';
} else { // 第二次点击答案按钮,出第二题的答案
answer.name = 'one';
var answer2 = document.getElementById(content02[content02_index].answer + "2");
answer2.className = 'correct_answer';
// 禁用答案按钮、启用开始按钮
answer.disabled = true;
begin.disabled = false;
// 题目不能出现第二次,所以将随机出来的这题从数组中移除
content01.splice(content01_index, 1); // splice()第一个参数:从第几个元素开始删,第二个参数:删几个元素
content02.splice(content02_index, 1);
// 判断一下是否还有题目,没有则将开始、答案按钮都禁用掉
if (content01.length == 0 || content02.length == 0) {
// disabled=true 是开启禁用的意思
answer.disabled = true;
begin.disabled = true;
}
}
}
}
// 让题目晃动起来,一直调用此方法,使用计时器
timer = setInterval(fn, 2);
} else { // 点击暂停
// 将按钮value值改为开始
begin.value = '开始';
// 点击暂停就清除计时器
clearInterval(timer);
// 启用答案按钮、禁用开始按钮
answer.disabled = false;
begin.disabled = true;
}
} 拒绝白嫖,关注+一键三连相关作品再领取源码,谢谢