博客无限滚动加载(html、css、js)实现

介绍

这是一个简单实现了类似博客瀑布流加载功能的页面,使用html、css、js实现。简单易懂,值得学习借鉴。👍

演示地址:https://i_dog.gitee.io/easy-web-projects/infinite_scroll_blog/index.html

代码

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>我的博客</title><link rel="stylesheet" href="style.css">
</head>
<body><h1>博客</h1><div class="filter-container"><input type="text" class="filter" id="filter" placeholder="搜索文章"></div><div id="posts-container"></div><div class="loader"><div class="circle"></div><div class="circle"></div><div class="circle"></div></div><script src="script.js"></script>
</body>
</html>

style.css

/* 从Google Fonts(谷歌字体)中导入名为"Roboto"的字体,并将其应用于网页中的文本内容。 */
@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');* {box-sizing: border-box;
}body {background-color: #296ca8;font-family: 'Roboto', sans-serif;display: flex;flex-direction: column;color: #fff;/* 元素在侧轴居中。 */align-items: center;/* 伸缩元素向每主轴中点排列。 */justify-content: center;min-height: 100vh;margin: 0;padding-bottom: 100px;
}
h1 {margin-bottom: 20px;text-align: center;
}
.filter-container {margin-top: 20px;width: 80vw;max-width: 800px;/* border: 1px solid black; */
}
.filter {width: 100%;padding: 12px;font-size: 16px;
}.post {position: relative;background: #4992d3;/* 创建一个元素的阴影效果水平偏移量 垂直偏移量 阴影的模糊半径  阴影的颜色和透明度*/box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);border-radius: 3px;padding: 20px;margin: 40px 0;display: flex;width: 80vw;max-width: 800px;
}.post .post-title {margin: 0;
}
.post .post-body {margin: 15px 0 0;line-height: 1.3;
}.post .post-info {margin-left: 20px;
}
.post .number {position: absolute;top: -15px;left: -15px;font-size: 15px;width: 40px;height: 40px;border-radius: 50%;background: #fff;color: #296ca8;display: flex;align-items: center;justify-content: center;padding: 7px 10px;}
.loader {/* 默认透明 */opacity: 0;display: flex;position: fixed;bottom: 50px;/* 添加过渡效果要过渡的CSS属性   过渡的持续时间   过渡的速度曲线*/transition: opacity 0.3s ease-in;
}
.loader.show {opacity: 1;
}
.circle {background-color: #fff;width: 10px;height: 10px;/* 呈现出一个完整的圆形形状 */border-radius: 50%;margin: 5px;/* 添加动画效果 应用的动画名称  动画的持续时间  动画的速度曲线  动画循环播放*/animation: bounce 0.5s ease-in infinite;
}/* 选择文档中第一个类名为"circle"的元素 */
.circle:nth-of-type(2) {animation-delay: 0.1s;
}
.circle:nth-of-type(3) {animation-delay: 0.2s;
}@keyframes bounce {0%,100% {transform: translateY(0);    }50% {transform: translateY(-10px);}
}

script.js

const postsContainer = document.getElementById('posts-container')
// 获取文档中具有类名"loader"的第一个元素
const loading = document.querySelector('.loader')
const filter = document.getElementById('filter')let limit = 5
let page = 1// 从API获取博客
async function getPosts() {// 使用await关键字等待fetch()函数返回的Promise对象,// 这个Promise对象表示服务器响应的结果。const res = await fetch(`https://jsonplaceholder.typicode.com/posts?_limit=${limit}&_page=${page}`)// 使用res.json()方法将响应体解析为JSON格式的数据。const data =  await res.json()return data
}// 在DOM中展示博客列表
async function showPosts() {const posts = await getPosts()posts.forEach(post => {const postEl = document.createElement('div')postEl.classList.add('post')postEl.innerHTML = `<div class="number">${post.id}</div><div class="post-info"><h2 class="post-title">${post.title}</h2><p class="post-body">${post.body}</p></div>`postsContainer.appendChild(postEl)})
}// 展示加载动画并且获取其他博客
function showLoading() {loading.classList.add('show')setTimeout(() => {loading.classList.remove('show')setTimeout(() => {page++showPosts()},300)},1000)
}// 搜索框查找博客
function filterPosts(e) {const term = e.target.value.toUpperCase()const posts = document.querySelectorAll('.post')posts.forEach(post => {const title = post.querySelector('.post-title').innerText.toUpperCase()const body = post.querySelector('.post-body').innerText.toUpperCase()if(title.indexOf(term) > -1 || body.indexOf(term) > -1) {post.style.display = 'flex'} else {post.style.display = 'none'}})// console.log('Filtering posts...');
}// 获取初始博客
showPosts()window.addEventListener('scroll', () => {// scrollTop属性表示文档在垂直方向上滚动的距离,// scrollHeight属性表示文档内容的总高度,// clientHeight属性表示可视区域的高度。const {scrollTop, scrollHeight, clientHeight} = document.documentElementif (scrollTop + clientHeight >= scrollHeight - 5) {showLoading()}
})filter.addEventListener('input', filterPosts)

补充

该项目从github中的vanillawebprojects仓库收集。

原始代码:原始代码地址icon-default.png?t=N7T8https://github.com/bradtraversy/vanillawebprojects/tree/master/infinite_scroll_blog

本文代码:本文代码地址icon-default.png?t=N7T8https://gitee.com/i_dog/easy-web-projects/tree/master/infinite_scroll_blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/123762.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云 Cloud Studio 实战训练营结营活动获奖公示

点击链接了解详情 “腾讯云 Cloud Studio 实战训练营” 是由腾讯云联合 CSDN 推出的系列开发者技术实践活动&#xff0c;通过技术分享直播、动手实验项目、优秀代码评选、有奖征文活动等&#xff0c;让广大开发者沉浸式体验腾讯云开发者工具 Cloud Studio 的同时&#xff0c;实…

vue ant 隐藏列

vue ant 隐藏列 重要代码 type: FormTypes.hidden{ title: 序号, key: barCode, width: 10%, type: FormTypes.hidden},

Docker项目部署

目录 一、前端项目部署 1、上传文件 2、开启容器 3、测试 二、后端项目部署 1、打包java项目 2、将jar包和Dockerfile文件长传到Linux系统 3、构建镜像 4、开启容器 5、测试 一、前端项目部署 1、上传文件 里面包括页面和配置文件 worker_processes 1;events {worker…

14:00面试,14:06就出来了,这问的过于变态了。。。

前言 刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资…

竞赛选题 机器视觉人体跌倒检测系统 - opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 机器视觉人体跌倒检测系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&…

斯坦福数据挖掘教程·第三版》读书笔记(英文版)Chapter 10 Mining Social-Network Graphs

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT。 Chapter 10 Mining Social-Network Graphs The essential characteristics of a social network are: There is a collection of entities that participate in the network. Typically, these entiti…

华为云云耀云服务器L实例评测|Huawei Cloud EulerOS 自动化环境部署

[toc] Huawei Cloud EulerOS 自动化环境部署 云耀云服务器L实例【Huawei Cloud EulerOS 2.0 64bit】 Python Git Google Chrome Chromedriver Selenium More… 1. Python 镜像创建后自带。 2.Git 拉取项目。 sudo yum install git3. Google Chrome 使用root权限或sudo权…

AWS Lambda Golang HelloWorld 快速入门

操作步骤 以下测试基于 WSL2 Ubuntu 22.04 环境 # 下载最新 golang wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz# 解压 tar -C ~/.local/ -xzf go1.21.1.linux-amd64.tar.gz# 配置环境变量 PATH echo export PATH$PATH:~/.local/go/bin >> ~/.bashrc …

了解”变分下界“

“变分下界”&#xff1a;在变分推断中&#xff0c;我们试图找到一个近似概率分布q(x)来逼近真实的概率分布p(x)。变分下界是一种用于评估近似概率分布质量的指标&#xff0c;通常用来求解最优的近似分布。它的计算涉及到对概率分布的积分或期望的估计

pytorch之nn.Conv1d详解

自然语言处理中一个句子序列&#xff0c;一维的&#xff0c;所以使用Conv1d

【数组及指针经典笔试题解析】

1.数组和指针笔试题 题目1 int main(){int a[5] { 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5};int * ptr (int * )(&a 1);printf("%d&#xff0c;%d"&#xff0c;*(a 1)&#xff0c;*(ptr - 1));return 0;}图文解析&#xff1a; int * ptr …

Ai项目十四:基于 LeNet5 的手写数字识别及训练

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 pytorch复现lenet5模型&#xff0c;并检测自己手写的数字图片。 利用torch框架搭建模型相对比较简单&#xff0c;但是也会遇到很多问题&#xff0c;网上资料很多&#xff0c;搭建模型的方法大同小异&#xff0c;…