CSS per interrompere il ritorno a capo del testo sotto l'immagine


87

Ho il seguente markup:

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <span>Text, text and more text</span>
</li>

Lo voglio in modo che, se il testo va a capo, non vada nella "colonna" dell'immagine. So di poterlo fare con un table(cosa che stavo facendo) ma non è possibile per questo motivo .

Ho provato quanto segue senza successo:

li span {width: 100px; margin-left: 20px}
.fav_star {width: 20px}

Ho anche provato float: right.

Grazie.

EDIT: voglio che assomigli a questo:

IMG   Text starts here and keeps going... and
      wrap starts here.

Non così:

IMG   Text starts here and keeps going... and 
wrap starts in the space left for the image.

1
puoi mettere il tuo codice in jsfiddle?
Hardik

Penso che tu debba essere un po 'più chiaro sulle tue intenzioni qui. Se non si desidera che il testo per avvolgere allora si può semplicemente utilizzare white-space: nowrap;in li span {...}, ma ho l'impressione che si sta cercando di fare qualcosa di diverso
My Head Hurts

@MyHeadHurts Apologies - mi è sembrato chiaro :) Voglio due colonne nella riga. Il 20px sinistro è per un'immagine. Il resto è per il testo. Se il testo va a capo, voglio che inizi la seconda riga del ritorno a capo 20px da sinistra (sotto dove inizia il testo iniziale).
Nick

1
Per i passanti, non è necessario occuparsi delle larghezze come suggerisce la risposta accettata. È molto più semplice: crea quello che viene chiamato un nuovo contesto di formattazione . Vedi la risposta di Joe Conlin. Per ulteriori informazioni, vedere il mio.
hqcasanova

1
@hqcasanova Per la cronaca, la risposta di Dan è stata accettata 9 mesi prima che Joe pubblicasse la sua e 16 mesi prima della tua. Non accetterò la risposta di Dan, anche se grazie per l'aggiunta di alternative.
Nick

Risposte:


35

Poiché questa domanda sta guadagnando molte visualizzazioni e questa era la risposta accettata, ho sentito il bisogno di aggiungere la seguente dichiarazione di non responsabilità:

Questa risposta era specifica alla domanda del PO (che aveva la larghezza impostata negli esempi). Mentre funziona, richiede di avere una larghezza su ciascuno degli elementi, l'immagine e il paragrafo. A meno che questo non sia il tuo requisito, ti consiglio di utilizzare la soluzione di Joe Conlin che viene pubblicata come un'altra risposta a questa domanda.

L' spanelemento è un elemento in linea, non puoi modificarne la larghezza in CSS.

Puoi aggiungere il seguente CSS al tuo span in modo da poter cambiare la sua larghezza.

display: block;

Un altro modo, che di solito ha più senso, è usare un <p>elemento come genitore per il tuo <span>.

<li id="CN2787">
  <img class="fav_star" src="images/fav.png">
  <p>
     <span>Text, text and more text</span>
  </p>
</li>

Poiché <p>è un blockelemento, puoi impostarne la larghezza utilizzando i CSS, senza dover modificare nulla.

Ma in entrambi i casi, poiché ora hai un elemento blocco, dovrai far fluttuare l'immagine in modo che il tuo testo non vada tutto sotto l'immagine.

li p{width: 100px; margin-left: 20px}
.fav_star {width: 20px;float:left}

PS Invece di float:leftsull'immagine, si può anche mettere float:rightsu li p, ma in tal caso, si dovrà anche text-align:leftriallineare il testo in modo corretto.

PSS Se sei andato avanti con la prima soluzione di non aggiungere un <p>elemento, il tuo CSS dovrebbe essere così:

li span{width: 100px; margin-left: 20px;display:block}
.fav_star {width: 20px;float:left}

Questo è davvero utile. Ho cambiato il spanin un pelemento. Poi basta questi due sembravano fare il trucco: li p {margin-left: 40px} .fav_star {float: left}. La larghezza dell'immagine è impostata dall'immagine stessa, l' pelemento è automaticamente a blocke ho lasciato solo la larghezza. Grazie per questo.
Nick

2
Se hai intenzione di usarlo display:block, potresti anche usare un divpoiché è quello che serve (o usare un pcome suggerisci anche tu). Non è necessario avvolgere due volte il testo: se usi un p, puoi perdere il span.
Gareth

IMO, non dovresti usare HTML per cambiare il design delle tue pagine. Questo è il lavoro per CSS (ci sono eccezioni ovviamente, specialmente quando è necessaria la compatibilità cross-browser). Credo che l'utilizzo di un HTML appropriato e una "buona semantica" sia più importante. Quindi non userei a div, in questo caso, a pha più senso. Perdere spanè un po 'banale per me e dipende da come imposti i tuoi contenuti.
Dan

Avvolgere un <span>in un <p>è stregoneria uscito da Hogwartz! Funziona magnificamente!
Janus

252

Risposta molto semplice per questo problema che sembra catturare molte persone:

<img src="url-to-image">
<p>Nullam id dolor id nibh ultricies vehicula ut id elit.</p>

    img {
        float: left;
    }
    p {
        overflow: hidden;
    }

Vedi esempio: http://jsfiddle.net/vandigroup/upKGe/132/


11
Questa è la risposta giusta a questa domanda. Questa tecnica non richiede di impostare una larghezza fissa per il paragrafo. Soluzione molto più semplice e facile. Funziona perfettamente, anche in IE8.
cioccolata

4
Ebbene, in effetti questo non funzionerà se l'elemento contenente il testo fosse a span(il caso dell'OP). A display: blocksarebbe necessario per il span. Ma, salvo questo, sono d'accordo che sia una soluzione molto più elegante. Nel caso qualcuno si chieda quale sia la magia dietro overflow: hidden, vedere la mia risposta di seguito.
hqcasanova

7
Non è il comportamento che mi aspetterei, ma è fantastico.
Gavin

2
Per la cronaca, questa risposta è arrivata 8 mesi dopo quella che ho spuntato :)
Nick

2
Wow. Ha funzionato perfettamente. Non posso credere di non averlo mai saputo prima.
SFlagg

25

Per coloro che desiderano alcune informazioni di base, ecco un breve articolo che spiega perché overflow: hiddenfunziona. Ha a che fare con il cosiddetto contesto di formattazione del blocco . Questo fa parte delle specifiche del W3C (cioè non è un hack) ed è fondamentalmente la regione occupata da un elemento con un flusso di tipo blocco.

Ogni volta che viene applicato, overflow: hiddencrea un nuovo contesto di formattazione del blocco. Ma non è l'unica proprietà in grado di innescare quel comportamento. Citando una presentazione di Fiona Chan del Sydney Web Apps Group:

  • float: sinistra / destra
  • overflow: nascosto / automatico / scorrimento
  • display: tabella-cella e qualsiasi valore correlato alla tabella / blocco in linea
  • posizione: assoluta / fissa

1
Puoi aggiungere alcuni dettagli di quell'articolo nella tua risposta, nel caso in cui il collegamento non funzioni?

Buongiorno Australia! Grazie per il commento.
hqcasanova

Questo è eccellente per visualizzare blocchi di codice che potrebbero dover fare i conti con immagini o barre laterali mobili nelle vicinanze.
AlexMA

La tecnica descritta originariamente funziona bene, anche se come altri hanno detto, non è un comportamento che mi aspetterei. Tuttavia, non vedo che float o inline-block funzionano senza overflow, e ovviamente i valori di visualizzazione relativi alla tabella e la posizione assoluta o fissa hanno altre conseguenze sul layout che possono o non possono essere accettabili nel contesto.
enigment

3

Se si desidera che il margin-leftlavorare su un spanelemento è necessario per renderlo display: inline-blocko display:blockpure.


Probabilmente serve anche vertical-align: top;l'immagine con questo.
ThinkingStiff

2

l'impostazione display:flexper il testo ha funzionato per me.


Questo sembra essere un equivalente più moderno dell'ambientazione overflow:auto. Sono sicuro che non funziona esattamente allo stesso modo in tutte le situazioni, ma ha funzionato anche per me.
Matt Browne

1

Avvolgi un div attorno all'immagine e all'intervallo e aggiungi quanto segue al CSS in questo modo:

HTML

        <li id="CN2787">
          <div><img class="fav_star" src="images/fav.png"></div>
          <div><span>Text, text and more text</span></div>
        </li>

CSS

            #CN2787 > div { 
                display: inline-block;
                vertical-align: top;
            }

            #CN2787 > div:first-of-type {
                width: 35%;
            }

            #CN2787 > div:last-of-type {
                width: 65%;
            }

DI MENO

        #CN2787 {
            > div { 
                display: inline-block;
                vertical-align: top;
            }

            > div:first-of-type {
                width: 35%;
            }
            > div:last-of-type {
                width: 65%;
            }
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.