凭空消失的TA
题解
<!-- 引入 element-ui 样式 -->
<link rel="stylesheet" href="./element-ui-2.15.10/index.css" />
<script src="./element-ui-2.15.10/index.js"></script>
用户名片
题解
* {
margin: 0;
padding: 0;
}
html,
body {
background: #fceeb5;
height: 100%;
overflow: hidden;
}
html,
body {
background: #fceeb5;
}
.card {
width: 450px;
height: 250px;
background: #fff;
box-shadow: 0 8px 16px -8px rgba(0, 0, 0, 0.4);
border-radius: 6px;
overflow: hidden;
position: absolute;
margin: auto;
left: 0px;
bottom: 0;
top: 0;
right: 0;
}
.card h1 {
text-align: center;
}
.card img {
width: 110px;
height: 110px;
border-radius: 50%;
}
.additional {
position: absolute;
height: 100%;
background: #92bca6;
z-index: 2;
}
.user-card {
width: 150px;
height: 100%;
position: relative;
float: left;
}
.user-card .points {
top: 85%;
}
.general {
width: 300px;
height: 100%;
position: absolute;
top: 0;
right: 0;
z-index: 1;
box-sizing: border-box;
padding: 12px;
padding-top: 0;
display: flex;
flex-flow: column;
justify-content: space-around;
}
.more{
display: block;
text-align: right;
}
/* level 和 points 定位位置 */
.level,
.points {
width: 72px;
text-align: center;
position: absolute;
color: #fff;
font-size: 12px;
font-weight: bold;
background: rgba(0, 0, 0, 0.15);
padding: 2px 0;
border-radius: 100px;
white-space: nowrap;
/*这里改了一下*/
bottom: 5% !important;
}
/* level 位置这里也改了一下 */
.level {
top: -68% !important;
height: 15px;
}
/* TODO 待补充代码 居中样式*/
.center{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
芝麻开门
题解
const incantations = "芝麻开门";
function init(el) {
document.querySelector(".wrapper .btn").addEventListener("click", () => {
mPrompt()
.then((res) => {
console.log("@@@@@@@@@@" + res);
if (res === incantations) {
document
.querySelectorAll("#door .doors")[0]
.classList.add("door-left");
document
.querySelectorAll("#door .doors")[1]
.classList.add("door-right");
}
})
.catch((err) => {
console.log(err);
});
});
}
/**
* @description: 调用函数,开启弹窗,记录输入框的内容,并通过 promise 异步返回输入框中的内容
* @return {Promise}
*/
function mPrompt() {
// 弹窗必须使用以下结构 template 保存的是弹窗的结构字符串,可以先转化为 DOM 再通过 appendChild 方式插入到 body 中
const template = `
<div class="modal">
<div class="message-box">
<div class="message-header">请输入咒语</div>
<div class="message-body">
<input type="text">
</div>
<div class="message-footer">
<button class="btn btn-small" id='cancel'>取消</button>
<button class="btn btn-small btn-primary" id='confirm'>确定</button>
</div>
</div>
</div>
`;
// 让对话框弹出,先创建子节点
const dialogDiv = document.createElement("div");
dialogDiv.innerHTML = template;
// body元素最后追加一个div元素
let body = document.querySelector('body');
body.appendChild(dialogDiv);
// 获取对话框的确定和取消按钮,通过这个来操作对话框的显示与隐藏
let confirmBtn = document.getElementById("confirm");
let cancelBtn = document.getElementById("cancel");
let inputVal = "";
// TODO:待补充代码
return new Promise((resolve, reject) => {
// 点击确定事件
confirmBtn.onclick = function () {
// 注意getElementsByTagName获取到的是数组,取第一个
inputVal = document.getElementsByTagName("input")[0].value
body.removeChild(dialogDiv)
if (inputVal == "芝麻开门") {
return resolve("芝麻开门")
} else {
return reject(false)
}
}
// 取消事件
cancelBtn.addEventListener("click", () => {
body.removeChild(dialogDiv)
reject(false)
})
})
}
宝贵的一票
总结
题解
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>宝贵的一票</title>
<script src="./js/jquery.min.js"></script>
<link rel="stylesheet" href="./css/bootstrap.min.css" />
<link rel="stylesheet" href="./css/style.css" />
</head>
<body>
<div class="inner-container shadow">
<div class="mb-3 row">
<label class="col-sm-2 col-form-label">投票主题</label>
<div class="col-sm-9">
<input type="text" class="form-control" />
</div>
</div>
<div class="list"></div>
<div class="add">
<div class="addtxt">
<img src="./images/plus-square.svg" alt="加号图标" />
添加选项
</div>
</div>
<div class="form-check checkbox-one">
<input class="form-check-input" type="checkbox" value="" />
<label class="form-check-label" for="flexCheckDefault">
支持多选
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" />
<label class="form-check-label" for="flexCheckDefault">
公开投票结果
</label>
</div>
<div class="row bottom">
<div class="col">
<a class="historytxt" href="javascript:void(0)">历史投票</a>
</div>
<div class="col"></div>
<div class="col">
<button type="button" class="btn btn-light">取消</button>
<button type="button" class="btn btn-primary">发起投票</button>
</div>
</div>
</div>
<script>
let initRender = (txt) => {
return `<div class="mb-3 row" >
<label class="col-sm-2 col-form-label txt">${txt}</label>
<div class="col-sm-9">
<input type="text" class="form-control">
</div>
<div class="col-sm-1">
<!-- 删除图标 -->
<img class="del-icon" src="./images/x.svg" alt="" style="display:none" />
</div>
</div>`;
};
$(
(function () {
// 初始化的时候渲染两条数据,且不带删除符号
for (let index = 0; index < 2; index++) {
let initList = initRender(`选项${index + 1}`);
$(".list").append(initList);
}
// 点击加号逻辑
$(".add").click(function () {
// TODO 待补充代码
// 获取当前选项列表的长度,根据initRender函数中的模板字符串可得到灵感
let listLength = $('.list .row').length;
let initList = initRender(`选项${listLength + 1}`);
$(".list").append(initList);
console.log(listLength);
if (listLength >= 2) {
$('.del-icon').css("display", "block")
}
});
// 点击 x 删除逻辑,列表小于 2 项时不显示删除图标
$(document).on("click", ".del-icon", function () {
// TODO 待补充代码
// console.log($(this).parent().parent());等价于$(this).parents()[1]
$(this).parents()[1].remove()
let listLength = $('.list .row').length;
for (let index = 0; index < listLength; index++) {
$('.txt')[index].innerHTML=`选项${index+1}`
}
console.log(listLength);
if (listLength> 2) {
$('.del-icon').css("display", "block")
}else{
$('.del-icon').css("display", "none")
// 切记要删除这里呀,因为判题应该是根据dom结构来滴
$('.list .col-sm-1').remove()
}
});
})()
);
</script>
</body>
</html>
粒粒皆辛苦
思路:
题解
<!DOCTYPE html>
<html style="height: 100%">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>粒粒皆辛苦</title>
<script type="text/javascript" src="./js/echarts.min.js"></script>
<script src="./js/axios.min.js"></script>
</head>
<body style="height: 100%; margin: 0; overflow: hidden">
<div id="container" style="height: 80%; width: 80%; margin: 5% auto"></div>
<script>
var dom = document.getElementById("container");
var option;
var myChart = echarts.init(dom, null, {
renderer: "canvas",
useDirtyRect: false,
});
let initCharts = () => {
option = {
title: {
text: "近五年 x 市粮食总产量分布以及 2022 年粮食产量比例",
subtext: "单位(万吨)",
},
dataset: {
//source -> 图表显示所需的数据格式(饼形图和折线图共用),请勿手动修改此行
source: [
["全部", "2017", "2018", "2019", "2020", "2021", "2022"],
["小麦", 1, 1, 1, 1, 1, 1],
["大豆", 9, 9, 9, 9, 9, 9],
["马铃薯", 13, 13, 13, 13, 13, 13],
["玉米", 23, 23, 23, 23, 23, 23],
],
},
xAxis: { type: "category" },
yAxis: { gridIndex: 0 },
grid: { top: "55%" },
series: [
{
type: "line",
seriesLayoutBy: "row",
},
{
type: "line",
seriesLayoutBy: "row",
},
{
type: "line",
seriesLayoutBy: "row",
},
{
type: "line",
seriesLayoutBy: "row",
},
{
type: "pie",
id: "pie",
radius: "30%",
center: ["50%", "25%"],
label: {
// 2022 数据的百分比
formatter: "{b} {@2022} ({d}%)",
},
encode: {
itemName: "全部",
value: "2022",
tooltip: "2022",
},
},
],
};
if (option && typeof option === "object") {
// myChart.setOption -> 设置 echarts 数据的方法
myChart.setOption(option);
}
window.addEventListener("resize", myChart.resize);
};
initCharts();
// TODO: 待补充代码
var dataList = {}
// 初始化四个数组
var wheat = ["小麦"], soybean = ["大豆"], corn = ["玉米"], potato = ["马铃薯"]
window.onload = function () {
axios.get(' ./data.json')
.then(res => {
dataList = res.data.data;
// 双重循环取对象值
for (item in dataList) {
// console.log(dataList[item]);
let value = dataList[item]
for (subitem in value) {
// console.log(value[subitem]);
if (subitem === "wheat") {
wheat.push(value[subitem])
} else if (subitem === "soybean") {
soybean.push(value[subitem])
} else if (subitem === "corn") {
corn.push(value[subitem])
} else if (subitem === "potato") {
potato.push(value[subitem])
}
}
}
option.dataset.source = [
["全部", "2017", "2018", "2019", "2020", "2021", "2022"],
wheat,
soybean,
potato,
corn,]
myChart.setOption(option);
console.log(option);
})
}
</script>
</body>
</html>
618 活动
介绍
最近蓝桥准备了很多 618 优惠,今天我们将化身蓝桥前端小工,亲自动手制作一个 618 活动页面,快来一显身手吧。
资讯接口
题解
const http=require('http');
const server=http.createServer();
server.on('request',(req,res)=>{
// 设置请求头
res.setHeader("Content-type", "text/html;charset=utf8");
if(req.url=="/news"){
res.end(JSON.stringify(
[
{
"channelId": "5572a108b3cdc86cf39001cd",
"name": "国内焦点"
},
{
"channelId": "5572a108b3cdc86cf39001ce",
"name": "国际焦点"
}
]
))
}else{
res.end("404")
}
})
server.listen(8080,function(){
console.log("8080端口启动成功");
})
绝美宋词
题解
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>绝美宋词</title>
<link rel="stylesheet" href="css/style.css" />
<script src="./js/vue.min.js"></script>
<script src="./js/axios.min.js"></script>
</head>
<body>
<div id="app">
<h1 style="text-align: center">输入关键字,找一首词</h1>
<!-- TODO:待补充代码 -->
<div class="search-form">
<input type="text" id="search" v-model="words" class="search" placeholder="词牌名 词句 词人" />
<ul class="suggestions" v-if="">
<li v-for="item in resultList" :key="item.title">
<span class="poet" v-html="item.poetry_content"></span>
<span class="title" v-html=`${item.title}-${item.author}`></span>
</li>
</ul>
</div>
</div>
<script>
let vm = new Vue({
el: '#app',
// TODO:待补充代码
data() {
return ({
poetryList: [],//数据库数据
resultList: [],//最终展示数据
words: '' //关键字
})
},
mounted() {
axios.get('./data.json').then(res => {
this.poetryList = res.data
})
},
watch: {
words(newVal, oldVal) {
if (newVal === '') {
//如果关键字为空不匹配,直接返回
this.resultList = [];
return;
}
console.log("newVal值", newVal);
this.resultList = [];
this.poetryList.forEach(item => {
// 处理关键字,得到含有关键字的对象
if (item.poetry_content.includes(newVal) || item.title.includes(newVal) || item.author.includes(newVal)) {
// 注意这里得使用深拷贝,不然在下面重新赋值resultList时会改变原有的从JSON中的数据,
// 导致最终只能匹配一个字符
this.resultList.push(JSON.parse(JSON.stringify(item)))
}
})
// 处理高亮,全部的
let reg = new RegExp(newVal, 'g');
this.resultList.forEach(ele => {
// 关键字替换
ele.poetry_content = ele.poetry_content.replace(reg, `<span class="highlight">${newVal}</span>`)
ele.title = ele.title.replace(reg, `<span class="highlight">${newVal}</span>`)
ele.author = ele.author.replace(reg, `<span class="highlight">${newVal}</span>`);
})
},
}
})
</script>
</body>
</html>
平地起高楼
题解
function convertToTree(regions, rootId = "0") {
// TODO: 在这里写入具体的实现逻辑
// 将平铺的结构转化为树状结构,并将 rootId 下的所有子节点数组返回
// 如果不存在 rootId 下的子节点,则返回一个空数组
let resultList=[];
// let testList=[]
regions.forEach(item=>{
// let testList=[];
if(item.pid===rootId){
// 符合结果就放进去,比如最先找到四川,然后就把四川
//放进去,之后在把四川作为pid去查找下一个子代。之后在遍历子代
resultList.push(item);
// testList=resultList
// 没用,因为每一次递归后的return的是resultList,所以最终会不断
//的改变,所以得使用item.children,直接改变它的值
//resultList.children=convertToTree(regions, item.id)
// 为孩子做准备,题目也说了如果没有孩子就设置为空数组,不影响
// item.children=[],这一次递归的结果就是找到这一轮符合要求的子代
//这里把item.id作为pid继续查找子代
item.children=convertToTree(regions, item.id)
// console.log(convertToTree(regions, item.id));
// resultList.children=convertToTree(regions, item.id);
// console.log(resultList);解开注释,观察递归效果
}
})
return resultList;
}
module.exports = convertToTree; // 检测需要,请勿删除
收快递了
最初错误示例
function findRegion(regions, regionName) {
// TODO: 在这里写入具体的实现逻辑
// 需要从树状结构的行政信息中,遍历找到目标区域的行政信息,如输入:成都市,返回 [四川省,成都市]
// 如果所输入的位置信息不存在,则返回 null
let replceList=regions[0];
// 省
let resultArr=[regions[0].name];
if(replceList.name===regionName){
return resultArr;
}
var flag1=false;
for(let i=0;i<replceList.children.length;i++){
// 市级
if(replceList.children[i].name===regionName){
resultArr.push(regionName)
flag1=true
break;
}else{
// 区级
replceList.children[i].children.forEach(item=>{
if(item.name===regionName){
flag1=true
resultArr.push(replceList.children[i].name)
resultArr.push(item.name)
}
})
}
}
if(flag1){
return resultArr;
}else{
return null;
}
}
module.exports = findRegion; // 检测需要,请勿删除
题解
function findRegion(regions, regionName) {
// TODO: 在这里写入具体的实现逻辑
// 需要从树状结构的行政信息中,遍历找到目标区域的行政信息,如输入:成都市,返回 [四川省,成都市]
// 如果所输入的位置信息不存在,则返回 null
let resultArr=[]
var flag1 = false;//最终返回条件
for (let t = 0; t < regions.length; t++) {
// 省
if (regions[t].name === regionName) {
resultArr.push(regions[t].name)
flag1 = true;
break
} else {
for (let i = 0; i < regions[t].children.length; i++) {
// 市级
if (regions[t].children[i].name === regionName) {
resultArr.push(regions[t].name)
resultArr.push(regionName)
flag1 = true
break;
} else {
// 区级
regions[t].children[i].children.forEach(item => {
if (item.name === regionName) {
flag1 = true
resultArr.push(regions[t].name)
resultArr.push(regions[t].children[i].name)
resultArr.push(item.name)
}
})
}
}
}
}
if (flag1) {
return resultArr;
} else {
return null;
}
}
module.exports = findRegion; // 检测需要,请勿删除