您可以使用id和类名称css选择器在另一个命名空间中设置XHTML元素的样式吗?

Fra*_*kie 5 html css xhtml namespaces xforms

我正在开发一个使用ubiquity-xforms的应用程序.以前我一直使用XHTML 1.0 doctype以text/html的形式提供这些页面.

如果我换的MIME类型为application/xhtml + xml,我会看到一个相当大的性能提升,因为JavaScript的可以使用的,而不是什么它现在做的(通过每一次整个DOM树慢慢迭代的get ____ NS()函数,它需要选择一个元素).

但是当我尝试这个时,我的一堆CSS停止了工作.我注意到,当我检查的元素,无论是在Firebug或WebKit每日Web检查,故障点是".classname"和在XForms命名空间的元素'#ID’CSS选择器.我还注意到,在列出的DOM属性中,这些元素缺少'id'和'className'属性.

我的问题是,有没有办法让UA将这些识别为类和ID?

我尝试过的事情无济于事:

  1. 在内联doctype的ATTLIST中将"id"属性指定为ID
  2. 尝试我可以使用的每种文档类型,或者根本没有文档类型
  3. 限定xhtml命名空间中的id和class name属性(即.xhtml:id)

这是一些示例xhtml.在Firefox 3.5或Safari 4/WebKit Nightly中不起作用

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:xf="http://www.w3.org/2002/xforms">
<head>
    <style type="text/css">
    /* <![CDATA[ */
    #test {
        background-color: red;
    }
    .testing {
        color: blue;
    }
    /* ]]> */
    </style>
</head>
<body>
    <xf:group id="test" class="testing">Test</xf:group>
</body>
Run Code Online (Sandbox Code Playgroud)

Mar*_*eck 5

弗兰基,

porneL 的答案是正确的——在 XHTML 模式下你必须使用不同的 CSS 规则,@id因为@class.

即使掌握了这些知识,您的问题还没有结束。:)

诱惑可能是将 HTML 和 XHTML CSS 选择器放在一起,并将它们应用到相同的规则:

@namespace xf url(http://www.w3.org/2002/xforms);

xf\:input.surname, xf|input[class~="surname"] {
  color: green;
}
Run Code Online (Sandbox Code Playgroud)

然而,另一个问题是 IE 会忽略整个规则,因为它不喜欢 XHTML 语法。在 Ubiquity XForms 中你会看到这样的东西:

@namespace xf url(http://www.w3.org/2002/xforms);

xforms\:hint.active, xf\:hint.active {
  display: inline;
}

xf|hint[class~="active"] {
  display: inline;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们必须使用不同的选择器重复样式。(我们希望通过一个函数来解决这个问题,该函数将抽象出样式设置任务。然后您只需编写一个规则。)

请注意一些额外的事情:

  • HTML 规则使用 ':' 作为文字字符(因此使用 '\' 进行转义),并且对命名空间一无所知;
  • XHTML CSS 规则使用“~=”运算符,这意味着属性必须包含指定的值,而不是完全等于它。