CSSコンテンツプロパティ:テキストの代わりにHTMLを挿入することは可能ですか?


246

CSS contentプロパティに文字列の代わりにHTMLコード:beforeまたは次:afterのような要素を挿入させることが可能かどうか疑問に思っています。

.header:before{
  content: '<a href="#top">Back</a>';
}

これは非常に便利です... Javascriptを使用して行うこともできますが、CSSを使用すると簡単に生活できます:)


@ Kaiido OMG ...そうではありません、質問の日付を確認しませんでした、私はあなたの答えを参照しました...本当に申し訳ありませんが、これらのコメントを両方削除します:)
Ason

回答:


210

残念ながら、これは不可能です。仕様ごと:

生成されたコンテンツはドキュメントツリーを変更しません。特に、それはドキュメント言語プロセッサにフィードバックされません(たとえば、再解析のため)。

つまり、文字列値の場合、これは値が常に文字どおりに扱われることを意味します。使用しているドキュメント言語に関係なく、マークアップとして解釈されることはありません。

例として、次のHTMLで指定されたCSSを使用します。

<h1 class="header">Title</h1>

...結果は次のようになります。

<a href="#top">戻る</a>タイトル


1
同意しましたが、url属性付きの画像がすでにサポートされていると想像しても、リンクを追加しても、この観点ではそれほど違いはありません。
zanona 2010

12
@ludicco:これは、画像自体がDOM要素ではないため(カウントは除く<img>)、既存の要素に描画されるだけなので、背景画像またはリスト画像を適用しても、実際にはDOMを変更するわけではありません。
BoltClock

1
おかげで、私はこのアイデアをパスしてjs、cheersに直行する必要があると思います
zanona

6
@ludicco:いい質問ですね。私もこれが可能であることを願ってSOを探していました。
Robin Maben

1
@watson:他の質問への回答を見たところです。あなたが正しい; 私はおそらく私の回答で、任意のマークアップを追加できないことを明確にする必要があります- url()他の画像と同様に、代わりに外部ファイルを指定する必要があります。
BoltClock

54

@BoltClockの回答へのコメントでほとんど言及されているように、最近のブラウザーではurl()svgの<foreignObject>要素と組み合わせて()を使用して、擬似要素に実際にHTMLマークアップを追加できます。

実際のsvgファイルを指すURLを指定するか、dataURIバージョン(data:image/svg+xml; charset=utf8, + encodeURIComponent(yourSvgMarkup))で作成することができます。

ただし、これはほとんどハッキングであり、多くの制限があることに注意してください。

  • このマークアップから外部リソースを読み込むことはできません(CSS、画像、メディアなどはありません)。
  • スクリプトを実行できません。
  • これはDOMの一部ではないため、変更する唯一の方法は、マークアップをdataURIとして渡し、このdataURIをで編集することですdocument.styleSheets。この部分のために、DOMParserそして助けるXMLSerializerかもしれませ
  • 同じ操作で、URLエンコードされたメディアを<img>タグで読み込むことができますが、これは疑似要素では機能しません(少なくとも今日のところ、それが許可されていない場所で指定されているかどうかはわかりません。まだ実装されていない機能です)。

さて、疑似要素のいくつかのhtmlマークアップの小さなデモ:

/* 
**  original svg code :
*
*<svg width="200" height="60"
*     xmlns="http://www.w3.org/2000/svg">
*
* <foreignObject width="100%" height="100%" x="0" y="0">
*	<div xmlns="http://www.w3.org/1999/xhtml" style="color: blue">
*		I am <pre>HTML</pre>
*	</div>
* </foreignObject>
*</svg>
*
*/
#log::after {
  content: url('data:image/svg+xml;%20charset=utf8,%20%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%2260%22%20width%3D%22200%22%3E%0A%0A%20%20%3CforeignObject%20y%3D%220%22%20x%3D%220%22%20height%3D%22100%25%22%20width%3D%22100%25%22%3E%0A%09%3Cdiv%20style%3D%22color%3A%20blue%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxhtml%22%3E%0A%09%09I%20am%20%3Cpre%3EHTML%3C%2Fpre%3E%0A%09%3C%2Fdiv%3E%0A%20%20%3C%2FforeignObject%3E%0A%3C%2Fsvg%3E');
}
<p id="log">hi</p>


私はあなたの答えに出くわしました、そしてそれは私の自身の問題のいくつかへの解決策です。ファイルを指すURLをフォーマットする方法を説明できますか?試してみましたがurl('/relativePathToMySvg/mySvg.svg')、うまくいきませんでした
Frank

仕様に従って、相対パスを使用する@Frankは、cssファイルのパスに相対的です。つまり、cssファイルが/root/css/yourFile.cssにある場合、相対funcIRIのようにyourFile.svgがポイントし/root/css/yourFile.svg/ます。しかし、私は以前のUAにバグがあり、それをドキュメントのbaseURIに対して相対的にしたことを覚えていると思います。したがって、最も安全な方法は、絶対パスを使用することです。
海洋堂2016年

1
@BoltClock、本当に?本当にごめんなさい。私はこの6年前の質問に別の質問をしたため、更新として投稿する必要があると感じましたが、おそらく6年前に間違いなく正解だったと思いますか?または、ヘッダーとして使用できる適切な表現がある場合は、私の回答を自由に編集してください。
海洋堂2016年

1
いいね。私が使用した:content: url('../../images/como-funciona.svg');そしてそれはうまくいく
Eliut Islas

これは私の回答が含まれている以前の投稿で、件名について少し詳しく説明しています。is -it-possible-to-display-an-html-document-or-html-fragment-at-css-content
エイソン

7

CSS3ページングメディアでは、これはposition: running()およびを使用して可能content: element()です。

CSSで生成されたPaged Media Moduleドラフトのコンテンツの例:

@top-center {
  content: element(heading); 
}

.runner { 
  position: running(heading);
}

.runnerは任意の要素にすることができheading、スロットの任意の名前です。

編集:明確にするために、基本的にブラウザのサポートはありませんので、これは主に将来の参照のために/すでに与えられた「実用的な答え」に加えて意図されていました


ねえ、これについてもう少し説明してくれませんか。私はあなたの理論に興味がありますが、それを実行させることができないようです。このメソッドまたはdivを使用してアンカータグを含めるにはどうすればよいですか。
Neil、

問題は現在、基本的にブラウザーのサポートがないことですが、専用のHTMLレンダラーが仕様に従って実装しています。次のそれほど良くないニュースは、良いオープンソース実装がないようです。ほとんどはprincexml.comのようなSaaS製品です
ソル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.