我正在编写一个简单的基于 contenteditable 的 HTML 编辑器,它允许用户编辑一个由他们自己的 CSS 设置样式的页面(他们可以实时编辑),还可以做一些基本的事情,比如插入新标签、应用类等。
我想要的一个功能是切换 div 周围虚线边框的显示选项,就像您通常在所见即所得 HTML 编辑器(如 Dreamweaver、Expression Web 等)中找到的那样。(这有助于用户看到她的 div,即使它们没有可见的边框。)
有没有办法做到这一点?一些想法:
我不能简单地修改实际/现有 div 上的 CSS,因为它们可能已经定义了自己的边框,我不应该用点来消除它们。理想情况下,我可以在现有边界周围显示一个边界,这就是前面提到的商业编辑器中的内容。即使我退回到实际在没有现有边界的元素上设置边界,尤其是要弄清楚哪些没有边界可能很困难。
:hover
面对动态改变计算样式的事情。我可以将这些 div 包装在新的 div 中,这些 div 又具有虚线边框。棘手的部分是处理他们的 CSS,例如:
包装器的样式必须与其子级相似,例如,一个 div
width:50px
必须有一个包装器width:50px
(大致),所以我要么需要不断轮询(因为没有办法通知间接样式更改,例如在类) 用于更改计算样式(完全不可扩展),或者实现我自己的 CSS 引擎,该引擎运行并确定每次用户实时编辑他们的 CSS 时发生了什么变化。用我自己的 div 污染 DOM 是侵入性的,并且会干扰以下规则:
/* these may or may not be divs */ .a > .b > .c { ... }
或者:
/* if this is wrapped, then they'll all be :first-child */ .foo:first-child { ... }
也许:
/* immediate children of my wrappers would inherit the dotted borders */ .foo { border: inherit; }
也许有一种方法可以自动稳健地重写这些规则——以最后一个例子为例:
:not(.my-dotted-border) > .foo { border: inherit; }
但即使理论上可能,也有很多情况需要担心,而且会很麻烦。
最后,也许有一种方法可以折叠边距,即使是虚线边框,但我不知道。
另一个想法是在顶部覆盖边框(根据底层元素的尺寸/偏移量绝对使用 JS 定位),但这对于具有特定 z-index 的重叠元素来说很难看,而且我需要再次监视所有元素用于样式更改。除了现在仅仅监视明确指定的样式的变化是不够的,因为我需要对甚至对偏移和尺寸的变化做出反应(例如,如果用户键入一些文本,它可能会按下它下面的所有元素,所以我必须通过更新叠加层对此做出反应)。
一个相关的问题是查看页面大纲,但这是从想要查看大纲的用户的角度来看的 - 我从基于 Web 的编辑器实现的角度询问如何提供这些大纲。
提前感谢您的任何提示。