问题 GWT CssResource中的基本算术


我正在寻找一种方法来做这样的事情:

// style.css
@def borderSize '2px';

.style {
  width: borderSize + 2;
  height: borderSize + 2;
}

其中width和height属性最终的值为4px。


11313
2018-06-18 14:07


起源

非常好的问题BTW(+1) - Chris Lercher


答案:


有时我会使用以下内容:

@eval BORDER_SIZE_PLUS_2 2+2+"px"; /* GWT evaluates this at compile time! */

奇怪的是,这只会起作用,如果你之间没有任何空格 + 运算符和操作数。此外,在@eval中,您不能使用之前由@def定义的常量。但是,您可以在其中一个Java类中使用定义为静态字段的常量:

@eval BORDER_SIZE_PLUS_2 com.example.MyCssConstants.BORDER_SIZE+2+"px";

或者你可以让Java完全执行计算:

@eval WIDTH com.example.MyCssCalculations.width(); /* static function, 
                                                      no parameters! */
@eval HEIGHT com.example.MyCssCalculations.height();
.style {
    width: WIDTH;
    height: HEIGHT;
}

但我真正想做的是与你的建议非常相似:

@def BORDER_SIZE 2;
.style {
    width: value(BORDER_SIZE + 2, 'px'); /* not possible */
    height: value(BORDER_SIZE + 3, 'px');
}

我不认为在GWT 2.0中这是可能的。也许你找到了一个更好的解决方案 - 这就是 开发指南 有关此主题的页面。


14
2018-06-18 17:38



+1好的发现 - 我真的希望GWT团队花一些时间来改进CssResource处理 - 那里有很多潜力,就像Jason指出的那样 calc() 来自Mozilla的功能。 - Igor Klimer
谢谢你的回答,不幸的是我提出这个问题的根本原因是让@def变量填充了图像资源,例如用@def borderSize值替换@def borderSize'2px'('icon.getWidth','px' );但我将来肯定会使用那些简单的算术运算 - Matt
你可以这样做:@eval borderSizePlusTwo icon.getWidth()+ 2+“px” - Roy Paterson
看起来在GWT 2.5中删除了此功能。我刚升级,这不再有效(在运行时失败,而不是编译时):-( - Roy Paterson
@Roy:我刚用GWT 2.5.0再次测试它们 - 它们仍然适合我。哪个确切的陈述 - 包括空格字符! - 停止为你工作? (升级后你清理了gwt-unitCache目录,WEB-INF / classes等吗?) - Chris Lercher


使用它的CSS,Mozilla并不真正支持它 calc() 功能。

这个例子无耻地被盗(有归属!)来自 才算是Ajax

/*
* Two divs aligned, split up by a 1em margin
*/
#a {
  width:75%;
  margin-right: 1em;
}
#b {
  width: -moz-calc(25% - 1em);
}

它不是跨浏览器的,它可能只是几乎不受Firefox最新版本的支持,但至少在这方面取得了进展。


1
2018-06-18 14:37





如果在函数中放入参数,也可以在提供者方法中计算:

@eval baseFontSize com.myexample.CssSettingsProvider.getBaseFontSize(0)+"pt";

@eval baseFontSize_plus_1 com.myexample.CssSettingsProvider.getBaseFontSize(1)+"pt";

com.myexample.CssSettingsProvider 看起来像这样:

public static int getBaseFontSize(int sizeToAdd) {
    if (true) {
        return 9 + sizeToAdd;
    }
    return baseFontSize;
}

0
2017-12-06 07:57





我也喜欢这样的东西,但这是不可能的。 即使在CSS 3中,他们也没有像这样的计划。

如果你真的想做类似的东西,一种可能性就是使用 php并配置你的web服务器,以便php解析.css文件。

所以你可以做点什么

<?
  $borderSize = 2;
?>

.style {
  width: <? borderSize+2 ?>px;
  height: <? borderSize+2 ?>px;
}

但由于这不是“标准”方式,我认为最好不要这样做。


-3
2018-06-18 14:14