Verschachteln von @media
Thomas Mell
- css
Hallo,
ist so etwas gültiges CSS ?
@media screen, print {
body { font-size:30px; }
@media screen {
body { font-size:50px; }
}
}
Der W3C-CSS-Validator verabschiedet sich mit einen Parserfehler.
Firefox gibt keine Warnung oder Fehler aus, verwendet aber die 30px und ignoriert das interne "@media screen".
In der Spezifikation habe ich dazu nichts gefunden.
Mir geht es nicht um die Sinnhaftigkeit diese Beispiels, sondern um die Gültigkeit.
Muss das interne @media ignoriert oder verarbeitet werden, bzw. ist dies sogar ein Fehler ?
Grüße
Thomas
Hello out there!
In der Spezifikation habe ich dazu nichts gefunden.
?? Dann hast du wohl um die richtige Stelle einen großen Bogen gemacht.
Wo sollte das stehen, wenn nicht in der Grammatik? [CSS2 §D]
media
: MEDIA_SYM S* medium [ ',' S* medium ]* '{' S* ruleset* '}' S*
;
See ya up the road,
Gunnar
Hallo Thomas,
In der Spezifikation habe ich dazu nichts gefunden.
Einfach mal in die formale Grammatik von CSS gucken. @media-Statements dürfen nur innerhalb der Produktion stylesheet vorkommen. Innerhalb der geschweiften Klammern einer @media-Produktion darf nur die Produktion ruleset (0 oder mehr) vorkommen; ruleset dagegen besteht nur aus dem bekannten Deklarationen, kein @media-Statement.
Dies gilt auch noch in CSS 3 Syntax. Und Media Queries macht natürlich keine Aussage dazu, weil es sich nicht darauf bezieht.
Mir geht es nicht um die Sinnhaftigkeit diese Beispiels, sondern um die Gültigkeit.
Sprich: Darf nicht.
Muss das interne @media ignoriert oder verarbeitet werden, bzw. ist dies sogar ein Fehler ?
Gute Frage. Rein nach der Grammatik ist es ein Fehler. CSS 2.1 dokumentiert und spezifiziert etwas die Fehlerbehandlungsroutinen. Das kann nun zweifach als Fehler auftreten:
• Entweder interpretiert der UA das "@media screen" als kaputten Selektor; schließlich befindet er sich schon in einem @media-Block und erwartet nach Grammatik nur Rulesets. Das @media-Statement wäre also ein invalided Ruleset-Statement, in dem das "@media screen" dann der Selektor wäre. Invalide Rulesets müssen ignoriert werden.
• Oder aber der Parser erkennt auch in Bereichen, in denen @-rules nicht auftauchen dürfen die @-rule und stellt fest, dass die hier nicht hingehört. Invalide @-rules müssen ignoriert werden.
(CSS 2.1, Abschitt 4.2: Rules for handling parsing errors)
Tim
Hi Tim,
• Entweder interpretiert der UA das "@media screen" als kaputten Selektor; schließlich befindet er sich schon in einem @media-Block und erwartet nach Grammatik nur Rulesets. Das @media-Statement wäre also ein invalided Ruleset-Statement, in dem das "@media screen" dann der Selektor wäre. Invalide Rulesets müssen ignoriert werden.
Firefox meldet hier gar nichts, ich denke mal der er die Angabe ignoriert. Ein Validator sollte so etwas als Fehler melden da es ein klarer Verstoss gegen die Grammatik ist.
• Oder aber der Parser erkennt auch in Bereichen, in denen @-rules nicht auftauchen dürfen die @-rule und stellt fest, dass die hier nicht hingehört. Invalide @-rules müssen ignoriert werden.
body { @media screen { body { color:red; } } }
Da meckert Firefox:
Fehler: Deklaration erwartet, aber '@media' gefunden. Übersprungen bis zur nächsten Deklaration
Quelldatei: file:///H:/SERVER/WWW/validator/TMPkm0b6fbc5a.htm
Zeile: 7
Das müsste er eigentlich ignorieren, ist schliesslich ein kaputter Selektor ?!
Es ist mir schon klar das der Firefox kein Validator ist, als Anhaltspunkt ist er aber allemal brauchbarer als das W3C-Witzdings.
Ich muss mir halt Gedanken machen "was" ich "wann" bei welchen Fehler melden muss. Ich denke mal das man in beiden Fällen einen Fehler melden sollte, was meinst Du ?
Grüße
Thomas
Hallo Thomas,
Fehler: Deklaration erwartet, aber '@media' gefunden. Übersprungen bis zur nächsten Deklaration
Das müsste er eigentlich ignorieren, ist schliesslich ein kaputter Selektor ?!
Tut er doch auch, den Fehler feststellen und das, was den Fehler verursacht ignorieren. Es sind nur definierte Regeln, wie Fehler zu ignorieren sind. ;)
Ich denke mal das man in beiden Fällen einen Fehler melden sollte, was meinst Du ?
Ja, natürlich.
Tim
Hep,
Tut er doch auch, den Fehler feststellen und das, was den Fehler verursacht ignorieren. Es sind nur definierte Regeln, wie Fehler zu ignorieren sind. ;)
Im ersten Beispiel meldet er aber keinen Fehler und ignoriert es.
Wie auch immer, es wird in beiden Fällen ne Fehlermeldung geben.
Grüße
Thomas