Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Welcher HTML-Validator hat denn jetzt Recht?

Welcher HTML-Validator hat denn jetzt Recht?

dom_beta05.05.1113:00
Hallo,

ich habe vorhin meine Seite mit dem HTML Validator von SelfHTML validieren lassen, und bei einigen sagt er mir, es sei kein valides HTML 4.01 Strict obwohl der Validator von der W3C das Gegenteil behauptet.

Wem kann ich denn jetzt vertrauen?

SelfHTML Validator:
http://validator.de.selfhtml.org/validate



MfG
„...“
0

Kommentare

sierkb05.05.1113:41
Ohne konkreten URL bzw. ohne konkretes Code-Beispiel kann da wohl keine Auskunft und Hilfe zu Deiner Frage gegeben werden.

Zumal offizielle Referenz immer noch die Validierungsdienste des W3C sind in Form des W3C Markup Validators bzw. in Form von W3C Unicorn (fasst die bisherigen W3C Validierungsdienste in einem einzigen GUI zu sammen)

Zu Validome sei noch Folgendes gesagt: und .
0
dom_beta05.05.1114:15
Er stört sich an diesem Codeschnipsel

(verwendet wird HTML 4.01 Strict)


1.
<div style="clear:both;"></div> 


2.
"Beim Verwenden von style-Attributen muss die verwendete Stylesprache in einen Meta-Element
(<meta http-equiv="Content-Style-Type" content="text/css">)
und/oder im HTTP-Header (Content-Style-Type: text/css) mitgeteilt werden."


Obwohl im Code dies steht:

<link rel="stylesheet" type="text/css" href="style.css">



PS: Laut "Unicorn" (siehe oben sierkbs Beitrag) ist die genannte Adresse valides HTML 4.01 Strict und valides CSS Level 2.1


MfG
„...“
0
fabian2de05.05.1114:32
Dein Link auf die style.css hat damit nichts zu tun.
Schreib folgende Zeile in den Header, dann löst sich das Problem:

<meta http-equiv="Content-Style-Type" content="text/css">
0
sierkb05.05.1115:43
dom_beta:

Ich setze jetzt mal still voraus, dass obige Meldung von Validome stammt, und ich könnte mir vorstellen, dass sich Validome hieran stört:

Du hast geschrieben:
<div style="clear:both;"></div>
und Validome hätte es evtl. gerne so:
<div style="clear:both;" [color=blue]type="text/css"[/color]>

Das hier
<link rel="stylesheet" type="text/css" href="style.css">

ist für die Betrachtung völlig irrelevant, weil Du da ein externes Stylesheet einbindest und den MIME-Type korrekt via type="text/css" mit auf den Weg gibst.

Genau dieser MIME-Type für das verwendete Inline-CSS fehlt in Deiner Inline-Style-Formulierung, daran stört sich Validome:
<div style="clear:both;">

In der HTML4.01-Spezifikation ist das alles so definiert (ich verweise und zitiere der besseren Verständlichkeit wegen hier jetzt mal auf die offizielle deutsche Übersetzung):

W3C: HTML 4.01: 14.2.2 Inzeilige Formatierungsinformation :
Attributdefinitionen

style = style [CN]
Dieses Attribut gibt Formatierungsinformationen für das aktuelle Element an.

DieSyntax des Wertes des Attributs style wird von der voreingestellten Stylesheet-Sprache festgelegt.

und ein paar Zeilen weiter:
Attributdefinitionen

type = content-type [CI]
Dieses Attribut gibt die Stylesheet-Sprache des Elementinhalts an und überschreibt die voreingestellte Stylesheet-Sprache. Die Stylesheet-Sprache wird als Inhaltstyp angegeben (zum Beispiel »text/css«). Autoren müssen einen Wert für dieses Attribut angeben; es gibt keinen Standardwert für dieses Attribut.

Hilfreich auch die Anmerkung des Übersetzters dazu im beigen Kästchen:
Anmerkung der Übersetzer:

Bislang spielt keine andere Stylesheet-Sprache als CSS eine Rolle für die Einbettung in HTML beziehungsweise XHTML, und es ist auch keine Alternative absehbar. (In XML-Dateien werden üblicherweise keine Formatierungsinformationen integriert; statt dessen werden meist externe Stylesheets referenziert.) Für das HTML-Element STYLE gilt damit in der Praxis immer, dass das Attribut type den Wert »text/css« besitzt.

Die Funktion des media-Attributs kann auch eine @media-Regel in CSS übernehmen. Details finden Sie in der CSS2-Spezifikation im Abschnitt 7.2.1.



Und einen Absatz/ein Kapitel drüber steht bzgl. Standardwert:

W3C: HTML 4.01: 14.2.1 Festlegen der Standard-Stylesheet-Sprache :
Autoren müssen die Stylesheet-Sprache angeben, die für die Formatierungsinformationen eines HTML-Dokuments gelten soll.
[..]
Autoren sollten das Element META verwenden, um die voreingestellte Stylesheet-Sprache für ein Dokument zu bestimmen. Um die Voreinstellung zum Beispiel auf CSS zu setzen, sollten Autoren die folgende Deklaration in den HEAD ihrer Dokumente einfügen:

<META http-equiv="Content-Style-Type" content="text/css">


Die voreingestellte Stylesheet-Sprache kann auch über HTTP-Header festgelegt werden. Die oben beschriebene META-Deklaration ist äquivalent zu dem HTTP-Header:

Content-Style-Type: text/css

Benutzerprogramme sollten die Voreinstellung für die Stylesheet-Sprache für ein Dokument anhand der folgenden Schritte bestimmen (von höchster zu niedrigster Priorität):

Geben META-Deklarationen den »Content-Style-Type« an, bestimmt die letzte Deklaration in der Dokumentzeichenfolge die Voreinstellung für die Stylesheet-Sprache.
Anderenfalls, wenn irgendwelche HTTP-Header den »Content-Style-Type« angeben, bestimmt die letzte Angabe in der Dokumentzeichenfolge die Voreinstellung für die Stylesheet-Sprache.
Ansonsten ist die Voreinstellung für die Stylesheet-Sprache »text/css«.

Dokumente, welche Elemente enthalten, die das Attribut style verwenden, die aber keine voreingestellte Stylesheet-Sprache definieren, sind inkorrekt. Webseiten erzeugende Programme sollten Voreinstellungen für Stylesheet-Informationen generieren (üblicherweise eine META-Deklaration), so dass Benutzerprogramme sich nicht auf die Voreinstellung »text/css« berufen müssen.

Hilfreich auch die Anmerkungen des Übersetzers im beigen Kästchen:
Anmerkung der Übersetzer:

Die praktische Relevanz dieses Abschnitts ist ziemlich gering: Für den Fall, dass Formatierungsinformationen im Element STYLE im Kopf der HTML-Datei stehen, muss zwingend das Attribut type die Stylesheet-Sprache angeben. Für den Fall, dass die Formatierungsanweisungen in einer externen CSS-Datei stehen, die von der HTML-Datei per LINK eingebunden wird, muss der Web-Server in der HTTP-Antwort in der Zeile Content-type den Wert text/css angeben. Eine Typangabe in der CSS-Datei ist nicht möglich.

Der Sinn dieses Abschnitts beschränkt sich im Übrigen dann auf die inzeiligen Formatierungsanweisungen, die im nächsten Abschnitt erklärt werden. Allerdings ist gerade diese inzeilige Platzierung von Formatierungsanweisungen diejenige, von der man möglichst Abstand nehmen soll.



Summasummarum: Entweder Du definierst im Header des Dokuments oder per Webserver-Konfiguration einen Standard-Content-Type "text/css" für CSS und kannst dann das type-Attribute in Inline-Style-Angaben und beim Style-Element und beim Link-Element auch weglassen. Oder Du definierst im Header oder per Webserver-Konfiguration keinen Standard-Content-Type für CSS, dann musst Du das nachholen an der betreffenden Stelle beim Inline-CSS bzw. beim <style>-Element und beim <link>-Element im Header jeweils mittels des Attributs type="text/css".

Hier hast Du den Content-Type korrekt mitgegeben:
<link rel="stylesheet" type="text/css" href="style.css">

Hier nicht:
<div style="clear:both;"></div>

Hast Du in Deinem Header des Dokuments Folgendes stehen

<meta http-equiv="Content-Style-Type" content="text/css">



Wenn nein, dann bitte nachholen. Dann dürfte obige Meldung nicht mehr kommen.
Oder Du gibst den MIME-Type der Inline-Style-Anweisung im <div>-Elemnt gleich mit so auf den Weg und schreibst stattdessen:

<div style="clear:both;" type="text/css"></div>

Zudem fällt mir auf (erblicke ich leider immer wieder, scheint sich über Jahre so eingebürgert zu haben und ist oft unnötig): warum legst Du da ein Extra-Div an, das nix anderes macht als ein oder mehrere vorherige floats auf einen Null-Level zu bringen? Bist Du sicher, dass das notwendig ist? Folgt nach dem vorherigen Blockelement wirklich kein weiteres Element mehr in Deinem HTML-Konstruct, so dass dieses Div wirklich unausweichlich ist? Wenn da nämlich noch ein Element folgen sollte (was meistens der Fall ist, zum Beispiel ein weiteres Div oder p oder sonst ein anderes Blockelement): warum gibst Du diesem folgenden Block-Element denn nicht das "clear: both" oder "clear: left" oder "clear: right" mit auf den Weg? Wäre doch viel sinnvoller, und Du hättest dieses Div gespart, das aus semantischer Sicht ja eigentlich null Sinn hat außer nur deshalb zu existieren, um da ein "clear was auch immer" in sich zu tragen. Eigentlich ist das sinnfreier Code, der zuviel ist, wenn er nur diesen einen Zweck hat. Das kann man bestimmt auch eleganter lösen auf grad' beschriebene Weise, wenn danach noch irgendein Element im DOM-Baum kommen sollte, das anders heißt als </body>.


Wenn das in Deinem Fall alles so zutrifft, und die Meldung nach entsprechender Änderung bei Validome nicht mehr kommen solte, dann wäre das zum Beispiel ein Beweis, dass Validome da etwas strenger urteilt als der Referenz-Validator des W3C.
Der Markup-Validator des W3C ist jedoch aus guten Gründen an der einen oder anderen Stelle nachsichtiger: weil er eben die Referenz ist und von so vielen Menschen auf der Erde benutzt wird, geht er da einen schmalen Grad zwischen "devil's advocate" und "Anwalt der Normalnutzer". Würde er nach außen hin noch strenger sein, wäre das Ergebnis an so mancher Stelle für so manchen Nutzer noch frustrierender als ohnehin schon oft genug.

Auch urteilt zum Beispiel HTML-Tidy in seinen vielen Erscheinungsformen (als PHP-Extension, als Apache Modul, als Browser-Add-On etc. pp.) bzw. der neue Fork davon, tidyp , teilweise strenger als der Validator des W3C (tidy kann man beim Validator inzwischen als Ergänzung hinzuschalten).

Es ist ein selbst beim W3C und dem W3C Validator-Team nicht ganz unumstrittener Weg, hier eine Balance zwischen "knallhartem Validierungswerkzeug" und "den Benutzer nicht abschreckendem frustrierendem Werkzeug" zu halten. Da hat es in der Vergangenheit immer wieder sehr intensive und ellenlange und durchaus auch hitzige Diskussionen und Abwägungen gegeben unter den Validator-Entwicklern.
0
sierkb05.05.1116:03
Zu dumm, dass es hier keine Vorschau gibt, womit man sich sein Geschreibsel nochmal anschauen kann, bevor es veröffentlich wird. Ich sehe zu spät, dass beige Farbe auf hellblauem Untergrund sehr schlecht lesbar ist (ich hatte zwar die Befürchtung, doch habe ich es trotzdem riskiert). Deshalb hier nochmal die obigen beiden Zitate in besser lesbarer Form:
Anmerkung der Übersetzer:

Bislang spielt keine andere Stylesheet-Sprache als CSS eine Rolle für die Einbettung in HTML beziehungsweise XHTML, und es ist auch keine Alternative absehbar. (In XML-Dateien werden üblicherweise keine Formatierungsinformationen integriert; statt dessen werden meist externe Stylesheets referenziert.) Für das HTML-Element STYLE gilt damit in der Praxis immer, dass das Attribut type den Wert »text/css« besitzt.

Die Funktion des media-Attributs kann auch eine @media-Regel in CSS übernehmen. Details finden Sie in der CSS2-Spezifikation im Abschnitt 7.2.1.

Anmerkung der Übersetzer:

Die praktische Relevanz dieses Abschnitts ist ziemlich gering: Für den Fall, dass Formatierungsinformationen im Element STYLE im Kopf der HTML-Datei stehen, muss zwingend das Attribut type die Stylesheet-Sprache angeben. Für den Fall, dass die Formatierungsanweisungen in einer externen CSS-Datei stehen, die von der HTML-Datei per LINK eingebunden wird, muss der Web-Server in der HTTP-Antwort in der Zeile Content-type den Wert text/css angeben. Eine Typangabe in der CSS-Datei ist nicht möglich.

Der Sinn dieses Abschnitts beschränkt sich im Übrigen dann auf die inzeiligen Formatierungsanweisungen, die im nächsten Abschnitt erklärt werden. Allerdings ist gerade diese inzeilige Platzierung von Formatierungsanweisungen diejenige, von der man möglichst Abstand nehmen soll.
0
dom_beta03.07.1117:50
sierkb
Zudem fällt mir auf : warum legst Du da ein Extra-Div an, das nix anderes macht als ein oder mehrere vorherige floats auf einen Null-Level zu bringen? Bist Du sicher, dass das notwendig ist?

Ja.

Ich habe nämlich im Code erst ein

float:left

und dann ein

float:right

stehen.

Und wenn anschließend ein Text kommt, wird der Text zwischen den beiden gefloateten Objekten gequetscht. Und genau dieses "Quetschen" will ich nicht.

Hast du dazu eine elegantere Lösung?

Denn bis jetzt habe ich das so gemacht, wie du's schon gesehen hast:

(CSS-Anweisungen stehen absichtlich zur Verdeutlichung im HTML-Code)

<a href="" style="float:left">...</a>
<a href="" style="float:right">...</a>
<div style="clear:both"></div>



Danke.

„...“
0
sierkb03.07.1120:44
dom_beta
sierkb
Zudem fällt mir auf : warum legst Du da ein Extra-Div an, das nix anderes macht als ein oder mehrere vorherige floats auf einen Null-Level zu bringen? Bist Du sicher, dass das notwendig ist?

Ja.

Ich habe nämlich im Code erst ein

float:left

und dann ein

float:right

stehen.

Und wenn anschließend ein Text kommt, wird der Text zwischen den beiden gefloateten Objekten gequetscht. Und genau dieses "Quetschen" will ich nicht.

Hast du dazu eine elegantere Lösung?

Um mal vorauszuschicken: ich habe Dich bisher so verstanden, als wolltest Du ein ansonsten inhaltsleeres div-Element platzieren, das keine andere Funktion hat als ein clear:both zu haben, um das vorherige Floating aufzuheben, also:

<div style="clear: both"></div>

und nicht

<div style="clear: both">Irgendein text oder anderer Inhalt</div>

Habe ich Dich richtig verstanden?
Das wäre einigermaßen sinnfrei. Warum?

Wenn kein weiteres Element mehr unter den beiden von Dir gefloateten Elementen kommen soll, musst Du im Grunde nix mehr clearen und aufheben. Wenn danach im Grunde das Dokument zu Ende ist, und danach nur noch schließende Tags kommen und dann am Schluss die schließenden </body> und </html>, dann existiert da eigentlich nichts mehr, was noch unbedingt unter diese beiden gefloateten Elemente gesetzt werden muss, dann erübrigt sich im Grunde ein Clearing, weil dann nichts mehr kommt. Das Dokument ist dann zu Ende und fertig. Also ist da an der Stelle ein <div style="clear: both"></div> im Grunde überflüssig, wird nicht gebraucht (für was auch?).
Soll es aber unter den beiden gefloateten Elementen noch irgendwie weitergehen, soll dann in ein neues Block-Element gekapselter Inhalt kommen (z.B. <div>irgendwelcher Inhalt</div> oder <p>Textinhalt, ein Textabsatz</p>), der von dem Floating nicht betroffen sein soll und der deshalb unbedingt und ganz normal unter den beiden gefloateten Elemente platziert werden soll, der sich also wieder normal verhalten soll wie ein ganz gewöhnliches Standard-Blocklevel-Element, dann frage ich Dich:

Warum gibst Du nicht genau diesem, unmittelbar auf die beiden gefloateten Elemente folgenden Block-Element, welches den von Dir gewünschten und nachzufolgenden Text beinhalten soll und welcher auf jeden Fall wie gewohnt unter Deinen beiden gefloateten Elementen plaziert werden soll, nicht genau das von Dir schon angedachte clear: both mit? Ohne ein extra zwischengeschobenes und ansonsten funkionsloses Clearing-Div?

also:

Codebeispiel HTML 4.01:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
a#start {
float: left;
}

a#kontakt {
float: right;
}

p#inhalt {
clear: both;    
}
</style>
<title>Floating-Test, HTML 4.01-Variante</title>
</head>
<body>
<p><a id="start" href="#">Startseite</a>
<a id="kontakt" href="#">Kontakt</a></p>
<p id="inhalt">
Ea usus futurum quam commodo aliquam. Aliquam te mazim qui congue minim.
Amet nulla id velit gothica legentis. Diam eodem ut magna nulla putamus.
Ex saepius nobis sit nunc mazim. 
</p>
</body>
</html>

Codebeispiel HTML5:
<!DOCTYPE html>
<html lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
a#start {
float: left;
}

a#kontakt {
float: right;
}

p#inhalt {
clear: both;    
}
</style>
<title>Floating-Test HTML5-Variante</title>
</head>
<body>
<a id="start" href="#">Startseite</a>
<a id="kontakt" href="#">Kontakt</a>
<p id="inhalt">
Ea usus futurum quam commodo aliquam. Aliquam te mazim qui congue minim.
Amet nulla id velit gothica legentis. Diam eodem ut magna nulla putamus.
Ex saepius nobis sit nunc mazim. 
</p>
</body>
</html>

Ich habe hier absichtlich noch ein Code-Beispiel in HTML5 gebracht, weil es unter HTML5 möglich und valide ist, die beiden Inline-Elemente <a> direkt im <body> zu platzieren ohne umschließendes Blocklevel-Element (<p>, <div>,<h1>…<h6>, <pre> oder <address>), während hingegen HTML 4.01 eine solche unmittelbare Platzierung eines Inline-Elements direkt im <body>-Elements nicht erlaubt und ein umschließendes Blocklevel-Element (<p>, <div>,<h1>...<h6>, <pre> oder <address>) zwingend erforderlich macht, damit das Dokument valide ist.
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.