前端分段式渲染较长文章

embedded/2024/11/11 0:44:00/

实现思路:

1. 后端返回整篇文章

2. JavaScript 分段处理:将文章按一定的字符或段落长度分割,然后逐步将这些段落追加到页面上。

3. 定时器或递归调用:使用 setInterval 或 setTimeout 来控制段落的逐步渲染。

代码实现示例

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>流体文章渲染 - 狂人日记</title><style>* {box-sizing: border-box;}body {font-family: "Microsoft YaHei", Arial, sans-serif;padding: 20px;background-color: #f4f4f4;}.article-container {width: 100%;max-width: 600px;margin: 0 auto;background-color: white;padding: 20px;border-radius: 8px;box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1);}.loading {font-style: italic;color: gray;}/* 防止自动换行,保证连续渲染的文字不强制换行 */.no-break {white-space: pre-wrap; /* 保留文本中的换行和空格 */word-wrap: break-word; /* 超出宽度时自动换行 */}</style>
</head>
<body><div class="article-container" id="articleContainer"><div id="content" class="no-break"></div><div id="loadingIndicator" class="loading">正在加载更多内容...</div>
</div><script>// 鲁迅《狂人日记》较长片段const longArticle = `《狂人日记》鲁迅今天晚上,很好的月光。我不见他已经有三十多年;我知道我本来是病了。今天看见他的眼睛,又让我害怕起来。我知道,他在害我。他的眼睛……今天真不对,和平时不一样。我想,他一定是早已预备下手,今天晚上便要动手的了。我的心跳得很厉害;不过我早已知道他会这样预备。他们都是这样,想法,害我。今天晚上,我忽然想起二十多年前,他对我说的一句话:“吃人。”吃人!这真叫我吓了一跳。我没有想到。他说得这么直截了当,这么认真。以前,我看见书上说“吃人”,总以为是瞎说。今天晚上,我才知道,书上说的竟是真的。我躺在床上,睁着眼睛,仔细想了想,越想越觉得害怕;因为我忽然想到,他们害人,还不只是今天,从古以来,他们就是这样。吃人!我想了半夜,差不多明白了:我自己也有过吃人的念头,我也有过要吃人的时候。这种想法,是从古代传下来的,如今我才懂得。 过去的历史,处处是吃人的记载。至于他们怎么吃,我全都知道了…… 但是,我绝对不愿再去吃人了!我想着,想着,忽然感到无比的悲哀,因为,我觉得自己完全陷在了这个吃人的大陷阱里,摆脱不开。我真想大叫几声:“不要吃人!不要再吃人!”可是喊不出来。我心里越发沉重,好像被无数的锁链绑住一般。昨天晚上,我又梦见他们了,他们全都聚在一起,脸上带着一种恶毒的笑容,像狼群一样盯着我。今天我终于明白了,他们早已准备好了,等着我入圈套呢。他们不是要吃我的肉,而是要夺走我的灵魂。我的心里越来越沉重,几乎要崩溃了……天哪,我究竟该怎么办?`;const contentElement = document.getElementById('content');const loadingIndicator = document.getElementById('loadingIndicator');let currentIndex = 0;const CHUNK_SIZE = 150; // 每次渲染的字符数调整为150,显示更多内容// 分段渲染文章内容function renderNextChunk() {if (currentIndex < longArticle.length) {const nextChunk = longArticle.slice(currentIndex, currentIndex + CHUNK_SIZE);contentElement.textContent += nextChunk; // 追加文本,不创建新段落currentIndex += CHUNK_SIZE;// 如果文章未加载完,继续调用下一个 chunksetTimeout(renderNextChunk, 1000); // 每1秒渲染下一段} else {loadingIndicator.style.display = 'none'; // 隐藏加载提示}}// 启动渲染renderNextChunk();
</script></body>
</html>


http://www.ppmy.cn/embedded/115125.html

相关文章

Hive parquet表通过csv文件导入数据

1. background 已建好了 hive parquet 格式的表, 需要从服务器的csv导入数据至该hive表 2. step 提前上传csv至服务器 /path/temp.csv 创建 textfile 格式的中转表(这里使用内部表,方便删除) ,源表名dw_procurement.dwd_tc_comm_plant ,这里中转表加上了csv后缀 CREATE TA…

计算机基础(Computer Fundamentals)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

【设计模式-外观】

这里写自定义目录标题 定义UML图角色作用代码使用场景 定义 为子系统中一组相关接口提供一致界面&#xff0c;定义一个高级接口&#xff0c;使得子系统更加容易使用。 UML图 角色作用 外观&#xff08;Facade&#xff09;角色&#xff1a;这是外观模式的核心&#xff0c;它知…

openEuler系统安装内网穿透工具实现其他设备公网环境远程ssh连接

目录 前言 1. 本地SSH连接测试 2. openEuler安装Cpolar 3. 配置 SSH公网地址 4. 公网远程SSH连接 5. 固定连接SSH公网地址 6. SSH固定地址连接测试 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊openEuler系统安装内网穿透工具实现其他…

某建筑市场爬虫数据采集逆向分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 目标网站 aHR0cHM6Ly9qenNjLm1vaHVyZC5nb3YuY24vZGF0YS9jb21wYW55P2NvbXBsZXhuYW1lPSVFNiVCMCVCNA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

从一个Vite Vue项目开始 - 整体设计

本篇我们将从一个基础的Vite项目开始&#xff0c;构建开发环境并介绍我们的整体设计思路 从一个Vite Vue项目开始项目的整体设计小结 从一个Vite Vue项目开始 vite 是一个新型的前端构建工具&#xff0c;能够显著的提升前端的开发构建效率&#xff0c;经过几年的发展逐渐的完善…

家居小程序有什么用?

家居小程序在现代家居生活中扮演着越来越重要的角色&#xff0c;其功能和用途广泛且实用。以下是家居小程序的主要用途&#xff1a; 一、商品展示与购物 商品展示&#xff1a;家居小程序可以展示各种家居产品&#xff0c;包括家具、家电、装饰品等&#xff0c;用户可以通过分类…

深入理解指针(5)

目录 1. sizeof和strlen 的对比 2. 数组和指针笔试题解析 3 . 指针运算笔试题解析 ——————————————————————————————————————————— 1.sizeof和strlen的对比 1.1sizeof sizeof计算变量所占内存内存空间大小的&#xff0c;单位是…