使用JSF的浏览器相关CSS开关

使用JSF的浏览器相关CSS开关,css,jsf-2,Css,Jsf 2,我需要在JSF2应用程序(Mojarra2.1,Tomcat7)中使用一些特定于浏览器的CSS 我尝试将以下内容添加到我的模板中: <!--[if IE 8]> <link rel="stylesheet" type="text/css" href="#{cfgs.externalCssUrlIE8}" /> <![endif]--> 但由于我还使用了以下内容,因此未提供注释: <context-param>

我需要在JSF2应用程序(Mojarra2.1,Tomcat7)中使用一些特定于浏览器的CSS

我尝试将以下内容添加到我的模板中:

    <!--[if IE 8]>
        <link rel="stylesheet" type="text/css" href="#{cfgs.externalCssUrlIE8}" />
    <![endif]-->

但由于我还使用了以下内容,因此未提供注释:

<context-param>
    <!-- Removes any comments from the rendered HTML pages. -->
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
</context-param>

javax.faces.FACELETS\u跳过\u注释
真的
我的问题。。。当我禁用'javax.faces.FACELETS\u SKIP\u注释时,我会遇到一系列其他问题。。此外,我认为我的源代码注释不属于生成的页面

我还尝试将开关置于CDATA中,如:

<![CDATA[
 <!--[if IE 7]>
        <link rel="stylesheet" type="text/css" href="#{cfgs.externalCssUrlIE7}" />
 <![endif]-->
]]>

]]>
但是内部<被呈现为html实体..:-/,所以它不起作用

问题:还有其他解决办法吗?是否存在任何JSF2标记来处理此问题?外部标记库

提前感谢,,
Steve

您可能能够使用条件注释的包容性语法来解决问题。与其写
,不如写

换句话说,没有让它成为评论的破折号

这是合法的语法。此语法的意图是非IE浏览器读取条件部分,而对于带破折号的语法,其他浏览器将忽略它

当然,这对您的样式表有着明显的影响——条件块中包含的CSS需要适用于除IE8之外的所有浏览器(您会注意到我在上面添加的感叹号,使其成为“非IE8”);IE8特定的内容需要包含在标准样式表中,由条件块中的样式覆盖

换句话说,与您当前正在尝试的功能相比,这是一个功能上的逆转

重要的一点是,这样做条件块不是注释,因此不应该被解析器删除

你可能需要重做一些事情,但它应该是有效的

当然,另一个选择是找到一个特定于IE8的CSS黑客。这些确实存在,但我建议尽可能避免它们,因为你会使你的CSS无效,而且在未来的浏览器版本中,它总是有被破坏的危险

但如果你想走这条路,这里有一个链接可以给你答案:

但除非必须,否则不要使用它。:-)


希望有帮助。

唯一的方法就是使用


是的,这是一条丑陋的路线。但是没有其他的标准方法


更新:JSF实用程序库提供了一个专门用于此目的的工具,这样您就不再需要丑陋的

<o:conditionalComment if="IE 8">
    <link rel="stylesheet" type="text/css" href="#{cfgs.externalCssUrlIE8}" />
</o:conditionalComment>


巴卢斯克的回答是对我问题的正确回答。我仍然想分享我发现的一个基于JavaScript+CSS的解决方案:The

插入使您能够使用特定于操作系统和浏览器的CSS选择器,例如:

  • html.gecko div#header{margin:1em;}
  • .opera#页眉{边距:1.2em;}
  • .ie.mylink{font-weight:bold;}
  • .mac.ie.mylink{font-weight:bold;}
  • [os].[browser].mylink{font-weight:bold;}

如果您的特定于浏览器的样式仍处于初始阶段,那么与包含许多
.css
文件相比,这可能是一个更清晰的解决方案

多谢各位。它起作用了!我也试过了,但你是对的:丑陋的逃逸h:outputText似乎是唯一的解决方案。不客气。请注意,JSF2中不推荐使用
。它已经完全没有价值了,因为完全允许/支持在Facelets中嵌入纯HTML(这也是JSF1.2在JSP上出现以来的情况)。要在Facelets中有条件地呈现纯HTML(正如您以前使用
所做的那样,您应该使用
来代替。不错的解决方法,尽管它很难看……您再次救了我:)@BalusC
h:form
h:head
中使用
h:outputText
时没有呈现我有一个[if IE 7]、[if IE 8]等的列表。,因此,巴卢斯克的答案是一个简单得多的方法。无论如何,谢谢你明确的回答。@alfonx-没问题;正如你所说,@BalusC的答案可能更适合你的情况,但希望你发现我的答案仍然有用;即使这次没有用。:)