【问题标题】:crossbrowser opacity mixin for .less.less 的跨浏览器不透明度混合
【发布时间】:2013-03-13 22:29:23
【问题描述】:

我正在尝试在 LESS 中使用 Javascript 以在 phpstorm 中进行编译..

我正在尝试基于在此站点上找到的不透明度的跨浏览器实现来创建一个函数:link

具体来说,我正在尝试创建一个 LESS 函数来重新创建这段代码:

.crossbrowseropacity {
    /* Fallback for web browsers that doesn't support RGBa */
    background: rgb(0, 0, 0);
    /* RGBa with 0.6 opacity */
    background: rgba(0, 0, 0, 0.6);
    /* For IE 5.5 - 7*/
    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
    /* For IE 8*/
    -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
}

这就是我在 LESS 中实现的目标:

.crossbrowser(@color,@alpha){
  @myred:red(@color);
  @mygreen:green(@color);
  @myblue:blue(@color);
  @ievalue:Math.floor(@alpha * 255).toString(16);
  background-color: @color;
  background-color: rgba(@myred,@mygreen,@myblue,@alpha);

/* For IE 5.5 - 7*/

  filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#@ievalue+@myred+@mygreen+@myblue, endColorstr=#@ievalue+@myred+@mygreen+@myblue);

  /* For IE 8*/

  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#@ievalue+@myred+@mygreen+@myblue, endColorstr=#@ievalue+@myred+@mygreen+@myblue)";
}

它不会正确编译..有人可以帮我解决这个问题吗?

【问题讨论】:

  • 有任何错误消息可以帮助某人帮助调试吗?
  • 它在第 12 行出现语法错误 - 其中有 @ievalue:M​​ath.floor(@alpha * 255).toString(16);

标签: javascript css cross-browser less phpstorm


【解决方案1】:

假设您使用的是 LESS 1.3.1 或更高版本,那么这就是您想要的(使用内置函数):

//define mixin
.crossbrowser(@color,@alpha){
  @rgba: rgba(red(@color),green(@color),blue(@color),@alpha);
  @argb: argb(@rgba);
  background-color: @color;
  background-color: @rgba;
  filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr=@{argb}, endColorstr=@{argb})";
  -ms-filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr=@{argb}, endColorstr=@{argb})";
}

//use it
.crossbrowser(red, .2);

CSS 输出

background-color: #ff0000;
background-color: rgba(255, 0, 0, 0.2);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33ff0000, endColorstr=#33ff0000);
-ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#33ff0000, endColorstr=#33ff0000);

【讨论】:

  • 这就是正确的答案。我在 LESS 中遇到过这个关于过滤器属性的问题很多次,这很痛苦。使用波浪号,它允许您输出多个变量,否则这些变量将被解释为更大算法的一部分。
  • @JoshBurgess:他的另一个问题显然是为filter 属性构建#AARRGGBB,但最新的LESS 使用argb() 函数来适应它。
  • 这行得通,有什么办法可以更改这篇文章的标题,这样搜索的人可能会发现它更容易?像crossbrowser opacity LESS mixin这样的东西?谢谢!!!
  • 我想如果 progid:DXImage... 在 -ms-filter 之后没有被 qoutations 包围,这并不重要? " " 该站点的示例显示了它,但它似乎在没有它们的情况下在 IE8 中工作(您的 less 函数会产生)
  • @CI_Guy:如果你想要引号,你可以在双引号内添加单引号,但我同意,我不确定它是否完全有必要。
【解决方案2】:

来自docs

但是,如果您仍想在 .less 中使用 JavaScript,可以通过用反引号包裹表达式来完成:

@var: `"hello".toUpperCase() + '!'`;

所以你的台词应该是这样的(我认为):

@ievalue:`Math.floor(@alpha * 255).toString(16)`;

由于您在内部使用变量,您可能需要使用string interpolation,但话又说回来,您可能不需要,因为您的@alpha 不在字符串中。如果这不起作用,请尝试一下:

@ievalue:`Math.floor(@{alpha} * 255).toString(16)`;

那个看起来很有趣,我认为这是错误的。希望第一个有效。但看起来您需要在稍后执行此操作时使用插值:

"...#@ievalue+@myred+@mygreen+@myblue..."

因为您在示例代码最后一行的字符串中,所以我认为应该是:

"...#@{ievalue}+@{myred}+@{mygreen}+@{myblue}..."

至于您的最新问题,您可能需要使用另一个称为 Escaping 的位:

Escaping

有时您可能需要输出一个无效的 CSS 语法或使用 LESS 无法识别的专有语法的 CSS 值。

为了输出这样的值,我们把它放在一个以~为前缀的字符串中,例如:

.class {
  filter: ~"ms:alwaysHasItsOwnSyntax.For.Stuff()";
}

所以你的最后两行应该是这样的:

filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr=#@{ievalue}+@{myred}+@{mygreen}+@{myblue}, endColorstr=#@{ievalue}+@{myred}+@{mygreen}+@{myblue})";

/* For IE 8*/

-ms-filter: ~"progid:DXImageTransform.Microsoft.gradient(startColorstr=#@{ievalue}+@{myred}+@{mygreen}+@{myblue}, endColorstr=#@{ievalue}+@{myred}+@{mygreen}+@{myblue})";

我找到了this very brief example 来备份它,但同样,我还没有尝试过。

【讨论】:

  • 我不再收到编译错误:@ievalue:Math.floor(@alpha * 255).toString(16);但是尝试您的两个示例时,过滤器和 -ms-filter 行仍然出现错误
  • 我已经尝试过您的确切示例以及 -ms-filter:~"'progid:DXImageTransform.Microsoft.gradient(startColorstr=#"@ievalue+@myred+@mygreen+@myblue~''" , endColorstr=#"@ievalue+@myred+@mygreen+@myblue ~")";并且仍然有编译问题:(
  • 从那个例子..这确实有效 -ms-filter: ~"'progid:DXImageTransform.Microsoft.Alpha(Opacity=" @alpha*100 ~")'";我会尝试弄乱这个
  • 以上都不起作用,所以我添加了一个赏金..这将是一个很好的功能,可以从十六进制值颜色快速转换 IE 不透明度
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 2011-05-22
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多