CSS内容属性:是否可以插入HTML而不是Text?


246

只是想知道是否有可能以某种方式使CSS content属性插入html代码而不是字符串:before:after类似这样的元素:

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

这将非常方便...可以通过Javascript完成,但是使用CSS确实可以使生活更轻松:)


@Kaiido OMG ...不是,没有检查问题的日期,我提到了您的答案...真的很抱歉,将删除这两个评论:)
Ason

Answers:


210

不幸的是,这是不可能的。根据规格

生成的内容不会更改文档树。特别是,它不会反馈到文档语言处理器(例如,用于重新解析)。

换句话说,对于字符串值,这意味着始终按字面意义对待该值。无论使用哪种文档语言,都永远不会将其解释为标记。

例如,将给定的CSS与以下HTML结合使用:

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

...将产生以下输出:

<a href="#top">返回</a>标题


1
同意,但是如果您想象它已经支持带有url属性的图像,则在这个角度上添加链接没有什么不同。
zanona 2010年

12
@ludicco:这是因为图像本身不是DOM元素(不计算在内<img>),它们只是被绘制到现有元素上,因此,通过应用背景图像或列表图像,您并没有真正在修改DOM。
BoltClock

1
谢谢,所以我想我必须通过这个想法,直接去js,干杯
zanona 2010年

6
@ludicco:好问题。甚至我都在搜索中,希望这是可能的。
罗宾·马本

1
@watson:刚刚看到您对另一个问题的回答。你是对的; 我可能应该在回答中阐明您不能添加任意标记- url()与其他任何图像一样,您必须通过指定外部文件。
BoltClock

54

正如@BoltClock答案的注释中几乎指出的那样,在现代浏览器中,您实际上可以使用(url())结合svg的<foreignObject>元素在伪元素中添加一些html标记。

您可以指定指向实际svg文件的URL,也可以使用dataURI版本(data:image/svg+xml; charset=utf8, + encodeURIComponent(yourSvgMarkup))创建该URL

但是请注意,这主要是黑客行为,并且有很多限制:

  • 您不能从此标记加载任何外部资源(没有CSS,没有图像,没有媒体等)。
  • 您无法执行脚本。
  • 由于这不会成为DOM的一部分,因此更改它的唯一方法是将标记作为dataURI传递,并在中编辑此dataURI document.styleSheets。对于这部分,DOMParserXMLSerializer5月份的帮助
  • 尽管相同的操作允许我们将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,则将yourFile.svg指向一个相对的funcIRI /root/css/yourFile.svg/。但是,我想我还记得一些早期的UA有一个错误,并使其与文档的baseURI有关。因此,最安全的方法就是使用绝对路径。
Kaiido

1
@BoltClock,真的吗?我真的很抱歉。我一个人提出了这个有6年历史的问题,觉得我必须将其发布为更新,但是也许我应该更加清楚您的回答是正确的,并且在6年前绝对正确吗?或者,如果您有一些适合用作标题的措辞,请随时编辑我的答案。
Kaiido

1
真好 我曾经用过:content: url('../../images/como-funciona.svg');而且效果很好
Eliut Islas'1

这是一篇较早的帖子,有我的答案,它更深入地探讨了这个主题:is-it-possible-to-display-an-html-document-or-html-fragment-at-css-content
Ason

7

在CSS3分页媒体中,可以使用position: running()和来实现content: element()

来自CSS生成的分页媒体模块草稿内容的示例:

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

.runner { 
  position: running(heading);
}

.runner可以是任何元素,并且heading是插槽的任意名称。

编辑:澄清一下,基本上没有浏览器支持,所以这主要是为了将来参考/除了已经给出的“实用答案”。


嘿,您能再解释一下吗?我对您的理论感兴趣,但似乎无法执行。我将如何使用这种方法或div包含锚标记。
尼尔

问题在于,目前基本上没有浏览器支持,但是专用的HTML渲染器按照规范实现了它。下一个不太好的消息是,似乎没有一个好的开源实现。大多数是SaaS产品,例如princexml.com
溶胶
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.