2010-09-21 7 views
15

Ho un'intestazione H3 che mi piacerebbe avere uno stile con un particolare colore di sfondo, ma senza che lo sfondo dell'elemento occupi tutta la larghezza dell'elemento genitore. Visto che H3 è di default un elemento di blocco, il mio stile sarebbe necessario modificare l'elemento ad un elemento inline-block, o solo un elemento in linea in linea in questo modo:In CSS, qual è un modo migliore di forzare un'interruzione di riga dopo un elemento piuttosto che renderla un elemento di blocco?

h3 { 
    background-color: #333; 
    color: white; 
    display: inline-block; 
} 

Questo funziona bene, ma solo se è immediatamente seguito da un elemento di blocco. Non voglio cambiare il markup solo per soddisfare questo stile, quindi mi chiedevo se c'è un modo per far sì che qualsiasi elemento adiacente, indipendentemente da come viene visualizzato, inizi sulla riga successiva?

Suppongo di poter utilizzare CSS3.

+1

In ogni caso, perché "qual è il modo migliore ... di renderlo un elemento di blocco"? Cosa non va bene nel renderlo un elemento di blocco? –

+1

@Litso - Ho spiegato questo nella mia domanda. Un elemento di blocco occupa tutta la larghezza dell'elemento genitore, il che farebbe rovinare lo stile che sto cercando. –

+0

prova 'padding-bottom: 15px; display: table; ' – KingRider

risposta

12

provare questo:.

h3:after { 
    content: "."; 
    display: block; 
    height: 0; 
    clear: both; 
    visibility: hidden; 
} 
+0

+1 per l'inventiva, ma non funziona per me in Chrome –

+0

': after' ha un supporto molto irregolare – fredley

+1

In realtà penso che questo genere di cose sia abbastanza comune, in particolare con il clearing. Funziona per me in Chrome. @ Litso: sei sicuro di averlo fatto bene? –

2
display:block; 
width:auto; 

Questo renderà la larghezza il più piccola possibile (non riempie l'intero elemento padre) e farà apparire altri elementi sotto.

+1

* Oltre a renderlo un elemento di blocco. Almeno leggi il titolo. – AlexanderMP

+0

Scusa, ho letto 'senza' come 'con', il mio male. Ho aggiornato la risposta, continuo a pensare che 'block' è il modo corretto per farlo. – fredley

+3

In realtà, questo è ciò che è stato chiesto. L'OP voleva qualcosa che funzionasse nel layout come un elemento di blocco (vive da solo in verticale) ma limita l'area di sfondo alla larghezza del contenuto. La domanda chiedeva una soluzione "no block" perché l'OP non sapeva che un elemento di blocco poteva agire in quel modo. –

2

Quante volte succede che l'elemento dopo lo <h3> è un elemento in linea? (Di solito dopo un'intestazione ci dovrebbe essere come un <p>, <ul> o altri elementi di blocco, anche se questo dipende totalmente dall'Html. È prevedibile? È un'opzione per trasformare semplicemente ogni elemento che segue direttamente un <h3> in un elemento di blocco?

h3 ~ * { display: block }

l'unico altro modo che conosco per avere un blocco-elemento non prende tutto lo spazio è fluttuante, ma questo lascia un altro problema

+0

L'elemento dopo l'H3 potrebbe facilmente essere un elemento inline-block, oppure potrebbe essere flottato a sinistra, che lo posizionerebbe sulla stessa linea dell'H3. Inoltre, forzando l'elemento adiacente a essere un elemento di blocco, si sta annullando il modo in cui interagisce con i propri fratelli successivi, il che potrebbe avere conseguenze non intenzionali. –

0

Ho dovuto fare qualcosa di simile con gli oggetti nav in linea che devono essere spezzati in determinati punti. funziona?

h3:after { 
    content: "\A "; 
    line-height: 0; 
    white-space: pre; 
    display:inline-block; 
} 

Mi sembra di ricordare che IE7 ha riscontrato un problema.

+0

\ A esiste un bug altro browser, prova \ 00000a ;-) ... non è necessario inline-block e line-height, basta bloccare – KingRider

0

Se non è necessario centrare H3, questo può aiutare:

h3 { 
    background-color: #333; 
    color: white; 
    display: inline-block; 
    float: left; 
    clear: left; 
} 
1

mi imbatto in questo tutto il tempo nel mio codice, di solito per div che sono inline-block'ed. Il modo migliore che ho visto è quello di forzare una nuova riga è quello di avvolgere il codice in un div aggiuntivo. Il tuo html originale ottiene la formattazione che ti aspetti e il wrapper div costringe una nuova riga.

assumendo questo è il vostro h3 styling,

h3 { 
    display: inline-block; 
} 

Poi basta avvolgerlo in un div.

<div> 
    <h3>My heading</h3> 
</div> 
Problemi correlati