【问题标题】:Is it possible to select css generated content? [duplicate]是否可以选择 css 生成的内容? [复制]
【发布时间】:2014-08-14 15:06:20
【问题描述】:

假设我已经标记:

<div data-generated="world!">Hello </div>

.. 使用 CSS:

div:after {
    content: attr(data-generated);
}

这会产生文本:Hello world! - FIDDLE

div:after {
    content: attr(data-generated);
}
&lt;div data-generated="world!"&gt;Hello &lt;/div&gt;

但是...

如果我尝试选择/复制文本 - 只有“你好”部分是可选的。

有没有办法选择css生成的文本?

注意:

1) 我查看了有关生成内容的规范(herehere),但我没有看到任何关于此问题的参考。

规范herehere 似乎说生成的内容应该是可选择的

生成的内容应该是可搜索的、可选择的,并且可供 辅助技术

2) 如果这个问题的答案是“不 - 这是不可能的” - 请链接到说明这一点的可靠来源。

【问题讨论】:

  • 我不太清楚。但由于生成的内容不是 DOM 的一部分,我应该说不。
  • 在 fat 中它应该 not 是可选择的,因为它实际上是 styling 我们在以这种方式使用它时误用了 content 元素。如果您想要实际可选择的“内容”,请使用适当的 HTML 元素而不是伪元素。 - developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements
  • 我当然认为&lt;div data-commentcount="3"&gt; comments &lt;/div&gt; 也是可以接受的用法。 CSS 不应该用来生成内容,而应该用来生成样式。这里写“3”不被认为是一种风格,而是实际的内容。如果您尝试添加一些花哨的引号或要点,那将是一种风格。此外,与仅包含“3 cmets”作为文本相比,这对您有什么好处?
  • @Danield 为什么需要添加额外的 span 元素?即使您不得不添加那个 span 元素,这仍然比在我的书中添加一个“数据”属性要好。

标签: html css selection pseudo-element css-content


【解决方案1】:

您可以使用一些 javascript 来模拟,而不是实际选择生成的内容。

我偶然发现了这个David Walsh blog, 他提供了获取生成内容的代码。

使用它,您可以将生成的内容附加到常规内容以模拟选择生成的内容,然后您可以将生成的内容设置为display:none,使其不会出现两次。像这样:

FIDDLE

String.prototype.unquoted = function() {
  return this.replace(/(^['"])|(['"]$)/g, '')
}

var element = document.getElementById('div1');

var content = window.getComputedStyle(
  element, ':after'
).getPropertyValue('content');

element.innerHTML = element.innerHTML + content.unquoted();

console.log(content.unquoted());
div:after {
  content: attr(data-generated);
  display: none;
}
&lt;div id="div1" data-generated=" world!"&gt;Hello&lt;/div&gt;

那么你为什么想做这样的事情呢?

好吧,你可能永远不想这样做,但我在这个问题上留下了很长的评论,解释了我曾经遇到的一个特定限制,这可能是一个解决方案。

注意:我确实意识到这个“解决方案”并没有真正选择生成的内容本身,而是决定发布这个答案,以防有人需要解决方法。

【讨论】:

  • 你为什么想做这样的事情?好吧,一个可靠的用例是复制由 CSS 模板生成(从 HTML)生成的 Markdown 代码,以将其粘贴到支持 Markdown 的文本区域中。见gist.github.com/ImJasonH/c00cdd7aece6945fb8ea
  • 这是一个很好的答案。
  • 用例?颜色值存储在 CSS 中的变量中。值通过生成的内容 (:after) 显示给用户。用户应该能够选择该值并复制到剪贴板。瞧!
【解决方案2】:

不,你不能。

Selecting and manipulating CSS pseudo-elements such as ::before and ::after using jQuery。重复这里的描述,生成的内容不是 DOM 的一部分。

CSS2.1 spec的话来说,

生成的内容不会改变文档树。

生成的内容只存在于渲染引擎的视觉世界中。选择是关于选择 DOM 的一部分。生成的内容不在 DOM 中,因此无法选择。出于同样的原因,无法选择生成的计数器或列表项项目符号。

【讨论】:

  • Chrome 开发者工具最近开始在标记中显示伪元素这一事实是否意味着某些东西发生了变化,或者这只是为了更容易调试而设计的 chrome 功能?
  • 后者。这只是一种选择它们来检查它们的样式的方法。
  • 回复:“选择是关于选择 DOM 的一部分”,为什么会这样?为什么不真正的选择?
【解决方案3】:

不要在data 属性中存储应该可见和可访问的内容,因为辅助技术可能无法访问它们

检查这些链接:

http://www.karlgroves.com/2013/08/26/css-generated-content-is-not-content/ https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • @trejder 答案中的链接不会将其变成仅链接的答案,即使它很短。
  • 恕我直言,此答案中的文字是关于可访问性的,但有用的内容与问题无关或答案无关。第二个链接提供了有关数据属性的一般信息,大概也是为了让底部的 cmets 受益于可访问性。有关可访问性的信息属于评论。第一个链接确实解决了这个问题,这是答案的唯一部分,但没有提供其关键点的摘要。确实可以考虑使其成为仅链接的答案。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 2021-12-27
  • 2012-08-25
  • 2017-04-11
相关资源
最近更新 更多