Wicket 页面和模板中的小 CSS 替换

Small CSS substitutions in Wicket pages and templates

多年来,我以这种方式开发 Wicket 页面: 当新的小页面标记 (html) 包含小的 CSS 片段时。 <wicket:head> local css </wicket:head> 当设计有动态变化时,方法很舒服,是一体的。

当页面增长时,css 块被提取以分离 Wicket 资源。可以更好地缓存在浏览器中(以受控方式)等

现在我需要有可选的颜色,例如 Button(link 也与 Button CSS 一起制作),一个非活动按钮。 Wicket 文档已准备好替换资源(class 旨在替换)`

.button 
{ color: ${forecolor} 
font-size: ${font} } ...
}`

我想在页面标记中对年轻的 CSS 片段进行类似的替换,主要的 Wicket 传统将其用作常量。假设拦截标记和替换时,没有人会批评。

适用于公司内部网的工作人员,与大型媒体门户网站没有竞争力。我想建立 "skin" 概念,但只是在小范围内。只有很少的基本颜色,3 个地方的字体大小,仅此而已。颜色不伤眼,工作舒适。

我想(将来)拥有 2-3 个,不超过 4 个 color/font 套皮肤。没有人会测试 "what to to, when all fonts we give 3x bigger",字体范围只有 +/-20%。函数"reset to fabricate setting"是基础

问题:在两个位置 (html & css) 内替换在 Wicket 中是否政治正确? 一些技术想法? 可能存在现成的库来保存会话参数(对于用户)或全局参数。

自定义将移动小 "gadget" 面板(像 portlet 但更轻)左边距/右边距或隐藏,仅此而已

顺便说一句。我从来都不是一名平面设计师,但是通过很少的 Myers 书籍,我在 CSS 方面的技能正在增长。

只需在页面或页面中的 Component/Behavior 中使用:

@Override public void renderHead(IHeaderResponse response) {
    super.renderHead(response);
    response.render(CssHeaderItem.forCss(yourDynamicCssAsString, "some-unique-id"));
}

如果您的应用程序是 SPA,那么我会将不同的 class 提取到单独的 CSS 文件中,然后有条件地将它们加载到 renderHead() 中的 Page

例如,我们这样做是为了根据浏览器有条件地加载 js:

   public static JavaScriptHeaderItem getJqueryNumericJsHeaderItem() {
      ClientProperties browser = WebSession.get().getClientInfo().getProperties();
      if (browser.isBrowserInternetExplorer() && browser.getBrowserVersionMajor() <= 9) {
         return JavaScriptHeaderItem.forReference(jqNumericReference("numeric.ie8.js"));
      }
      if (browser.isBrowserInternetExplorer() && browser.getBrowserVersionMajor() >= 10) {
         return JavaScriptHeaderItem.forReference(jqNumericReference("numeric.ie11.js"));
      }
      return JavaScriptHeaderItem.forReference(jqNumericReference("numeric.js"));
   }

我们使用的另一种方法是将 CSS class 附加到 <body> 标签,然后在 CSS 中依赖此 class。代码:

  WebMarkupContainer body = new WebMarkupContainer("bodyElement") {
     @Override
     protected void onConfigure() {
        super.onConfigure();
        add(AttributeModifier.replace("class", getSkinBasedOnCondition()));
     }
  };

然后在 CSS:

.skinA .button{
 color: red;
 font-size: 20px;
}

.skinB .button{
 color: blue;
 font-size: 30px;
}

那么你没有条件 CSS 加载。只是有条件地向 <body> 添加一个 CSS class。