实现的前端效果图
该页面实现的功能是能够在下方的名字信息列表中检索到输入的名字信息。
Html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Live User Filter</title>
</head>
<body>
<div class="container">
<header class="header">
<h4 class="title">Live User Filter</h4>
<small class="subtitle">Search by name and/or location</small>
<input type="text" id="filter" placeholder="Search">
</header>
<ul id="result" class="user-list">
<li>
<h3>Loading...</h3>
</li>
</ul>
</div>
<script src="script.js"></script>
</body>
</html>
解释每一行代码的作用:
6. `<link rel="stylesheet" href="style.css" />`:这是一个外部样式表的链接,引入名为"style.css"的CSS文件来定义页面的样式。
7. `<title>Live User Filter</title>`:这是页面的标题,将显示在浏览器的标签页上。
8. `<body>`:这是HTML文档的主体部分,包含了页面的实际内容。
9. `<div class="container">`:这是一个带有"class"属性为"container"的div元素,用于包裹页面的内容。
.container {
border-radius: 5px;
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
overflow: hidden;
width: 300px;
}
10. `<header class="header">`:这是一个带有"class"属性为"header"的header元素,用于显示页面的标题和搜索框。
11. `<h4 class="title">Live User Filter</h4>`:这是一个带有"class"属性为"title"的h4标题元素,显示页面的标题。
12. `<small class="subtitle">Search by name and/or location</small>`:这是一个带有"class"属性为"subtitle"的small元素,显示页面的副标题。<small>
元素用于表示较小或次要的文本。
13. `<input type="text" id="filter" placeholder="Search">`:这是一个文本输入框,带有"type"属性为"text","id"属性为"filter",并显示一个占位符为"Search"的提示文字。
14. `<ul id="result" class="user-list">`:这是一个带有"id"属性为"result"和"class"属性为"user-list"的无序列表元素,用于显示用户筛选结果。
15. `<li>`:这是一个列表项元素,用于包裹每个用户的信息。
16. `<h3>Loading...</h3>`:这是一个带有"h3"标题元素,显示一个正在加载的提示信息。
17. `</ul>`:结束无序列表元素的标签。
18. `</div>`:结束div元素的标签。
19. `<script src="script.js"></script>`:这是一个脚本标签,引入名为"script.js"的JavaScript文件,用于处理页面的交互逻辑和用户筛选功能。
CSS
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap');
* {
box-sizing: border-box;
}
body {
background-color: #f8f9fd;
font-family: 'Roboto', sans-serif;
display: flex;
align-items: center;
justify-content: center;
height: 100vh;
overflow: hidden;
margin: 0;
}
.container {
border-radius: 5px;
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);
overflow: hidden;
width: 300px;
}
.title {
margin: 0;
}
.subtitle {
display: inline-block;
margin: 5px 0 20px;
opacity: 0.8;
}
.header {
background-color: #3e57db;
color: #fff;
padding: 30px 20px;
}
.header input {
background-color: rgba(0, 0, 0, 0.3);
border: 0;
border-radius: 50px;
color: #fff;
font-size: 14px;
padding: 10px 15px;
width: 100%;
}
.header input:focus {
outline: none;
}
.user-list {
background-color: #fff;
list-style-type: none;
margin: 0;
padding: 0;
max-height: 400px;
overflow-y: auto;
}
.user-list li {
display: flex;
padding: 20px;
}
.user-list img {
border-radius: 50%;
object-fit: cover;
height: 50px;
width: 50px;
}
.user-list .user-info {
margin-left: 10px;
}
.user-list .user-info h4 {
margin: 0 0 10px;
}
.user-list .user-info p {
font-size: 12px;
}
.user-list li:not(:last-of-type) {
border-bottom: 1px solid #eee;
}
.user-list li.hide {
display: none;
}
.header input:focus
表示选择处于焦点状态的 <input>
元素
JavaScript
const result = document.getElementById('result')
const filter = document.getElementById('filter')
const listItems = []
getData()
filter.addEventListener('input', (e) => filterData(e.target.value))
async function getData() {
const res = await fetch('https://randomuser.me/api?results=50')
const { results } = await res.json()
// Clear result
result.innerHTML = ''
results.forEach(user => {
const li = document.createElement('li')
listItems.push(li)
li.innerHTML = `
<img src="${user.picture.large}" alt="${user.name.first}">
<div class="user-info">
<h4>${user.name.first} ${user.name.last}</h4>
<p>${user.location.city}, ${user.location.country}</p>
</div>
`
result.appendChild(li)
})
}
function filterData(searchTerm) {
listItems.forEach(item => {
if(item.innerText.toLowerCase().includes(searchTerm.toLowerCase())) {
item.classList.remove('hide')
} else {
item.classList.add('hide')
}
})
}
第1行:获取页面上的名为"result"的元素。
第2行:获取页面上的名为"filter"的元素。
第3行:定义一个空数组listItems,用于存储用户数据的列表项。
第5行:调用getData函数,获取用户数据并显示在页面上。
第7行:给"filter"元素添加一个input事件监听器,当用户输入时触发filterData函数。
第9行:定义一个异步函数getData,用于获取用户数据。
第10行:使用fetch函数发送一个请求,获取随机用户数据。
第12行:解析响应数据为JSON格式。
第14行:清空"result"元素的内容。
第16行:遍历每个用户数据。
第18行:创建一个li元素。
第20行:将li元素添加到listItems数组中。
第22行:设置li元素的innerHTML,显示用户的头像、姓名和地址。
第26行:将li元素添加到"result"元素中。
第34行:定义一个函数filterData,用于根据搜索词过滤显示用户数据。
第35行:遍历listItems数组中的每个元素。
第36行:如果元素的innerText包含搜索词(不区分大小写),则移除hide类名,显示该元素。
第39行:否则,添加hide类名,隐藏该元素。
数据的调用关于js相关的代码还不是很理解。
这是上面https://randomuser.me/api?results=50给的数据
前面是github上的代码
明天继续理解~~~~