项目简述
业务描述
点名器通过点击开始和停止按钮实现随机点名的效果
通过按钮控制遍历数组
设计思路及代码实现
概况
项目主要使用HTML
、CSS
、JavaScript
技术栈,JavaScript
部分使用市场主流框架Vue.js
实践,使用此框架的目的是适应市场需求、拓宽自身技术面,做一个顺应潮流,学习能力较强的程序员。
程序的构成
- index.html(模板文件)
- index-vue.js(实现点名控制的逻辑代码)
- style.css(页面元素的整体布局)
-
代码概述与效果展示
index.html
题词器的整体布局思路: 一个大容器,用于容纳点名器本体
- 大容器的组成部分:标题
title
、展示框box
、用于装饰的图片容器decorate
- 展示框由两部分组成:一个用于显示名字的区域
text_area
,一个用于操作开始或暂停的按钮btn
```html <!DOCTYPE html>→ → → 课堂点名器 ← ← ←{{ display }}
style.css<br />效果制作思路概述:
- 给背景设置渐变色,通过动画方式使背景实现动态变化;
- 设置可视宽高,通过栅格布局控制大容器位置;
- 大容器通过控制外边距`margin`来使其保持居中,设置一些样式使其美观。如通过`border-radius`设置圆角边框,通过`box-shadow`设置盒子阴影等;
- 标题按照一般的设置进行样式调整,通过对标题容器的控制使标题处于合适的位置;
- 小盒子用于容纳显示名字的区域和控制按钮,背景使用径向渐变`radial-gradient`,让颜色从左往中心渐变,使用`text-align`属性使盒子内带文字的元素居中;
- 显示名字的区域使用了浮动布局,使区域内元素实现水平居中和垂直居中,使用文字阴影使文字的显示更炫酷;
- 按钮部分使用了`HTML`自带的按钮,首先是清除其自身自带的样式,按钮背景的设置使用线性渐变`Linear-gradient`使背景色实现从左往右的变化,接着设置内边距控制按钮的高度,最后就是通过盒子阴影、圆角边框、鼠标指向样式等优化按钮样式;
- 底部图片通过定位使其转移至右下角。
```css
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: Arial, "PingFang SC", "Microsoft Yahei", sans-serif;
}
body {
opacity: 1;
/* 设置两种渐变色,每种渐变色由两种颜色组成 */
background: linear-gradient(
135deg,
hsl(170deg, 80%, 70%),
hsl(190deg, 80%, 70%),
hsl(250deg, 80%, 70%),
hsl(320deg, 80%, 70%)
);
/* 使用background-size在X轴和Y轴上把背景尺寸扩大两倍 */
background-size: 200% 200%;
animation: gradient-move 15s ease alternate infinite;
}
/* 通过移动背景的元素实现 */
/* 然后使用动画属性通过background-position移动背景位置,
在X轴Y轴上分别从0%移动到100% */
@keyframes gradient-move {
0% {
background-position: 0% 0%;
}
100% {
background-position: 100% 100%;
}
}
#app {
/* vw,vh是可视宽高 */
width: 100vw;
height: 100vh;
max-width: 100%;
/* 使用栅格布局 */
display: grid;
/* 控制所有元素的对齐方式(对齐) */
place-items: center;
}
.container{
width:700px;
height:500px;
border-radius: 4px;
margin: 100px auto 0 auto;
background: #fefefe;
position: relative;
/* 设置盒子阴影 */
box-shadow: 10px 10px 5px rgba(100, 100, 100, .5);
}
.container .title{
width: 100%;
height: 60px;
font-size: 40px;
font-weight: 700;
text-align: center;
line-height: 60px;
color: #00b894;
}
.box{
width: 100%;
height: 300px;
/* 使在小盒子内的文字元素居中 */
text-align: center;
/* margin-top: 50px; */
/* 线性渐变 参数:渐变方向(可用角度为单位) 颜色一 颜色二 */
background-image: radial-gradient(
at center left,
#b2bec3 0.6000000000000001px,
#636e72 0.6000000000000001px
);
}
.text_area{
width:100%;
height:80%;
display: flex;
justify-content: center;
align-items: center;
color: #e493d0;
font-size: 40px;
text-shadow: #e493d0 10px 10px 10px;
}
.btn {
width: 150px;
/* 清除按钮自带样式 */
border: none;
/* 线性渐变 参数:渐变方向(可用角度为单位) 颜色一 颜色二 */
background: linear-gradient(
90deg,
hsl(240deg, 50%, 50%),
hsl(280deg, 50%, 50%)
);
padding: 10px 15px;
border-radius: 4px;
box-shadow: 5px 5px 5px rgba(149, 64, 191, .5);
color: white;
cursor: pointer;
}
/* 使用绝对定位控制图片位置 */
.decorate{
position: absolute;
right: 0;
}
index-vue.js
这段逻辑主要实现点名器的随机点名效果和控制开始与暂停的功能。
大致思路:
- 设置4个变量存入
data
,display
是显示名字的变量,nameList
是存储名字的数组,timer
为计时器,state
记录程序的运行状态 computed
为计算属性,控制标签文字的变化,这里介绍一下其特点:- 使用
computed
配置项定义计算属性 - 每个计算属性都是一个函数
- 函数里可以使用
this
访问data
或其他配置项中的值 - 这里为什么要用
computed
而不使用Vue提供的函数存放区methods
?computed
自带缓存,作为被调用的函数它有缓存,使用的时候调用一次即可;- 如果一个页面中多次使用
label
中的逻辑,而且使用methods
存储函数并调用的话,就会出现点击一次函数就执行一次的情况,这种操作是很耗费系统性能。而在computed
中执行此类操作则不需要重复调用。
- 使用
- 通过在
methods
中的choiceClick
方法实现随机抽取名字。通过state
的变化决定函数接下来的操作:- 如果
state
为0,将会设置一个定时器,每100毫秒执行一次函数切换显示的名字,名字的切换显示通过随机数方法确定数组下标,然后通过赋值的方式赋给display
变量,可以使其通过模板语法渲染在页面上; - 如果
state
为1,将会把定时器置于停止状态。const app = Vue.createApp({
data() {
return {
display: '你准备好了吗?',
nameList: ['黎剑向', '石元涛', '张志', '彭启荣', '杨福林','王志超'],
timer: null,
state: 0,
}
},
// 使用计算属性控制标签文字
computed: {
label() {
return this.state ? '结束' : '开始'
},
},
methods: {
choiceClick() {
// 使用state表示状态:结束为1,开始为0
if (this.state == 0) {
// 每100毫秒执行一次函数切换显示的名字,直到通过clearInterval()来停止
this.timer = setInterval(() => {
// 通过random函数计算的结果确定要显示的元素下标
let item = Math.round(Math.random() * (this.nameList.length - 1))
// 把数组里的值赋给data
this.display = this.nameList[item]
}, 100)
// 修改为开始状态
this.state = 1
} else {
// 清除定时器
clearInterval(this.timer)
// 修改为结束状态
this.state = 0
}
},
},
})
app.mount('#app')
- 如果