まず、JQueryの例に示すように、ProseMirror DOMを操作しないでください。実際、DOMまたはコンテンツの問題に遭遇する可能性が最も高くなります。ProseMirrorは独自のDOMノードとマークアップスキーマを使用します。ProseMirror DOMを操作したり、プラグインを追加したりする場合は、マークアップ、プラグイン、ノードApisをご覧ください。テキスト配置マークアップコードの簡単な例を添付しました。補足として、Grammarlyや他の人がProseMirrorプラグインを持っていない理由は、DOMのアプローチ/モデルが原因です。私はProseMirrorを追加する必要がありますが非常に良いですが、正直なところ、それはより高度な開発者向けソリューションです。
それはさておき、CSSだけの問題は朗報です。ProseMirrorはすべてのクラスを取り除き、DOM / CSSをリセットするため、ドキュメントをインポートしたり、すべてをカットアンドペーストしたりすると、ほとんどのクラスが失われます。
これを解決する最も簡単な方法は、エディターをdivでラップし、クラスをdivに割り当てて、スタイルと子スタイルをそのクラスに追加することです。ラップする理由は、img、p、hなどのcssセレクターがエディタークラス内のタグにのみ適用されるためです。それがなければ、CSSの衝突が明白になります。
CSS
- フレックスボックスはグリッドシステムではないため、インライン画像にはフレックスボックスを使用しないでください。実際、私が思い出すと、フレックスコンテナーの直接の子をインライン化することはできません。
- pタグとimgのインラインはテキストを折り返さず、上記の問題が発生します。
- カーソルの問題を本当にラップして削除したい場合は、フロートを使用する必要があります
float: left;
(推奨アプローチ)
- 小さなまたは大きなパディングとボーダーボックスを追加して、エッジの折りたたみを支援し、画像とテキストの分離を支援
- 発生しているカーソルの問題は、画像ブロック内を上に垂直に配置した場合に修正できます
vertical-align: baseline;
が、フロートなしでは、テキストではなく画像の高さに一致するカーソルが残るためです。また、フロートを使用しない場合、行の高さが画像と実質的に同じであるため、カーソルが長くなります。青色はセレクターにすぎず、CSSを使用しても変更できます。
<html>
<div class="editor">
<!-- <editor></editor>-->
</div>
</html>
<style>
.editor {
position: relative;
display: block;
padding: 10px;
}
.editor p {
font-weight: 400;
font-size: 1rem;
font-family: Roboto, Arial, serif;
color: #777777;
display: inline;
vertical-align: baseline;
}
.editor img {
width: 50px;
float: left;
padding: 20px;
}
</style>
ノード拡張の例
ツールバーとして追加できるテキスト配置のノード拡張の例。はるかに長い投稿ですが、画像のノード/プラグインを作成した場合でも、レンダリングの方法、つまりbase64とurlなどを処理する必要があります。これらはなぜそうしたのかについては完全に理にかなっていますが、追加するだけです。 SEOなどを求める開発者にとっての複雑さ
export default class Paragraph extends Node {
get name() {
return 'paragraph';
}
get defaultOptions() {
return {
textAlign: ['left', 'center', 'right'],
}
}
inputRules({ type }) {
return [
markInputRule(/(?:\*\*|__)([^*_]+)(?:\*\*|__)$/, type),
]
}
get schema() {
return {
attrs: {
textAlign: {
default: 'left'
}
},
content: 'inline*',
group: 'block',
draggable: false,
inclusive: false,
defining : true,
parseDOM: [
{
tag: 'p',
style: 'text-align',
getAttrs: value => value
}
],
toDOM: (node) => [ 'p', {
style: 'text-align:' + node.attrs.textAlign,
class: `type--base type--std text-` + node.attrs.textAlign
}, 0 ]
};
}
commands ({ type }) {
return (attrs) => updateMark(type, attrs)
}
}
<div contenteditable>Test text<img src="https://upload.wikimedia.org/wikipedia/en/9/9b/Yoda_Empire_Strikes_Back.png">Testing</div>
ます。現在、それが彼らのやり方です。現在、その周りに仕様はありません。そのため、彼らは自分たちが最善だと思うことを自由に行うことができます。これらのライブラリは絶対に必要ですか、それとも生のソリューションで十分ですか?