Estou pensando em criar um editor com Slate ou ProseMirror e vendo algum comportamento estranho com o Chrome em torno da posição do cursor e da área de seleção ao usar um elemento embutido. O problema 1 é mostrado na primeira figura abaixo. Quando a posição do cursor de texto está atrás do "f", o cursor é mostrado na parte superior da imagem. O problema 2 está na segunda imagem - selecionar o texto mostra uma área destacada que é tão alta quanto no elemento embutido. Existe alguma maneira de controlar esse comportamento e, em vez disso, mostrar o sinal de intercalação na posição do texto e realçar apenas o espaço ao redor do texto (mesmo se a imagem embutida estiver aumentando a altura da linha)
Eu gostaria de imitar o comportamento aqui, do Firefox:
Imagens de exemplo foram produzidas usando a demonstração ProseMirror aqui: https://prosemirror.net/examples/basic/
Um exemplo mínimo (obrigado @Kaiido) com JSBin :
<div contenteditable>Test text<img src="https://upload.wikimedia.org/wikipedia/en/9/9b/Yoda_Empire_Strikes_Back.png">Testing</div>
Não tenho certeza de como isso se comporta em outros sistemas operacionais, mas estou usando o macOS Catalina.
fonte
<div contenteditable>Test text<img src="https://upload.wikimedia.org/wikipedia/en/9/9b/Yoda_Empire_Strikes_Back.png">Testing</div>
. Agora, é assim que eles fazem isso, atualmente não há especificações sobre isso, então eles são livres para fazer o que acham melhor. Você absolutamente precisa dessas bibliotecas, ou uma solução bruta é suficiente para você?Respostas:
Você pode corrigir o problema de seleção usando o flexbox. Inicialmente, tentei usar,
align-items: flex-end
mas estava tendo um comportamento estranho com as setas.align-items: baseline
parece funcionar a partir de agora.O problema da imagem é muito estranho. Percebi que o Chrome passa por cima dos elementos SVG de maneira diferente dos elementos IMG. A partir de agora, a versão mais recente do Chrome "espera" antes de pular o IMG, mas permite que o usuário pule um SVG como qualquer outro caractere (a seta esquerda pula o caractere mais próximo do svg). Isso pode ser causado por estilos padrão subjacentes, mas eu não sei.
Eu estava prestes a postar minhas descobertas, mas percebi que o Firefox não funcionava da mesma maneira. O Firefox tem um comportamento muito estranho com as teclas de seta ao usar SVG e / ou Flexbox. O cursor fica acima da imagem, mas apenas ao pressionar a tecla de seta para a direita.
No entanto, o Firefox funciona bem com um elemento IMG normal.
Para encurtar a história, você terá que renderizar diferentes elementos da imagem com base no navegador.
PS Muitos editores que usei padrão para imagens de largura total.
Edit: Acabei de perceber que parece que minha solução Firefox também funciona no Chrome mais recente. Eu acho que isso funciona porque envolvi os nós de texto nos elementos SPAN. O elemento SVG ainda funciona de maneira diferente no Chrome, mas a quebra de texto no SPAN parece resolver a maioria dos problemas.
fonte
span
comcontenteditable="false"
e isso parece funcionar no chrome e no firefox! jsbin.com/xosasuruni/edit?html,outputdisplay: flex
funcionará, já que agora o texto em cada elemento não faz parte da mesma linha. Se o texto em qualquer um dos elementos for muito longo, não empurrar o outro texto, eleflex-wrap: wrap;
Primeiro, não manipule o DOM ProseMirror conforme mostrado no exemplo JQuery. Na verdade, você provavelmente encontrará problemas de DOM ou de conteúdo. O ProseMirror usa seu próprio nó DOM e esquema de marcação. Se você deseja manipular o DOM do ProseMirror ou adicionar plug-in, consulte as Apis de marcação, plug-in e nó. Anexei um exemplo simples de código de marcação de alinhamento de texto. Nota lateral, a razão pela qual a Grammarly e outras pessoas não têm plug-ins ProseMirror é por causa da abordagem / modelos do DOM. Devo acrescentar que o ProseMirror é muito bom, mas, para ser sincero, é mais uma solução de desenvolvedor avançado.
Além disso, as boas notícias são os problemas que você possui em CSS. O ProseMirror retira todas as classes e redefine o DOM / CSS, portanto, se você importar um documento ou recortar e colar todas / quase todas as suas classes desaparecerão.
A abordagem mais simples para resolver isso é agrupar o editor em uma div e atribuir uma classe à div e, em seguida, adicionar estilos e estilos filhos a essa classe. O motivo para empacotá-lo é que os seletores de css, como img, p, h, etc, serão aplicados apenas às tags dentro da classe do editor. Sem isso, você acaba com conflitos óbvios de CSS.
CSS
float: left;
(abordagem recomendada)vertical-align: baseline;
mas sem flutuadores, você ainda terá um cursor que corresponde à altura da imagem e não ao texto. Além disso, se você não usar flutuadores, o cursor será alongado, pois a altura da linha é efetivamente a mesma da imagem. A cor azul é apenas seletor, que você altera usando CSS também.Exemplo de extensão de nó
Exemplo de extensão de nó para alinhamento de texto que pode ser adicionado como uma barra de ferramentas. Postagem muito mais longa, mas mesmo que você tenha criado um Nó / plug-in para imagens, terá que lidar com a maneira pela qual ele renderiza, por exemplo, base64 versus url etc., etc. complexidade para desenvolvedores que procuram SEO etc.
fonte
Eu tentei fazer um pequeno hack com HTML e CSS.
// css
Aqui está o jsfiddle https://jsfiddle.net/wtekxavm/1/
fonte