当前位置: 首页 > news >正文

前端分段式渲染较长文章

实现思路:

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>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WebGL渲染与创建2D内容
  • Redis-分片集群
  • 关于在vue2中给el-input等输入框的placeholder加样式
  • 一些关于线程之间协作的心得
  • 基于微信小程序的美食外卖管理系统
  • npm install --force or --legacy-peer-deps
  • 1网络安全的基本概念
  • LeetCode从入门到超凡(二)递归与分治算法
  • C++中move和forword的区别
  • spring自定义属性编辑器
  • SOCKS5代理为何比HTTP代理更快?
  • LeetCode63:不同路径II
  • 生成式AI:ChatGPT及其在各行业的应用前景
  • MyBatis-Plus 插件扩展
  • k8s部署jenkins集群时,使用ThinBackup进行定期备份
  • JS 中的深拷贝与浅拷贝
  • Angular 响应式表单 基础例子
  • ES6核心特性
  • Git同步原始仓库到Fork仓库中
  • Intervention/image 图片处理扩展包的安装和使用
  • Java面向对象及其三大特征
  • Java应用性能调优
  • laravel 用artisan创建自己的模板
  • MYSQL 的 IF 函数
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • spark本地环境的搭建到运行第一个spark程序
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue自定义指令实现v-tap插件
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 盘点那些不知名却常用的 Git 操作
  • 如何选择开源的机器学习框架?
  • 提醒我喝水chrome插件开发指南
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2)MFC+openGL单文档框架glFrame
  • (8)STL算法之替换
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (算法)Game
  • (转)C#调用WebService 基础
  • (转)拼包函数及网络封包的异常处理(含代码)
  • **PHP二维数组遍历时同时赋值
  • .net core 的缓存方案
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net接口调试与案例
  • .net经典笔试题
  • .NET上SQLite的连接
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor