避免修改原始元素的高亮处理
高亮处理逻辑
/* 原始dom结构 */
<div>12</div>
/* 高亮后结构 */
<div>
<span class='highlight'>12<span>
</div>
修改dom结构的缺陷
当长文章需要高亮时,如果里面拥有的匹配文字有N个时,就会修改N次,每次修改原始元素都会导致渲染耗时。
优化方案
避免修改原始结构,改用模态层设置高亮背景色,批量生成元素后,再插入document,减少渲染耗时。
主要技术难点在于获取匹配文字的宽高及位置。
文字获取高度/位置
可以通过 Range 类获取。
处理结果
<div style='position: relative; z-index: 2;'>
<span>12</span>
</div>
const span = document.querySelector('span')
const parent = span.parentElement
const text = span.childNodes[0]
const range = document.createRange()
range.setStart(text, 0)
range.setEnd(text, text.length)
const rect = range.getBoundingClientRect()
const div = document.createElement('div')
const style = div.style
style.width = `${rect.width}px`
style.height = `${rect.height}px`
style.left = `${rect.left}px`
style.top = `${rect.top + parent.scrollTop}px` // 由于 parent 有可能存在滚动,如果不修复这个偏移,会导致文字定位在滚动后失效
style.position = 'absolute'
style.background = 'yellow'
style.zIndex = 1
document.body.appendChild(div)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律