2012-06-26 7 views
8

Ho preso una pagina il cui DTD era HTML4 Transitional e ho modificato il doctype in <!DOCTYPE html> e uno spazio extra è apparso tra h1 e div al di sotto di esso. Non ho apportato ALTRE modifiche al markup o ai CSS.HTML5 vs HTML4 - tag h1 reso con spazio extra - come rimuovere?

Esempio JSFiddle: http://jsfiddle.net/ngordon/vSqkg/3/.

Se si modifica il doctype da HTML5 a HTML4 Transitional, è possibile visualizzare lo spazio extra visualizzato e scomparire anche se il markup e il CSS sono esattamente gli stessi.

Qualche idea su come liberarsi di quello spazio?

risposta

11

Il doctype HTML 4.01 Transitional provoca modalità quasi standard nei browser. Il doctype HTML5 causa la modalità Standard.

Questo articolo Microsoft spiega la differenza: http://msdn.microsoft.com/en-us/library/ff405794%28v=vs.85%29.

Si dice che per la modalità Almost Standards:

elementi in linea contribuiscono alla linea di altezza se e solo se uno dei seguenti è vera.

Se l'elemento:

  • Contiene caratteri di testo

  • Ha larghezza di un confine diverso da zero

  • ha un margine diverso da zero

  • Ha un'imbottitura diversa da zero

  • Ha un'immagine di sfondo

  • Ha vertical-align impostato su un valore diverso al basale

Nota che un'interruzione di riga non è considerato un carattere di testo per questa definizione meno che non sia l'unico contenuto del una casella di riga. In tal caso, l'altezza del riquadro di riga rimane la parte superiore superiore della scatola in linea e la casella in basso più in basso della linea sulla linea, indipendentemente dall'altezza della linea specificata da .

Se un elemento img è l'unico contenuto di una cella di tabella, la casella di riga altezza dell'altezza del riquadro di riga della cella viene regolata su zero.

La maggior parte critica nel tuo caso, vuol dire che il calcolo della altezza della linea che contiene l'immagine non include il strut, un elemento in linea immaginaria che dovrebbe aumentare l'altezza della linea al valore di line-height l'elemento h1.

Questo jsfiddle mostra un vero e proprio elemento span con una &nbsp; come il contenuto del testo vero e proprio in piedi per il montante, e si può vedere che il layout è lo stesso sia con un HTML 4.01 doctype di transizione e un DOCTYPE HTML5.

Questa jsfiddle mostra la stessa idea, solo che questa volta il puntone è fabbricato utilizzando i CSS, in questo modo:

h1:before { 
    content: '\A0'; 
} 

Nel caso di risposta di Khurram, quello che sta facendo è la riduzione del line-height del h1 e quindi, in modalità standard, l'altezza del montante deve essere inferiore all'altezza dell'immagine. Ciò significa che l'altezza della linea nel suo complesso è determinata dall'altezza dell'immagine, non dall'altezza del montante. L'altezza dell'immagine è la stessa sia per gli standard che per la modalità quasi standard, quindi, di nuovo, non si vede una differenza nel rendering tra le modalità.

Per quanto riguarda il motivo per cui l'altezza della linea dello h1 corrisponde all'altezza dell'immagine (25px) non funziona, ma impostarla su 12px, poiché il puntone stabilisce non solo una parte superiore e una parte inferiore, ma anche una linea di base per la linea. La linea di base è un po 'sopra il fondo per consentire discendenti di testo, per il testo di dimensioni normali che di solito è di circa 3px. L'immagine di default si trova sulla linea di base in modo che lo spazio tra la linea di base e il fondo sia aggiunto all'altezza dell'immagine per stabilire l'altezza della linea.

Questo problema può essere risolto spostando l'immagine dalla linea di base, utilizzando img { vertical-align: top }, che è mostrato in questo jsfiddle.Se armeggiate con l'altezza della linea h1 qui, vedrete che i valori superiori a 25px aumentano la spaziatura tra le linee, ma i valori di 25px o meno non cambiano tale spaziatura.

+2

Ottima risposta, ben studiata, e affronta la radice del problema. – ForOhFor

+0

L'ho risolto impostando il css dell'immagine su "display: block;" ... tuttavia in altri contesti potrebbe non essere possibile. – KnF

3

Hai applicato un ripristino CSS http://meyerweb.com/eric/tools/css/reset/ al tuo css prima di iniziare ad applicare altri effetti css?

+0

+1 per il tuo amico. –

+0

anche con i CSS resettati il ​​fermo immagine "problema". – KnF

2

basta dare il line-height:12px; o quello che vuoi.
GUARDA:JSFIDDLE. modifica del tuo codice.

+0

Grazie! Funziona .. ma in realtà sta solo ingannando il browser. Questo elemento è decisamente più alto di 12px. Mi chiedo perché questo spazio appaia in primo luogo e se c'è un modo migliore per rimuoverlo. – ForOhFor

3

L'errore riguarda l'altezza della riga predefinita.

La transizione HTML4 ignora il contenuto della tua altezza della linea H1, producendo un elemento di altezza 25px. L'HTML5 sta rispettando l'altezza della linea del tag H1, che equivale a 29px.

+0

Tuttavia, la specifica esplicita di un'altezza di riga di 25 px non funziona. (Funziona quando lo si cambia in 12px, ma sembra più un trucco). Perché? – ForOhFor

0

Questo è il motivo per cui l'HTML5 Boilerplate ha un reset CSS.

È anche possibile impostare il div su un margin: 0; padding: 0; ma si dovrà fare per ogni elemento fino a quando non li si colpisce tutti. La risposta riguardo al reset CSS di Meyer in questa discussione è corretta.

Ecco un esempio di soluzione: http://jsfiddle.net/mikelegacy/vSqkg/5/