5

この CSS ルールを見てみましょう。

#foo { color: red; }

ご覧のとおり、上記のルールの宣言ブロックには 1 つの宣言、つまりcolor: red. ただし、CSS 標準の私の解釈によれば、上記の宣言ブロックには 2 番目の空の宣言も含まれており、これは chars;}.

#foo { color: red; }
                  ^ --- an empty declaration is located here

私の解釈が正しいかどうか、つまり、上記の CSS ルールに 2 番目の空の宣言が実際に存在するかどうかを判断するために、Stack Overflow でこの質問をしています。

ところで、私は CSS 2.1 標準、具体的には「Chapter 4: Syntax」を使用しています。これは、「CSS Syntax」モジュールが古く、安全に使用できないためです。

わかりました、説明させてください。私の解釈は、次の定義に基づいています。

  • 標準では、宣言ブロック内で、セミコロンは個々の宣言の間に表示されるセパレーターであると述べています。

    宣言ブロックは、左中かっこ ({) で始まり、対応する右中かっこ (}) で終わります。間には、0 個以上のセミコロン (;) で区切られた宣言のリストが必要です。

    したがって、上記の定義によれば、セミコロンは2 つの宣言の間にのみ出現します。つまり、セミコロンの前と後に宣言がなければなりません。

  • 標準では、宣言を次のように定義しています。

    宣言は、空であるか、プロパティ名、コロン (:)、プロパティ値で構成されます。

    上記の定義は、宣言を空にすることができると述べています。残念ながら、標準は「空宣言」という用語を定義しておらず、標準の他のどこにも言及されていません。

例に戻りましょう:

#foo { color: red; }

上記のルールは有効な CSS です。(上記の) セミコロンの定義を適用することにより、この規則のセミコロンの前と後には宣言が必要です。ただし、セミコロンの後には閉じ中かっこ (宣言を終了します) が続きます。この矛盾を説明するために、 と の間に空の宣言を挿入し、;次の}定義を提供します。

空の宣言とは、宣言が必要であるが見つからない宣言ブロック内の位置に宣言がないことです。

この標準の解釈は正しいですか? また、宣言ブロックには実際に 2 つの宣言が含まれていますか?

4

3 に答える 3

2

私はあなたの状況が空の宣言を示すように読書がそれを述べていることに同意します。実際、ほとんどの場合、リファレンスページには;、例の最後の括弧の前にファイナルがありません。あなたの定義は近いと思いますが、「空」という考えにはあまり当てはまりませんでした。その代わり:

空の宣言は、宣言が必要な宣言ブロック内にコンテンツがない宣言です。

または、おそらく、ここでのメモを考えると、これは...

空の宣言は、宣言が必要な宣言ブロック内のコンテンツとして空白を超えない宣言です。

「実際的な影響なし...影響なし」についてのContraJukkaのコメント、私は、そのようなコードブロックに対して行う追加の解析が1つあるという点で、これまでにないほどわずかな影響があると思う傾向があります(私がそうでなかったとき、それは機能的な効果がないと主張していたと思います)。このページには次のように記載されています。

この仕様では、無視を定義して、ユーザーエージェントが(開始と終了を見つけるために)不正な部分を解析しますが、それ以外の場合は、そこに存在しなかったかのように動作します。

空の宣言は違法ではありませんが、パーサーは、宣言ブロックの最後にあることに気付く前に、空であると判断するために1つの追加ステップを実行する必要があると思います。

于 2012-12-07T21:22:06.303 に答える
2

はい、これは、セミコロンを区切り文字として定義し、ステートメント (または宣言など) の一部ではないコンピューター言語では正常です。空の宣言は効果がないため、他に考えられる解釈はなく、この問題は実際的な影響はありません。

于 2012-12-07T21:03:02.600 に答える
1

一見すると、仕様はこの点で少し矛盾しているように見えます。あなたが引用する一節にもかかわらず、形式文法declaration生成をproperty ':' S* expr prio?、決して空ではないとして定義します。ただし、declaration他のプロダクションに表示される場合は常に、その後にが続き、?オプションとしてマークされます。言い換えれば、文法が許すところならどこでもdeclaration、それは[何も]も許しません。

仕様の英語の散文に現れる「宣言」という用語は、 ;ではなくdeclaration?( -または-[nothing])を指すと言うことで、矛盾を解決できます。しかし、持ち帰りの主なポイントは、それは問題ではないということだと思います。仕様は、空の宣言が実際には効果がないように記述されています。declarationdeclaration

(そして、もっと悪いかもしれません。標準MLでは、空の宣言が許可され、宣言間でセミコロンを省略できます。したがって、のようなものval a = 7 val b = 20は、2つの空でない宣言が混在する、任意の数の空の宣言のシーケンスとして解析できます。)

于 2012-12-07T21:13:48.167 に答える