Estoy buscando construir un editor con Slate o ProseMirror y veo un comportamiento extraño con Chrome alrededor de la posición de intercalación y el área de selección cuando utilizo un elemento en línea. El problema 1 se muestra en la primera imagen a continuación. Cuando la posición del cursor de texto está detrás de la "f", el cursor se muestra en la parte superior de la imagen. El problema 2 está en la segunda imagen: al seleccionar el texto, se muestra un área resaltada que es tan alta como en el elemento en línea. ¿Hay alguna manera de controlar este comportamiento y, en cambio, haga que el cursor se muestre en la posición del texto y solo resalte el espacio alrededor del texto (incluso si la imagen en línea está haciendo que la altura de la línea sea más grande)
Me gustaría imitar el comportamiento aquí, desde firefox:
Se produjeron imágenes de ejemplo usando la demostración ProseMirror aquí: https://prosemirror.net/examples/basic/
Un ejemplo mínimo (gracias @Kaiido) con JSBin :
<div contenteditable>Test text<img src="https://upload.wikimedia.org/wikipedia/en/9/9b/Yoda_Empire_Strikes_Back.png">Testing</div>
No estoy seguro de cómo se comporta esto en otros sistemas operativos, pero estoy usando macOS Catalina.
fuente
<div contenteditable>Test text<img src="https://upload.wikimedia.org/wikipedia/en/9/9b/Yoda_Empire_Strikes_Back.png">Testing</div>
. Ahora, así es como lo hacen, actualmente no hay especificaciones en torno a eso, por lo que son bastante libres de hacer lo que consideran mejor. ¿Necesita absolutamente estas bibliotecas, o una solución en bruto es suficiente para usted?Respuestas:
Puede solucionar el problema de selección utilizando flexbox. Originalmente intenté usar
align-items: flex-end
pero estaba obteniendo un comportamiento extraño de tecla de flecha.align-items: baseline
parece funcionar a partir de ahora.El problema de la imagen es muy extraño. Noté que Chrome pasa sobre los elementos SVG de manera diferente a los elementos IMG. A partir de ahora, la última versión de Chrome "espera" antes de omitir IMG, pero permite al usuario omitir un SVG como cualquier otro carácter (la flecha izquierda omite el carácter más cercano a svg). Esto puede ser causado por los estilos predeterminados subyacentes, pero no lo sé.
Estaba a punto de publicar mis hallazgos, pero me di cuenta de que Firefox no funcionaba igual. Firefox tiene un comportamiento de tecla de flecha realmente extraño cuando se usa SVG y / o Flexbox. El cursor pasa sobre la imagen, pero solo cuando se presiona la tecla de flecha derecha.
Sin embargo, Firefox funciona bien con un elemento IMG normal.
En pocas palabras, tendrá que representar diferentes elementos de imagen en función del navegador.
PD: muchos editores que he usado por defecto para imágenes de ancho completo.
Editar: Acabo de darme cuenta de que parece que mi solución de Firefox también funciona en la última versión de Chrome. Creo que esto funciona porque envolví los nodos de texto en elementos SPAN. El elemento SVG todavía funciona de manera diferente en Chrome, pero ajustar el texto en SPAN parece resolver la mayoría de los problemas.
fuente
span
concontenteditable="false"
y eso parece funcionar en Chrome y Firefox. jsbin.com/xosasuruni/edit?html,outputdisplay: flex
que funcione ya que ahora el texto en cada elemento no es parte de la misma línea. Si el texto en cualquiera de los elementos es demasiado largo, no empuja el otro texto, pasa a la siguiente líneaflex-wrap: wrap;
Primero, no manipule el DOM de ProseMirror como se muestra en el ejemplo de JQuery. De hecho, lo más probable es que te encuentres con DOM o problemas de contenido. ProseMirror usa su propio nodo DOM y esquema de marcado. Si desea manipular el DOM de ProseMirror o agregar un complemento, eche un vistazo a las Apis de marcado, complemento y nodo. He adjuntado un ejemplo simple de texto alinear código de marcado. Nota al margen, la razón por la que Grammarly y otros no tienen complementos de ProseMirror se debe al enfoque / modelos DOM. Debo agregar que ProseMirror es muy bueno, pero para ser honesto, es más una solución de desarrollador avanzada.
Aparte de eso, la buena noticia son los problemas que tiene un CSS puro. ProseMirror elimina todas las clases y restablece el DOM / CSS, por lo que si importa un documento o corta y pega todas / la mayoría de sus clases desaparecerán.
El enfoque más simple para resolver es envolver el editor en un div y asignar una clase al div y luego agregar estilos y estilos secundarios a esa clase. La razón para envolverlo es que los selectores css como img, p, h, etc. solo se aplicarán a las etiquetas dentro de la clase del editor. Sin eso, terminas con obvios enfrentamientos CSS.
CSS
float: left;
(enfoque recomendado)vertical-align: baseline;
pero sin flotadores todavía tendrá un cursor que coincida con la altura de la imagen y no con el texto. Además, si no utiliza flotantes, el cursor se alargará ya que la altura de la línea es efectivamente la misma altura que la imagen. El color azul es solo un selector, que también puedes cambiar usando CSS.Ejemplo de extensión de nodo
Ejemplo de extensión de nodo para alinear texto que se puede agregar como barra de herramientas. Publicación mucho más larga, pero incluso si creó un Nodo / complemento para imágenes, tiene que lidiar con la forma en que se procesa, es decir, base64 versus url, etc., por cierto, tiene mucho sentido por qué lo hicieron, pero solo agregue complejidad para desarrolladores que buscan SEO, etc.
fuente
Traté de hacer un pequeño truco con HTML y CSS.
// css
Aquí está jsfiddle https://jsfiddle.net/wtekxavm/1/
fuente