CSS在'input'元素之前或之后生成内容
CSS内容生成(content generation)是CSS的一个强大功能,它可以通过伪元素(pseudo-elements)在元素的内容前或后插入额外的内容。在上述示例代码中,通过使用伪元素的`::after`伪类,可以在`input`元素后的`label`元素中插入一段文本内容。
上述代码中定义了三个伪类样式,分别是`input + label::after`、`input:focus + label::after`和`input:valid + label::after`。这些伪类样式分别表示在`input`元素的相邻兄弟元素`label`之后插入内容。根据不同的状态,文本内容和颜色也有所不同。当`input`元素获取焦点时,文本内容为"not valid yet",颜色为红色;当`input`元素通过验证时,文本内容为"looks good",颜色为绿色。
然而,尽管这种使用CSS内容生成的方法可以实现预期的效果,但它并不适用于需要保持标记的可访问性的情况。CSS内容只应该用于设计方面,而不是提供有用的信息。因此,在这种情况下,更好的方法是使用JavaScript将有用的信息输入到标签中。
当然,为了提高可访问性,我们可以采用一些方法。例如,可以使用多个带有不同文本的标签,并使用`display: none`来隐藏不相关的标签。这样,屏幕阅读器可以读取相关的文本内容,而无需依赖CSS内容生成。
总之,CSS内容生成是一种强大的功能,可以在元素的内容前或后插入额外的内容。然而,在保持标记可访问性的情况下,应该避免使用CSS内容生成,而是使用JavaScript等其他方法来提供有用的信息。
CSS content generation before or after 'input' elements这个问题的出现的原因是因为元素是一种特殊类型的替换元素(replaced elements),这些元素不支持:before和:after伪类选择器。替换元素是指其表示与CSS无关的元素,它们的典型例子包括、
CSS内容生成(content generation)是一种在元素的内容之前或之后插入内容的技术。但是,对于元素来说,它们没有内容,所以无法使用:before和:after来插入内容。如果我们错误地在元素内写入内容(例如:Test),浏览器会自动纠正并将文本放在元素之后。
解决这个问题的方法是将每个元素包裹在或
下面是规范中的例子,展示了如何使用包裹元素来实现内容生成:
Header
Text
对应的CSS样式:
h2 { display: run-in; } p:before { display: block; content: 'Some'; }
这段代码会渲染成下面的文档片段:
Header
Some Text
这里要说明的是,同样的原因也使得内容生成无法应用于
、等元素(
那么,如何解决这个问题呢?当然可以使用jQuery等工具来实现。另外,我们也可以使用
还有一个需求是,当我们使用时,希望在输入框后面添加一个红色的星号。我们可以使用以下CSS样式来实现:
input[required]::after { content: ' *'; color: red; }
总之,由于元素没有内容,所以无法直接使用:before和:after来插入内容。我们可以通过包裹元素、使用其他元素替代、或者使用工具库来解决这个问题。规范中并没有明确说明元素是否支持:before和:after,所以浏览器的行为可能是不确定的。