サスはパーセントマイナスピクセルを計算します


133

次のことができるようになりたいです。

height: 25% - 5px;

明らかにそれを行うとエラーが発生します:

Incompatible units: 'px' and '%'.

私が取得Invalid property valueエラー。ChromeのCanaryビルドを含むすべてのブラウザー。
Mike Fielden

クールなものを手に入れるSass関数がある場合、私はただ遊んでいただけcalcです...
Mike Fielden

はい:)私が言ったように、それがどのように行われるかcalcは気にしませんでしたが、最初に行ってそれが機能しませんでした。それは次のようになりますcalcSASSの実装では、私が推測すると思いますがベストですので、私のブラウザのいずれかにdoesntの仕事。
Mike Fielden

1
Sassはcalc()のポリフィルとして機能できません。25%をpxに変換する方法がわからないため、計算を実行してCSSを生成できます。正確なニーズに応じて、表示テーブルファミリーの使用、ボックスサイズの変更、負のマージンの使用(jsfiddle.net/5JZGt)などの代替手段があるかもしれません
cimmanon

回答:


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 2013

5
計算関数内の変数を使用して幅に問題がありましたが、次のように見つかりました:stackoverflow.com/questions/13542164/…このように変数を参照できます:calc(25% - #{$var})
mlunoe 2013

@dalgardのステートメントをフォローアップするために、既存のリリース済みブラウザーに関して、calcは機能する範囲でしか機能しません。参照:caniuse.com/#search=calc
imjared

3
いつでも追加することによって、フォールバックオプションを使用することができますwidth: 22%上記のすべてにwidthしてScalc
Hengjie

23

calcSCSS [コンパイル時]とCSS [ランタイム]の両方に関数があります。後者ではなく前者を呼び出す可能性があります。

明らかな理由により、混合ユニットはコンパイル時に機能しませんが、実行時には機能します。

後者unquoteは、SCSS関数のを使用して強制できます。

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

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

2
この質問に対する回答を投稿していただき、ありがとうございます。スタックオーバーフローでは、コードのみの回答は推奨されません。これは、コンテキストのないコードダンプではソリューションがどのようにまたはなぜ機能するかが説明されないため、元の投稿者(または将来の読者)がその背後にあるロジックを理解することが困難になるためです。質問を編集し、コードの説明を含めて、他の人があなたの回答から利益を得られるようにしてください。ありがとう!
Maximillian Laumeister、2015

それは私を救った。幅:unquote( "calc(100%-#{$ leftnav-width})");
httpete 2016年

5

IFあなたは、コンテナの幅を知って、あなたは次のように行うことができます:

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

多くの場合、#containerは相対的な幅を持つ可能性があることを認識しています。その後、これは機能しません。


2

古いスレッドを復活させて申し訳ありません-:after疑似セレクターを使用したCompassのストレッチは、目的に合う可能性があります。画面の左から(50%+ 10px)までの幅をdivで埋める場合は、(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 2014年

0

パーセント値を変数に追加して、#{$variable} たとえば

$twentyFivePercent:25%;
.selector {
    height: calc(#{$twentyFivePercent} - 5px);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.