148

我希望能够做到以下几点:

height: 25% - 5px;

显然,当我这样做时,我得到了错误:

Incompatible units: 'px' and '%'.
4

6 回答 6

287

Sass 无法对无法从一个单位转换为下一个单位的值执行算术运算。Sass 无法确切知道“100%”在像素或任何其他单位方面的宽度。这只有浏览器知道。

你需要calc()改用。 检查浏览器兼容性我可以使用...

.foo {
    height: calc(25% - 5px);
}

如果您的值在变量中,您可能需要使用插值将它们转换为字符串(否则 Sass 只会尝试执行算术):

$a: 25%;
$b: 5px;

.foo {
  width: calc(#{$a} - #{$b});
}
于 2012-11-07T17:28:34.660 回答
28

SCSS [编译时] 和 CSS [运行时] 都有一个calc函数。您可能会调用前者而不是后者。

由于显而易见的原因,混合单元不会在编译时工作,但会在运行时工作。

unquote您可以通过使用SCSS 函数来强制执行后者。

.selector { height: unquote("-webkit-calc(100% - 40px)"); }
于 2014-08-28T11:38:31.640 回答
15
$var:25%;
$foo:5px;
.selector {
    height:unquote("calc( #{$var} - #{$foo} )");
}
于 2015-08-16T02:41:39.997 回答
7

如果你知道容器的宽度,你可以这样做:

#container
  width: #{200}px
  #element
    width: #{(0.25 * 200) - 5}px

我知道在许多情况下#container 可能有一个相对宽度。那么这行不通。

于 2013-07-31T20:02:49.230 回答
2

很抱歉恢复旧线程 - Compass 使用 :after 伪选择器进行拉伸可能适合您的目的 - 例如。如果你想让一个 div 从左边填充到屏幕的(50% + 10px)宽度,你可以使用(在 SASS 缩进语法中):

.example
    background: red
    +stretch(0, -10px, 0, 0)
    &:after
        +stretch(0, 0, 0, 50%)
        content: ' '
        background: blue

:after 元素填充 .example 右侧的 50%(为 .example 的宽度留出 50%),然后 .example 被拉伸到该宽度加上 10px。

于 2013-09-01T15:51:29.427 回答
1

只需将百分比值添加到变量中并使用#{$variable} 例如

$twentyFivePercent:25%;
.selector {
    height: calc(#{$twentyFivePercent} - 5px);
}
于 2019-05-06T04:14:55.913 回答