萨斯计算百分比减去px


133

我希望能够执行以下操作:

height: 25% - 5px;

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

Incompatible units: 'px' and '%'.

我得到了Invalid property value错误。在包括Chrome的Canary版本在内的所有浏览器中。
Mike Fielden '11年

如果有一个Sass函数可以让我得到我想要的东西,那我就在玩calc...
Mike Fielden 2012年

是的:)就像我说的,我不在乎它calc是如何完成的,如果我先去了却没有​​起作用。看来calc在我的任何浏览器中都不起作用,所以我猜最好是用一个简单的实现。
Mike Fielden '11年

1
Sass不能充当calc()的polyfill。它不知道如何将25%转换为px,以便可以进行数学运算并生成CSS。根据您的确切需要,有可能是一种选择,如使用的显示表族,变更箱上浆,或使用负边距(jsfiddle.net/5JZGt
cimmanon

Answers:


239

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

您需要calc()改用。 在“我可以使用...上检查浏览器的兼容性...

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

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

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

.foo {
  width: calc(#{$a} - #{$b});
}

5
我想说calc()在大多数浏览器中根本不起作用。移动平台与台式机一样重要。
dalgard 2013年

3
那里没有论据,但请指望浏览器!更多的支持calc()会在不远的将来支持更多!
chrisgonzalez

5
我在calc函数内使用变量时遇到宽度问题,但在这里找到:stackoverflow.com/questions/13542164/…我可以像这样引用该变量:calc(25% - #{$var})
mlunoe

为了跟进@ dalgard的说法,在现有的浏览器发布而言,钙不起作用超过它在见:caniuse.com/#search=calc
imjared

3
您始终可以使用后备选项,方法是width: 22%在所有首widthcalc
字母

23

calcSCSS [编译时]和CSS [运行时]中都有一个功能。您可能会调用前者而不是后者。

出于明显的原因,混合单元无法在编译时工作,但可以在运行时工作。

您可以使用unquoteSCSS函数强制后者。

.selector { height: unquote("-webkit-calc(100% - 40px)"); }

14
$var:25%;
$foo:5px;
.selector {
    height:unquote("calc( #{$var} - #{$foo} )");
}

2
感谢您发布此问题的答案!不鼓励在Stack Overflow上使用仅代码的答案,因为没有上下文的代码转储无法解释解决方案的工作方式或原因,从而使原始张贴者(或任何未来的读者)难以理解其背后的逻辑。请编辑您的问题,并附上代码说明,以便其他人可以从您的答案中受益。谢谢!
Maximillian Laumeister 2015年

那救了我。宽度:unquote(“ calc(100%-#{$ leftnav-width})”);
httpete '16

5

如果您知道容器的宽度,则可以这样:

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

我知道在许多情况下,#container可能具有相对宽度。这样就行不通了。


2

很抱歉恢复旧线程-使用:after伪选择器进行的Compass拉伸可能适合您的目的-例如。如果您希望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。


1
在某个地方有少量或无聊的混合吗?calc似乎根本无法很好地工作。
v3nt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.