前言:
今日🖥?逛CSDN时发现前两天举办的🕹?🕹?第十三届蓝桥杯省赛🕹?🕹?的解析博客占据了热榜第一的位置,我也参加了这次比赛,本着与广大大佬们交流的原则🧐,我决定写下这篇2022年蓝桥杯省赛真题解析(Web应用开发大学组)的博客,本人菜鸟一个,已尽自己最大努力写好这篇解析博客,如有问题还请大佬们多多指正,如果这篇博客对您有帮助的话,求转发求关注求点赞,感谢各位大佬,请各位大佬吃糖🍬🍬🍬
这篇博客不含题目,只有答案和解析,如果您需要查看题目我这里还贴心的为您准备了完整版🏆🏆🏆:我是完整版哦
文章中出现的题目和代码可戳链接进行保存🏄?♂?🏄?♂?🏄?♂?(蓝桥杯真题): 「蓝桥杯」https://www.aliyundrive.com/s/WhZCo6xetsP 提取码: 73ir
言归正传,我们开始一起学习吧🎖?🎖?🎖?:
1. 水果拼盘🎖?🎖?🎖?
这道题考察了css3 的flex 属性,非常简单,只需要三行代码????:
#pond {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
2. 展开你的扇子🎖?🎖?🎖?
这一题使用 rotate 旋转: transform: rotate(角度) 将卡片进行旋转,需要注意的是,角度的单位为deg ,且角度值为负时为逆时针旋转。
#box:hover #item1 {
transform: rotate(-60deg);
}
#box:hover #item2 {
transform: rotate(-50deg);
}
#box:hover #item3 {
transform: rotate(-40deg);
}
#box:hover #item4 {
transform: rotate(-30deg);
}
#box:hover #item5 {
transform: rotate(-20deg);
}
#box:hover #item6 {
transform: rotate(-10deg);
}
#box:hover #item7 {
transform: rotate(10deg);
}
#box:hover #item8 {
transform: rotate(20deg);
}
#box:hover #item9 {
transform: rotate(30deg);
}
#box:hover #item10 {
transform: rotate(40deg);
}
#box:hover #item11 {
transform: rotate(50deg);
}
#box:hover #item12 {
transform: rotate(60deg);
}
3. 和手机相处的时光🎖?🎖?🎖?
只需将xAxis 和yAxis 的type 配置替换,这一题就结束了(是不是超简单)😉:
xAxis: {
type: "category ",
data: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"],
},
yAxis: {
type: "value",
}
4. 灯的颜色变化🎖?🎖?🎖?
这一题也是比较简单的,整体思路就是在定时器里通过JS 来操作DOM ,显示的话将指定元素的display 设置为inline-block ,至于为什么不设置为block ,是因为项目文件默认给出的css 代码中有:
#defaultlight {
display: inline-block;
}
当我们将显示元素的display 设置为block 后会发现效果与要求的不同,设置为inline-block 即可,当我们显示一个新的元素后需要将上一个元素display 设置为none 来进行隐藏,整体代码如下:
function red() {
const defaultlight = document.getElementById('defaultlight')
const red = document.getElementById('redlight')
setTimeout(() => {
defaultlight.style.display = 'none'
red.style.display = 'inline-block'
}, 3000)
}
function green() {
const greenlight = document.getElementById('greenlight')
const red = document.getElementById('redlight')
setTimeout(() => {
red.style.display = 'none'
greenlight.style.display = 'inline-block'
}, 6000)
}
function trafficlights() {
red()
green()
}
trafficlights();
5. 东奥大抽奖🎖?🎖?🎖?
解题思路:
- 根据转动次数
time 获取当前转动到的li 。 因为总共有8个li ,且li 的class 设置的正好是转盘顺时针转动时.li 加对应的序号: 即.li1 是第一次转动到的.li4 是第四次转动到的 .li8 是第八次转动到的,转到第九次时回到.li1 。 所以我们可以利用转动次数对8取余来获取对应的DOM 元素li 。 但time 是8的整数倍时,按照逻辑我们需要获取.li8 ,但这时time 对8取余等于0,所以这种情况我们需要单独讨论 - 对获取到的
li 元素添加active 类名,并移除其它li (兄弟节点)的active 类名。 - 转动停止后根据
active 类名获取对应的li 元素,取其文本值赋值给#award 元素。
let rollTime;
let time = 0;
let speed = 300;
let times;
$("#start").on("click", function() {
$("#award").text("");
times = parseInt(Math.random() * (20 - 30 + 1) + 20, 10);
rolling();
});
function rolling() {
time++;
clearTimeout(rollTime);
rollTime = setTimeout(() => {
let className = `.li${time % 8}`
if (time % 8 === 0) {
className = `.li8`
}
$(`${className}`).addClass("active").siblings().removeClass("active")
window.requestAnimationFrame(rolling);
}, speed);
if (time > times) {
clearInterval(rollTime);
let text = $(`.active`).text()
$("#award").text(`恭喜您抽中了${text}!!!`);
time = 0;
return;
}
}
6. 蓝桥知识网🎖?🎖?🎖?
这一题就单纯的考了HTML 布局和CSS 样式,没啥可说的,我把我写的代码贴出来仅供参考,毕竟HTML 结构和CSS 写法因人而异🧐🧐:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<title>蓝桥知识网</title>
<link rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div class="canter">
<div class="header">
<div class="nav">
<span>蓝桥知识网</span>
<div class="nav_c">
<span>首页</span>
<span>热门技术</span>
<span>使用手册</span>
<span>知识库</span>
<span>练习题</span>
<span>联系我们</span>
<span>更多</span>
</div>
</div>
<div class="header_text">
<p class="title_header">蓝桥云课</p>
<p class="title_p">随时随地丰富你的技术栈!</p>
<div class="join">
加入我们
</div>
</div>
</div>
</div>
<div class="conter">
<div class="item">
<span>人工智能</span>
<p>人工智能亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。通常人工智能是指通过普通计算机程序来呈现人类智能的技术。</p>
</div>
<div class="item">
<span>前端开发</span>
<p>前端开发是创建 WEB 页面或 APP 等前端界面呈现给用户的过程,通过 HTML,CSS 及 JavaScript 以及衍生出来的各种技术、框架、解决方案,来实现互联网产品的用户界面交互。</p>
</div>
<div class="item">
<span>后端开发</span>
<p>后端开发是实现页面的交互逻辑,通过使用后端语言来实现页面的操作功能,例如登录、注册等。</p>
</div>
<div class="item">
<span>信息安全</span>
<p>ISO(国际标准化组织)的定义为:为数据处理系统建立和采用的技术、管理上的安全保护,为的是保护计算机硬件、软件、数据不因偶然和恶意的原因而遭到破坏、更改和泄露。</p>
</div>
</div>
<div class="footer">
<div class="footer_text">
<span>? 蓝桥云课 2022</span>
<p>京公网安备 11010102005690 号 | 京 ICP 备 2021029920 号</p>
</div>
</div>
</body>
</html>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.canter {
background-color: #a6b1e1;
}
.header {
width: 1024px;
margin: 0 auto;
height: 440px;
padding-top: 13px;
}
.nav {
display: flex;
align-items: center;
height: 46px;
padding: 0 10px;
}
.nav>span {
font-size: 18px;
color: white;
margin-right: 365px;
font-weight: 600;
}
.nav_c span {
font-size: 16px;
color: white;
margin-right: 28px;
font-weight: 600;
}
.nav_c span:nth-child(7) {
margin-right: 0px;
}
.header_text {
display: flex;
align-items: center;
flex-direction: column;
margin-top: 30px;
}
.title_header {
font-size: 45px;
color: black;
margin-bottom: 62px;
}
.title_p {
font-size: 21px;
font-weight: 200;
color: white;
margin-bottom: 36px;
}
.join {
color: #efbfbf;
border-radius: 2px;
font-size: 18px;
display: flex;
align-items: center;
justify-content: center;
padding: 15px;
box-shadow: inset 0 0 0 2px #efbfbf;
}
.conter {
width: 1024px;
margin: 74px auto 0 auto;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
height: 302px;
}
.conter .item {
height: 144px;
width: 502px;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.conter .item span {
font-size: 30px;
font-weight: 200;
color: black;
}
.conter .item p {
font-size: 18px;
color: #aaa;
line-height: 1.4em;
}
.footer {
width: 100%;
height: 80px;
border-top: 2px solid #aaa;
}
.footer_text {
width: 1024px;
margin: 0 auto;
text-align: center;
font-size: 14px;
color: #aaa;
padding-top: 30px;
}
.footer_text p {
margin-top: 10px;
}
7. 布局切换🎖?🎖?🎖?
解题思路:
- 发送
axios 请求获取数据 我这里先在axios 请求外使用_this 保存了一下this 实例是因为在比赛时我直接在axios 内部使用this 报了错,但比赛过后我再次直接在axios 内部使用this 发现它又不报错了😥😥,为了保险起见还是在外部先保存一下this 为好。 data 中添加一个判断字段active ,在DOM元素中根据这个active 动态添加相应的class 类 这里我设置active 为true 时显示大图效果,为false 时显示列表效果- 为切换图片添加相应的点击事件,改变
active 字段的值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>布局切换</title>
<script type="text/javascript" src="./js/vue.js"></script>
<link rel="stylesheet" type="text/css" href="./css/index.css" />
<script src="./js/axios.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="app" v-cloak>
<!-- TODO:请在下面实现需求 -->
<div class="bar">
<a :class="{'active':active}" class="grid-icon " @click="grid()"></a>
<a :class="{'active':!active}" class="list-icon" @click="list()"></a>
</div>
<!--grid 示例代码,动态渲染时可删除-->
<ul :class="active?'grid':'list'" v-for="item in goodsList" :key="item.url">
<li>
<a :href="item.url" target="_blank"> <img :src="item.image.large" /></a>
<p v-show="!active">{{item.title}}</p>
</li>
</ul>
</div>
</body>
</html>
<script type="text/javascript">
var vm = new Vue({
el: "#app",
data: {
goodsList: [],
active: true
},
mounted() {
let _this = this
axios.get('./goodsList.json').then(res => {
_this.goodsList = res.data
})
},
methods: {
grid() {
this.active = true
},
list() {
this.active = false
}
}
});
</script>
8. 购物车🎖?🎖?🎖?
解题思路:
- 点击添加按钮时,获取点击的该元素在购物车列表
cartList 中的下标,如果该下标不等于-1 ,说明cartList 中已经存在该元素,这时只需将该元素的num +1即可,如果该下标等于-1 ,说明cartList 中没有该元素,这时将该元素的num 设置为1,然后push 添加到cartList 中。 - 点击减少按钮时,获取点击的该元素在购物车列表
cartList 中的下标,根据这个下标获取到cartList 对应的那一条数据,判断该数据的num 是否大于1,如果是,则num-- ,否则删除cartList 里的这条数据。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>购物车</title>
<script src="./js/goods.js"></script>
<script type="text/javascript" src="./js/vue.js"></script>
<link href="./css/index.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="app">
<!-- 商品列表 -->
<h3>商品列表</h3>
<ul id="goodsList">
<template v-for="goods in goodsList">
<li class="goods-item" :key="goods.id">
<div><img :src="goods.imgUrl" /> </div>
<div>{{goods.name}}</div>
<div>¥ {{goods.price}} </div>
<button @click="addToCart(goods)">加入购物车</button>
</li>
</template>
</ul>
<!-- 购物车 -->
<template v-if="cartList.length>0">
<h3>购物车</h3>
<ul id="cartList">
<template v-for="goods in cartList">
<li class="goods-item" :key="goods.id">
<div><img :src="goods.imgUrl" /> </div>
<div>{{goods.name}}</div>
<div>¥ {{goods.price}} </div>
<div class="item-control">
<button @click="removeGoods(goods)">-</button>
<h4>{{goods.num}}</h4>
<button @click="addToCart(goods)">+</button>
</div>
</li>
</template>
</ul>
</template>
</div>
</body>
</html>
<script>
new Vue({
el: '#app',
data: {
cartList: [],
goodsList: []
},
mounted() {
this.goodsList = GoodsArr;
},
methods: {
addToCart(goods) {
let itemIndex = this.cartList.findIndex(item => item.id == goods.id);
if (itemIndex !== -1) {
this.cartList[itemIndex].num++
} else {
goods.num = 1;
this.cartList.push(goods);
}
this.cartList = JSON.parse(JSON.stringify(this.cartList));
},
removeGoods(goods) {
let itemIndex = this.cartList.findIndex(item => item.id == goods.id);
if (this.cartList[itemIndex].num > 1) {
this.cartList[itemIndex].num--
} else {
this.cartList.splice(itemIndex, 1)
}
}
}
});
</script>
9. 寻找小狼人🎖?🎖?🎖?
这一题我们先看一下需要我们补充的myarray 方法是怎么调用的:
let newcardList = cardList.myarray(
(item) => item.category == "werewolf"
);
看到调用myarray 方法的方式与调用filter 一样,都是在方法内传入了一个回调函数,要让我们的myarray 方法能够直接被数组. 着调用,第一时间就应该想到需要在数组Array 的原型prototype 上添加myarray 方法,打开myarray.js 文件我们发现已经默认给我们创建好了myarray 方法,那我们就只需要在方法里添加事件处理代码就行了。
这个时候需要明白myarray 里的this 指向的是调用这个方法的数组,在myarray 方法里打印一下这个this 就知道了: 所以我们只需要创建一个新数组,然后遍历this ,将this 里的每一个对象传入传进myarray 方法的回调函数cb ( 即(item) => item.category == "werewolf" )中,由cb 进行判断是否符合条件,如果符合我们就将这个对象数据加入到我们创建的新数组中,最最最后我们将新数组return 返回即可😉
Array.prototype.myarray = function(cb) {
let newarr = []
this.forEach(item => {
if (cb(item)) {
newarr.push(item)
}
})
return newarr
};
10. 课程列表🎖?🎖?🎖?
代码解析见注释:
let pageNum = 1;
let maxPage;
let pagination = document.getElementById("pagination")
let list = document.getElementById('list')
let arr = []
axios.get('./js/carlist.json').then(res => {
arr = res.data
maxPage = Math.ceil(res.data.length / 5)
showDom(pageNum)
pagination.textContent = `共${maxPage}页,当前${pageNum}页`
})
function fmoney(num) {
if (!num) return NaN
num = num.toString()
let l = num.split('');
let i = l.length
l.splice(i - 2, 0, '.')
return l.join('')
}
function showDom(index) {
let Dom = JSON.parse(JSON.stringify(arr))
let newDom = Dom.splice((index - 1) * 5, 5)
list.innerHTML = ''
for (let i = 0; i < newDom.length; i++) {
const element = newDom[i];
list.innerHTML += ` <div class="list-group">
<a href="#" class="list-group-item list-group-item-action">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${element.name}</h5>
<small>${fmoney(element.price)}元</small>
</div>
<p class="mb-1">
${element.description}
</p>
</a>
</div>`;
}
}
let prev = document.getElementById("prev");
let next = document.getElementById("next");
function isDisabled() {
if (pageNum === 1) {
prev.classList.add('disabled')
} else {
prev.classList.remove('disabled')
}
if (pageNum === maxPage) {
next.classList.add('disabled')
} else {
next.classList.remove('disabled')
}
}
isDisabled()
prev.onclick = function() {
if (pageNum > 1) {
pageNum--
showDom(pageNum)
}
isDisabled()
pagination.textContent = `共${maxPage}页,当前${pageNum}页`
};
next.onclick = function() {
if (pageNum !== maxPage) {
pageNum++
showDom(pageNum)
}
isDisabled()
pagination.textContent = `共${maxPage}页,当前${pageNum}页`
};
这一题有一个小细节🧐🧐🧐,就是给我们的数据中价格是整数number 类型的,但展示的时候变成了货币格式加‘元’,所以我们需要对price这个字段数据进行处理一下,这里我是写了一个fmoney 函数对其进行处理。
ok,到此蓝桥杯的题就解决完了,本人比较菜,如果发现文章中出现了问题或者有一些改进之处还请多多指正,在下感激不尽🙏🙏🙏。
如果这篇文章对您有所帮助,还请点赞,评论,收藏,关注,一键四连😉😉😉
最最最后,祝各位身体倍棒,吃嘛嘛香,必拿国一!!!🏆🏆🏆
|