2015-12-22 13 views
45

最近、私はCSS内でcalc(...)メソッドを使い始めました。私はすぐにwidth: calc(100%-2)のようなコードは動作しませんが、-オペレータの前後に空白を追加することで問題が解決され、calcメソッドが正しく機能することがわかりました。+または - は、Calc()メソッド内の空白で囲まなければならないのはなぜですか?

また

、空白は上の必要になります。

研究のビットを行った後、私は複数のブログの記事は、空白が必要とされ、多くがさえ述べ仕様(CSS3 8.1.1)を指摘していることを参照しました+と - オペレータの両側。 (*および/ operatersは、彼らの周りの空白 することなく使用することができる。)

今、明らかに、スペックは、これらの事業者が空白に包まれなければならないことを教えてくれるが、なぜ?私は仕様(8.1.2-4節を参照)の中でさらに読んだことがあり、これらの追加部分で説明されていれば、私は推論を理解していません。

簡単な言葉で言えば、なぜcalc(100% - 1)、さらにはcalc(100%/2)が受け入れ可能な構文ではあるが、calc(100%-1)ではないと指定された理由を説明できますか?

+1

私はあなたができるように、それがあると仮定します計算では負の数を使用します。 – Turnip

+2

@Festive私はそこに負の数が必要な理由を得ることはありませんか? – nicael

+4

@FestiveTurnipそれは良い仮定ではありません。スペースは単項 ' - 'からバイナリ ' - 'を伝える必要はほとんどありません。 '3-2'の代わりに' 3-2'を書く必要がある言語はありません。 – meagar

答えて

40

-文字は、CSSのidentsで許可される文字の1つです。解像度がhereであると判断して、などのキーワード値を使用すると、特にcalc()のようなキーワードの値を使用すると、文法のあいまいさを防ぐことができたようです。違う)。

Not everyone agreesこの解像度では、

+0

非常に興味深い。私はこれが理にかなっていると思いますが、良いパーサはこれらの問題を解決できるはずです。 (しかし、CSSは従来の計算コード(C、C#、Javaなど)とは異なるので、そうではないかもしれません) '+'と '-'はしばしば一緒になるので、 – RLH

+0

@RLH:あなたは 'min-content-2em'のようなものをどう解決しますか?それは単一のident(これはほとんど確実に無効な宣言になるでしょう)と解釈されるべきでしょうか、あるいは残りのトークンを消費する前に 'min-content'をキーワード値として不本意にマッチさせるべきでしょうか?私は人間の読者でさえそれを解析するのに問題があると思う。 – BoltClock

+0

私はあなたのポイントを見ます。うーん、私はidentsで ' - 'を許すと、シンタックスデザインが間違っていると思う。代わりに、他のすべての純粋な言葉のように、場所のいたるところに '_ 'を投げて間違っています! :Pしかし、私は、私のコメントはこの質問の範囲外です。 – RLH

30

Mozilla Developer Networkは非常によくそれを説明する:

+-演算子は常に空白で囲む必要があります。たとえば、calc(50% -8px)のオペランドはパーセントで解析され、負の長さ、無効な式が続きます。一方、オペランドcalc(50% - 8px)はマイナス記号と長さが続くパーセントです。さらに、calc(8px + -50%)は長さとして扱われ、プラス記号と負のパーセントが続きます。

*/演算子は空白を必要としませんが、一貫性のために追加することは許可され、推奨されます。

+0

私はこれも私が混乱していたと思う。例: '100%+ 2px'を考えてください。これは' 100%2px'に解決できます。これは文脈上意味をなさない。 Ergoでは、 '+'や '-'が(calc関数内に)存在する場合は、連想演算(idents内の' -'シンボル全体の使用を無視します)とみなすべきです。私は良い通訳が少なくともプラス記号を適切に解決できると思いますか? – RLH

11

私は、CSSがどのように長さを特定するのかを最初に考えなければならないと考えます。長さは、(多くの特性が実際にそれを必要とするが)モジュール続くオプションの符号と尺度の任意単位として定義される:

<CSSlength> := [<sign>]<module>[<unit>] 

したがって、例えば、有効なCSSの長さは、次のとおり

-3px 
100em 
+10pc 
0 
91 
5% 
このような長さを定義する

、CSSエンジンは、次解析します

calc(100% -1px); 

を別の長さが続く長さとして。この場合、100%に続いて-1pxが続きますが、calc()には全く意味がありません。これは、相対MDN documentation pageでも説明されています。したがって、上記のロジック以下、あなたは空白を使用する必要があります、あなたは明確な演算子を使用する必要がある関係で2つの長さを置くために

calc(100% - 1px); 
関連する問題