È necessario scrivere tag HEAD, BODY e HTML?

È necessario scrivere , e ?

Ad esempio, posso creare una pagina del genere:

   Page Title   
Some html

E Firebug separa correttamente la testa e il corpo: inserisci la descrizione dell'immagine qui

W3C Validation dice che è valido.

Ma raramente vedo questa pratica sul web.

C’è qualche ragione per scrivere questi tag?

Omettere i tag html , head e body è certamente consentito dalle specifiche HTML. Il motivo di fondo è che i browser hanno sempre cercato di essere coerenti con le pagine Web esistenti e le primissime versioni di HTML non definivano quegli elementi. Quando HTML 2.0 per prima cosa, è stato fatto in modo che i tag sarebbero stati desunti quando mancanti.

Trovo spesso utile omettere i tag durante la prototipazione e soprattutto quando si scrivono i casi di test in quanto contribuisce a mantenere il mark-up focalizzato sul test in questione. Il processo di inferenza dovrebbe creare gli elementi esattamente nel modo in cui vedete in Firebug, e i browser sono abbastanza coerenti nel farlo.

Ma…

IE ha almeno un bug noto in quest’area. Anche IE9 mostra questo. Supponiamo che il markup sia questo:

 < !DOCTYPE html> Test case 

Dovresti (e fare in altri browser) ottenere un DOM simile a questo:

 HTML HEAD TITLE BODY FORM action="#" INPUT name="var1" 

Ma in IE ottieni questo:

 HTML HEAD TITLE FORM action="#" BODY INPUT name="var1" BODY 

Guardalo per te.

Questo bug sembra limitato al tag di inizio form precede qualsiasi contenuto di testo e qualsiasi tag di avvio del body .

La Google Style Guide per HTML consiglia di omettere tutti i tag opzionali.
Ciò include , , ,

e

  • .

    https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags

    Per l’ottimizzazione della dimensione del file e scopi di analisi, considerare l’omissione di tag opzionali. La specifica HTML5 definisce quali tag possono essere omessi.

    (Questo approccio può richiedere un periodo di grazia per essere definito come una linea guida più ampia in quanto è significativamente diverso da ciò che gli sviluppatori web sono in genere insegnati. Per motivi di coerenza e semplicità è meglio omettere tutti i tag opzionali, non solo una selezione.)

      < !DOCTYPE html>   Spending money, spending bytes   

    Sic.

    < !DOCTYPE html> Saving money, saving bytes

    Qed.

    Contrariamente alla nota di @Liza Daly su HTML5, quella specifica è in realtà piuttosto specifica su quali tag possono essere omessi e quando (e le regole sono leggermente diverse da HTML 4.01, principalmente per chiarire dove elementi ambigui come commenti e spazi bianchi appartengono)

    Il riferimento pertinente è http://www.w3.org/TR/2011/WD-html5-20110525/syntax.html#optional-tags e dice:

    • Il tag di inizio di un elemento html può essere omesso se la prima cosa all’interno dell’elemento html non è un commento.

    • Un tag di fine di un elemento html può essere omesso se l’elemento html non è immediatamente seguito da un commento.

    • Il tag di inizio di un elemento head può essere omesso se l’elemento è vuoto o se la prima cosa all’interno dell’elemento head è un elemento.

    • Il tag di fine di un elemento di testa può essere omesso se l’elemento di testa non è immediatamente seguito da un carattere di spazio o un commento.

    • Il tag di inizio di un elemento di un corpo può essere omesso se l’elemento è vuoto, o se la prima cosa all’interno dell’elemento body non è un carattere di spazio o un commento, tranne se la prima cosa all’interno dell’elemento body è uno script o un elemento di stile.

    • Il tag di fine di un elemento del corpo può essere omesso se l’elemento del corpo non è immediatamente seguito da un commento.

    Quindi il tuo esempio è HTML5 valido, e sarebbe analizzato in questo modo, con i tag html, head e body nelle loro posizioni implicite:

     < !DOCTYPE html>  Page Title   
    Some html

    Si noti che il commento “questo script sarà in testa” è in realtà analizzato come parte del corpo, sebbene lo script stesso faccia parte della testa. Secondo le specifiche, se vuoi che sia diverso, i e non possono essere omessi. (Anche se i e possono ancora essere)

    È valido ometterli in HTML4:

     7.3 The HTML element start tag: optional, End tag: optional 7.4.1 The HEAD element start tag: optional, End tag: optional 

    http://www.w3.org/TR/html401/struct/global.html

    In HTML5, non ci sono elementi “richiesti” o “facoltativi” esattamente, poiché la syntax HTML5 è definita in modo più approssimativo. Ad esempio, title :

    L’elemento title è un child richiesto nella maggior parte delle situazioni, ma quando un protocollo di livello superiore fornisce informazioni sul titolo, ad esempio nella riga Oggetto di un’e-mail quando HTML viene usato come formato di creazione di e-mail, l’elemento title può essere omesso .

    http://www.w3.org/TR/html5/semantics.html#the-title-element-0

    Non è valido per ometterli in XHTML5 vero, anche se questo non è quasi mai usato (rispetto a XHTML-acting-like-HTML5).

    Tuttavia, da un punto di vista pratico, spesso si desidera che i browser vengano eseguiti in “modalità standard”, per la prevedibilità nel rendering di HTML e CSS. Fornire un DOCTYPE e un albero HTML più strutturato garantirà risultati cross-browser più prevedibili.

    È vero che le specifiche HTML consentono di omettere determinati tag in alcuni casi, ma generalmente non è saggio.

    Ha due effetti: rende le specifiche più complesse, il che a sua volta rende più difficile agli autori di browser scrivere le implementazioni corrette (come dimostrato da IE e sbagliare).

    Questo rende la probabilità di errori del browser in queste parti del massimo della specifica. Come autore di un sito web puoi evitare il problema includendo questi tag, quindi mentre le specifiche non dicono che devi farlo, ridurre le possibilità che le cose vadano storte, che è una buona pratica ingegneristica.

    Inoltre, l’ultima specifica HTML 5.1 WG attualmente dice (tenete a mente che è un work in progress e potrebbe ancora cambiare).

    Il tag di inizio di un elemento di un corpo può essere omesso se l’elemento è vuoto, o se la prima cosa all’interno dell’elemento body non è un carattere di spazio o un commento, eccetto se la prima cosa all’interno dell’elemento body è un meta, collegamento, script, stile o elemento del modello.

    http://www.w3.org/html/wg/drafts/html/master/sections.html#the-body-element

    Questo è un po ‘sottile. Puoi omettere corpo e testa e il browser dedurrà quindi dove questi elementi devono essere inseriti. Ciò comporta il rischio di non essere espliciti, il che potrebbe causare confusione.

    Così questo

      

    hello

    risulta nell'elemento di script come figlio dell'elemento body, ma questo

       

    risulterebbe nel tag script come figlio dell'elemento head.

    Potresti essere esplicito facendo questo

        

    e poi, qualunque cosa tu abbia per prima, lo script o l'h1, entrambi appariranno in modo prevedibile nell'elemento del corpo. Queste sono cose che sono facili da trascurare durante il refactoring e il debug del codice. (per esempio, hai JS che sta cercando il primo elemento script nel corpo - nel secondo frammento smetterebbe di funzionare).

    Come regola generale, essere espliciti riguardo alle cose è sempre meglio che lasciare le cose aperte all'interpretazione. A questo proposito XHTML è migliore perché ti costringe ad essere completamente esplicito sulla struttura degli elementi nel tuo codice, il che lo rende più semplice e quindi meno incline all'interpretazione errata.

    Quindi sì, puoi ometterli ed essere tecnicamente valido, ma generalmente non è saggio farlo.

    Firebug lo mostra correttamente perché il tuo browser aggiusta automaticamente il markup errato per te. Questo comportamento non è specificato da nessuna parte e può variare da browser a browser. Questi tag sono richiesti dal DOCTYPE che stai utilizzando e non devono essere omessi.

    L’ elemento html è l’elemento principale di ogni pagina html. Se guardi la descrizione di tutti gli altri elementi, dice dove un elemento può essere usato (e quasi tutti gli elementi richiedono testa o corpo).