有没有可能在HTML文档中使用不包装<span>
或其他标签的情况下突出显示文本?
例如,在HTML代码<p>The quick fox</p>
中,我想突出显示quick
,但不添加DOM元素。向父元素添加DOM元素是可以的。
谢谢!
有没有可能在HTML文档中使用不包装<span>
或其他标签的情况下突出显示文本?
例如,在HTML代码<p>The quick fox</p>
中,我想突出显示quick
,但不添加DOM元素。向父元素添加DOM元素是可以的。
谢谢!
不,无法在所有浏览器中以可移植的方式实现。
您无法告诉浏览器在本质上更改DOM的情况下以不同的方式呈现文本,无论您是静态地还是动态地(例如使用Javascript作为后处理步骤)。
编辑:在Chrome 2019年左右开始,您可以使用Scroll To Text Fragment,但这不是HTML或浏览器标准功能。
如果您使用具有透明重复背景图像或透明背景颜色(使用rgba或hsla)的绝对定位元素,并将其定位在所选区域上方,则可以实现。
另一种方法是使用没有背景的绝对定位画布元素,该元素占用整个浏览器视口并在所选内容上绘制透明矩形。
然而,它们都有自己的注意事项。
这个答案是基于我为我的开源浏览器扩展程序Mark My Search(repository)所做的研究得出的,该扩展程序可以在网页上突出显示您搜索的文本。被接受的方法的自然破坏性导致我考虑了许多替代方案。如果未选中高级选项“使用经典突出显示”,则扩展程序将仅使用以下一种方法,这不是默认设置,因为我将要描述的缺点。
我下面的所有方法都只涉及向DOM添加额外的绘画,因此没有样式文本或以其他方式更改现有内容的选项。但是,它们是完全非破坏性的操作,可以带来效率提升,使它们成为竞争对手的替代方案。
重要提示:本答案的假设是您直接将样式应用于元素,或使用样式表和生成的属性远程应用样式。仍需要此类型的DOM操作。
单体式
用一个元素覆盖整个内容区域。
将所有高亮绘制到该元素上。
优点:
缺点:
组合式
对于所有要高亮的文本,查看包含文本范围部分的最低级别不同元素。
在每个这些元素上绘制高亮。
优点:
缺点:
background-image
)。混合式
display: block
以处理其display: inline
子元素的高亮)。元素
优点:
缺点:
SVG
background-image
上使用url()
。优点:
缺点:
url()
,期望它提取远程内容。画布
<canvas>
元素。background-image
上使用url()
。优点:
缺点:
url()
:页面CSP(内容安全策略)会(很少)阻止使用url()
,期望它提取远程内容。Houdini
background-image: paint({worklet name})
。element()
background: element({ID of highlighting element})
。优点:
缺点:
background
而不是只有background-image
,导致更多地覆盖元素背景。这
我不会详细介绍这个,因为它非常特定于您的需求。然而,为了在应用于整个页面时获得完全最新的高亮显示,我需要:
一个观察文档主体的MutationObserver
,观察subtree
、childList
和characterData
,以便检测可能影响匹配的所有更改。我的情况非常极端,这就是为什么我必须观察整个文档的原因;我使用了各种方法进行优化,包括过滤不需要关注的事件。
一个观察当前可见的高亮元素的ResizeObserver
,以便在布局发生变化时重新计算高亮显示。
一个观察所有高亮元素的IntersectionObserver
,以便在它们出现在视口中时绘制高亮显示和ResizeObserver
,只有在需要时才进行。 这只是一项优化措施。
这里是我使用多种上述方法(可替换)实现的PR,采用高度结构化的方法 - 包括跨DOM缓存和其他优化,例如将其分解成多个阶段 - 使其在各种颜色中突出显示整个平均页面的情况下也能高效运行。在PR中提供了概述。
作为最极端的可能情况之一,其他人完全可以在不显著降低性能的情况下取得良好的结果。
我很乐意回答有关我的实现或使用这些技术入门的任何问题。
*由于浏览器在客户端矩形与实际布局和位置相关联时的复杂行为,很难确保基于覆盖的高亮算法在所有情况下都能正确定位高亮框。我仍然无法正确考虑边框效果(会干扰计算)或奇怪的流内容情况,但是只使用Range.getClientRects()
和Element.getClientRects()
的结果技术上是可能的。.
这是不可能的。
如果你只是想在原始源代码中没有标签,那么可以通过后期使用Javascript魔法来添加标签。你可以做一些类似于:
<p highlight="quick">The quick fox</p>
编写一个JQuery/Prototype/plain JS函数来实时高亮它,但是为什么要这样做呢?如果您能详细阐述一下,其他人可能会想出一些想法。
<canvas>
元素,并手动渲染所有内容。