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.