2009-04-14 9 views
39

So che è sbagliato inserire un elemento di blocco all'interno di un elemento in linea, ma che dire dei seguenti?È sbagliato modificare un elemento di blocco in linea con CSS se contiene un altro elemento di blocco?

Immaginate questo markup valido:

<div><p>This is a paragraph</p></div> 

Ora aggiungere questo CSS:

div { 
    display:inline; 
} 

questo modo si crea una situazione in cui un elemento in linea contiene un elemento di blocco (Il div diventa in linea e il p è blocco per impostazione predefinita)

Gli elementi della pagina sono ancora validi?

Come e quando giudichiamo se l'HTML è valido, prima o dopo l'applicazione delle regole CSS?

UPDATE: Da allora ho imparato che in HTML5 è perfettamente valida per mettere gli elementi a livello di blocco all'interno di link tag ad esempio:

<a href="#"> 
     <h1>Heading</h1> 
     <p>Paragraph.</p> 
</a> 

Questo è in realtà molto utile se si desidera un grande blocco di HTML essere un collegamento

+2

Sono contento che html5 consideri questo codice valido, ma valido non è la fine di tutto il web. The Googles utilizza un codice che sembra zuppa di tag orribilmente rotta, ma funziona. – JKirchartz

risposta

22

Dal CSS 2.1 Spec:

Quando una scatola in linea che contiene un quadro a livello di blocco nel flusso, la casella di linea (ei suoi antenati linea all'interno della stessa casella riga) sono rotti intorno alla scatola di blocco (e tutti i fratelli a livello di blocco che sono consecutivi o separati solo da spazi bianchi e/o elementi fuori flusso comprimibili), suddividendo la casella in linea in due caselle (anche se entrambi i lati sono vuoti), uno su ciascun lato del blocco -level box (es). Le caselle di riga prima dell'interruzione e dopo l'interruzione sono racchiuse in riquadri di blocco anonimi e la casella a livello di blocco diventa un fratello di quelle caselle anonime. Quando una tale casella in riga è influenzata dal posizionamento relativo, qualsiasi traslazione risultante influisce anche sulla casella a livello di blocco contenuta nella casella in linea.

Questo modello si applicherebbe nel seguente esempio se le seguenti regole:

p { display: inline } 
span { display: block } 

sono stati utilizzati in questo documento HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<HEAD> 
    <TITLE>Anonymous text interrupted by a block</TITLE> 
</HEAD> 
    <BODY> 
    <P> 
     This is anonymous text before the SPAN. 
     <SPAN>This is the content of SPAN.</SPAN> 
     This is anonymous text after the SPAN. 
    </P> 
    </BODY> 

L'elemento P contiene un pezzo (C1) di testo anonimo seguito da un elemento a livello di blocco seguito da un altro blocco (C2) di testo anonimo. Le caselle risultanti sarebbero una casella di blocco che rappresenta il BODY, contenente una casella di blocco anonimo attorno a C1, la casella di blocco SPAN e un'altra casella di blocco anonimo attorno a C2.

Le proprietà delle caselle anonime vengono ereditate dalla casella non anonima che racchiude (ad esempio, nell'esempio appena sotto l'intestazione di sottotitolo "Caselle di blocco anonime", quella per DIV). Le proprietà non ereditate hanno il loro valore iniziale. Ad esempio, il carattere della casella anonima viene ereditato dal DIV, ma i margini saranno 0.

Le proprietà impostate su elementi che causano la generazione di block box anonimi si applicano ancora alle caselle e al contenuto di tale elemento. Ad esempio, se un bordo è stato impostato sull'elemento P nell'esempio precedente, il bordo verrà disegnato attorno a C1 (aperto alla fine della riga) e C2 (aperto all'inizio della riga).

Alcuni agenti utente hanno implementato i bordi su inline contenenti blocchi in altri modi, ad esempio, avvolgendo tali blocchi nidificati all'interno di "caselle di riga anonime" e quindi disegnando bordi in linea attorno a tali riquadri. Dato che CSS1 e CSS2 non hanno definito questo comportamento, gli agenti utente solo CSS1 e CSS2 possono implementare questo modello alternativo e rivendicare comunque la conformità a questa parte del CSS 2.1. Questo non si applica agli UA sviluppati dopo che questa specifica è stata rilasciata.

Fai quello che vuoi. Chiaramente il comportamento è specificato nei CSS, anche se non è chiaro se copra tutti i casi o sia implementato in modo coerente nei browser di oggi.

+0

Solo per chiarimenti, mi sembra che non sia sbagliato, ma fa parte delle specifiche CSS che puoi ". Richiede lavoro extra sul browser per creare blocchi anonimi. Inoltre non è coerente tra i browser web. – Chad

0

Non so in cima alla mia testa se questo convalida qualsiasi regola, ma mi consiglia di utilizzare il W3C HTML Validator e il W3C CSS Validator per determinare quello. Spero che questo sia utile!

-1

Penso che (x) html sia valido, css sia valido. Il risultato è valido? Sì, se sta cercando nel browser come vuoi.

+0

Il problema con l'utilizzo dei browser per convalidare il codice è che è necessario riconvalidare la pagina per ogni nuova versione di ogni browser su ogni sistema in cui si desidera che la pagina funzioni ... – Guffa

+0

Sì, questo è un problema reale, lo so. Il browser non è un validatore :) E penso che la domanda sulla validazione dei risultati HTML + CSS sia una questione di gusti. Fattore umano. –

15

Indipendentemente dal fatto che sia valido o meno, la struttura dell'elemento è errata. La ragione per cui non si inseriscono elementi di blocco all'interno di elementi inline è che il browser può rendere gli elementi in un modo facilmente prevedibile.

Anche se non infrange alcuna regola per HTML o CSS, continua a creare elementi che non possono essere resi come previsto. Il browser deve gestire gli elementi come se il codice HTML non fosse valido.

+3

quindi cosa fai, quando hai bisogno di un'intera riga in una tabella per essere cliccabile? – mgPePe

+2

@mgPePe: ci sono diverse opzioni. Puoi mettere un link in ogni cella della riga, puoi usare Javascript per catturare l'evento click sulla riga, oppure puoi usare qualcosa di diverso da una tabella. – Guffa

+0

Sì, JS è una buona soluzione. Quello che ho finito è stato avere un 'a' con nested' span display = "block" 'secondo questo esempio: http://www.jakpsatweb.cz/css/css-vertical-center-solution.html – mgPePe

2

L'HTML è convalidato indipendentemente dal CSS, quindi la pagina sarebbe ancora valida. Sono abbastanza sicuro che anche le specifiche CSS non dicono nulla a riguardo, ma non citatemi su quello. Tuttavia, starei molto attento ad usare una tecnica come questa, poiché, mentre potrebbe funzionare come previsto in alcuni browser, è necessario testarli tutti, non vedo molte garanzie.

5

L'HTML e il CSS saranno comunque validi. Idealmente, non si dovrà fare qualcosa di simile, ma quel particolare po 'di CSS è in realtà un modo pratico (e sintatticamente valido, ma non semanticamente valido) per ottenere doppia bug margine di Internet Explorer senza ricorrere a fogli di stile condizionali o hack che invaliderà il tuo CSS. L'HTML (X) ha più valore semantico del CSS, quindi è meno importante che il CSS sia semanticamente valido. Nella mia mente, è accettabile perché risolve un fastidioso problema del browser senza invalidare il codice.

1

Sono gli elementi della pagina è ancora valida?

"Valido" in un senso HTML, sì; HTML non sa nulla di CSS.

Il rendering che si ottiene nel browser, tuttavia, è "non definito" dalle specifiche CSS, quindi potrebbe sembrare qualsiasi cosa. Sebbene tu possa includere tale regola negli hack CSS indirizzati a un particolare browser (dove sai come questo browser esegue il rendering di questo caso), non dovrebbe essere offerto ai browser in generale.

+1

e per chiedervi ... come si fa a fare clic su un'intera riga di un tavolo? – mgPePe

+0

@mgPePe: metti un link in ogni cella e lo metti a 'display: block' in modo che riempia la larghezza della cella. – bobince

+0

2 domande sorgono: posso avere ' [..more span]' e anche: posso quindi mettere 'vertical-align: middle' al blocco di span, sarebbe quello essere valido? – mgPePe

-1

No, non è una scelta sbagliata. Possiamo usare secondo i requisiti.

-1

Se c'è una logica che si segue e si finisce per implementarla in questo modo, NON è SBAGLIATO. Le cose da lavoro non sono "sbagliate" solo perché sono strane. Sì, è abbastanza inusuale ma aiuta e non è un errore. È intenzionale. HTML e CSS dovrebbero servirti, non viceversa, quindi non ascoltare mai commenti che ti dicono di non farlo solo perché è brutto.

È tipico chiamare una soluzione "non valida" e suggerire un lungo percorso attorno al blocco. A volte puoi ripensare a quello che hai fatto. Ma ci possono essere molte ragioni per quello che hai fatto e loro non le considerano.

Uso i blocchi all'interno di inline regolarmente. È valido e funziona - nella maggior parte dei casi non è necessario. E allora. Ricorda quando XHTML ci ha detto di mettere sempre le virgolette sulle proprietà (e tutti ti hanno urlato se non l'hai fatto!), Ora HTML5 permette di ometterle se non c'è spazio all'interno. Cosa è successo a quest'ultimo tag dopo tag singolari? "< br/>"? Dai. Gli standard cambiano. Ma i browser continuano a supportare anche le cose non standard. CENTRO è deprecato; siamo nel 2013 e funziona ancora. TABELLA per centraggio verticale? A volte è l'unico modo. DIV all'interno di A per farlo rimanere sospeso come pianificato? Basta andare avanti.

Concentrarsi su cose importanti.

Problemi correlati