我正在一个 React 应用程序中创建一个文本转语音功能,该功能可以通过在其后面放置背景来突出显示当前所说的单词。
该功能与Firefox 阅读器视图非常相似。
我实现的解决方案只是剪切段落字符串,并在每次渲染时在口语单词周围放置一个跨度,这使得资源占用很大并且无法制作动画。
这是代码:(我打算废弃)
export interface SpeakEvent {
start: number;
end: number;
type: string;
}
export default function TextNode({ content }: TextNodeProps) {
const [highlight, setHighlight] = useState<SpeakEvent | null>(null);
useEffect(() => {
registerText((ev) => {
if (ev?.type === 'word' || !ev)
setHighlight((old) => {
/* Irrelevant code */
return ev;
});
}, content);
}, [content]);
const { start, end } = highlight ?? {};
let segments = [content];
if (highlight) {
segments = [
segments[0].slice(0, start),
segments[0].slice(start, end),
segments[0].slice(end),
];
}
return (
<>
{segments.map((seg, i) =>
i === 1 ? (
<span key={i} className={'highlight'}>
{seg}
</span>
) : (
seg
)
)}
</>
);
}
Firefox 阅读器使用更智能的方式来做到这一点。它使用放置在口语单词后面的 div,然后将其四处移动:
包含高亮效果的div直接使用绝对坐标放置。
他们如何在只知道字符串索引的情况下访问段落内单词的边界矩形?
慕莱坞森
相关分类