1 分•作者: Improvement•9 个月前
返回首页
最新
1 分•作者: 01-_-•9 个月前
1 分•作者: tzury•9 个月前
2 分•作者: jackalnom•9 个月前
1 分•作者: BallsInIt•9 个月前
23 分•作者: panphora•9 个月前
嗨,HN!我一直对现代的 WYSIWYG 编辑器感到非常沮丧,于是开始尝试构建自己的编辑器。<p>我遇到的问题很简单:我想要一种低技术含量的方式来输入带样式的文本,但我不想加载一个复杂的 500KB 的库,尤其是在同一个页面上要初始化几十次的情况下。<p>纯 <textarea> 中的 Markdown 是一个比完整的 WYSIWYG 更好的选择,但它的主要缺点是,在没有任何格式的情况下,它看起来很丑陋。我可以接受,但我的客户肯定不行。<p>我深入研究了 ContentEditable 几年,但最终意识到别人已经比我做得更好了。<p>我一直在思考这个问题:为什么我不能拥有一个简单、高效、美观的 Markdown 编辑器?我见过的最好的解决方案是 Ghost 的分屏编辑器:左边是 Markdown,右边是预览,并带有同步滚动。<p>然后,大约一年前,我脑海中闪过一个想法:如果我们在一块 <textarea> 后面叠加一个预览窗格会怎么样?如果我们将它们完美对齐,那么即使你只编辑纯文本,它看起来和感觉也像是在编辑富文本!<p>当然,也会有一些缺点:你必须使用等宽字体,所有内容都必须使用相同字号,并且所有 Markdown 标记都必须显示在最终预览中。<p>但这些都是我可以接受的权衡。<p>总之,版本 1 进展得并不顺利……事实证明,保持 textarea 和渲染的预览对齐比我想象的要难。这是我发现的:<p>- 列表很难对齐 - 项目符号会破坏字符对齐。使用 HTML 实体(• 用于项目符号)解决,以保持等宽<p>- 并非所有等宽字体都是真正的等宽字体 - 粗体和斜体文本即使在“等宽”字体中也可能具有不同的宽度,从而破坏了完美的叠加<p>- 嵌入是一个噩梦 - 来自父页面的任何继承 CSS(边距、填充、行高)都会改变对齐。即使是 1px 的偏移也会完全破坏这种错觉<p>解决方案是进行强迫症式的规范化:<p><pre><code> // 整个技巧:一个透明的 textarea 覆盖在预览 div 上
layerElements(textarea, preview)
applyIdenticalSpacing(textarea, preview)
// 使 textarea 不可见,但保留光标
textarea.style.background = 'transparent'
textarea.style.color = 'transparent'
textarea.style.caretColor = 'black'
// 保持它们同步
textarea.addEventListener('input', () => {
preview.innerHTML = parseMarkdown(textarea.value)
syncScroll(textarea, preview)
})
</code></pre>
一周前,我开始尝试版本 2,并发现了 GitHub 的 <markdown-toolbar> 元素,它在纯 <textarea> 中很好地处理了 Markdown 格式。<p>这个实验变成了 OverType (<a href="https://overtype.dev" rel="nofollow">https://overtype.dev</a>),我今天向你展示它——它是一个富 Markdown 编辑器,实际上只是一个 <textarea>。关键的见解是,一旦你解决了对齐挑战,你就可以免费获得所有原生 textarea 提供的功能:撤销/重做、移动键盘、可访问性和原生性能。<p>到目前为止,它在浏览器和移动设备上的表现都出奇地好。我得到了一个小型包(总共 45KB)中的高性能富文本编辑功能。这有点傻,但它有效!我计划在我的所有项目中使用它,并且我想保持它的简单和极简。<p>如果你能试用一下,并告诉我你对它的看法,我将非常高兴。编辑愉快!<p>---<p>演示和文档:<a href="https://overtype.dev" rel="nofollow">https://overtype.dev</a><p>GitHub:<a href="https://github.com/panphora/overtype" rel="nofollow">https://github.com/panphora/overtype</a>
22 分•作者: craneca0•9 个月前
1 分•作者: zdw•9 个月前
1 分•作者: melonmars•9 个月前
1 分•作者: alliancedamages•9 个月前
3 分•作者: NomDePlum•9 个月前
2 分•作者: PaulHoule•9 个月前
1 分•作者: Brajeshwar•9 个月前
1 分•作者: Brajeshwar•9 个月前
1 分•作者: rntn•9 个月前
1 分•作者: sabrina_ramonov•9 个月前
1 分•作者: csense•9 个月前
5 分•作者: bobnarizes•9 个月前
9 分•作者: todsacerdoti•9 个月前
5 分•作者: todsacerdoti•9 个月前