Perché i punti elenco della mia lista si sovrappongono agli elementi fluttuanti


166

Ho una pagina (XHTML Strict) in cui galleggio un'immagine accanto a normali paragrafi di testo. Tutto va bene, tranne quando viene utilizzato un elenco al posto dei paragrafi. I punti elenco dell'elenco si sovrappongono all'immagine fluttuante.

La modifica del margine dell'elenco o delle voci dell'elenco non aiuta. Il margine è calcolato sulla sinistra della pagina, ma il galleggiante spinge voci per destra all'interno della listessa. Quindi il margine aiuta solo se lo faccio più ampio dell'immagine.

Funziona anche l'elenco mobile accanto all'immagine, ma non so quando l'elenco si trova accanto a un float. Non voglio far galleggiare ogni elenco nei miei contenuti solo per risolvere questo problema. Inoltre, il movimento a sinistra altera il layout quando un'immagine viene spostata a destra anziché a sinistra dell'elenco.

L'impostazione li { list-style-position: inside }sposta i punti elenco insieme al contenuto, ma fa sì che le linee che si avvolgono inizino ad essere allineate con il punto elenco, anziché allineate con la linea sopra.

Il problema è ovviamente causato dal rendering del proiettile fuori dalla scatola, il galleggiante che spinge il contenuto della scatola verso destra (non la scatola stessa). Questo è il modo in cui IE e FF gestiscono la situazione e, per quanto ne so, non sbagliano secondo le specifiche. La domanda è: come posso prevenirla?

Risposte:


280

Ho trovato una soluzione a questo problema. Applicando un ul { overflow: hidden; }al si ulassicura che la scatola stessa sia spinta da parte dal float, invece del contenuto della scatola.

Solo IE6 ha bisogno di un ul { zoom: 1; }nei nostri commenti condizionali per assicurarsi che ulabbia layout.


1
+1: Grande CSS, ho cercato come un matto una buona versione VERSATILE ed eccolo su SO. L'unico piccolo inconveniente è che la proprietà zoom non convalida i CSS, ma ho testato e su IE7, IE8 non è necessario, quindi probabilmente è solo per IE6.
Marco Demaio,

14
Per far funzionare davvero questo ho dovuto applicare anche: ul, ol {overflow: hidden; imbottitura-sinistra: 40px; margine sinistro: 0; } ol li, ul li {list-style-position: outside; padding-left: 0; } Questo ha costretto il rendering coerente tra i browser e ha costretto IE6 a mostrare i punti elenco. I proiettili erano nascosti altrimenti. Ul {zoom: 1; } era ancora richiesto anche nelle impostazioni specifiche di ie6.
Mandrake

1
Soluzione così ridicolmente semplice per un BUG così ridicolo in MSIE.
SF.

10
Non è una soluzione perfetta. Come ha detto Blazemonger, se l'immagine è piccola e l'elenco è molto lungo, l'elenco non scorrerà attorno all'immagine fluttuante. L'elenco avrà un enorme margine dall'alto verso il basso se l'immagine è molto ampia.
yang,

2
Bello! Non riesco a vedere come questo abbia senso quando leggo il documento W3C su overflow: w3schools.com/cssref/pr_pos_overflow.asp
MSC

66

Aggiunta di un miglioramento alla soluzione di Glen E. Ivey :

ul {
    list-style: outside disc;
    margin-left: 1em;
}
ul li {
    position: relative;
    left: 1em;
    padding-right: 1em;    
}​

http://jsfiddle.net/mblase75/TJELt/

Preferisco questa tecnica, poiché funziona quando l'elenco deve fluire attorno all'immagine mobile, mentre la overflow: hiddentecnica no. Tuttavia, è anche necessario aggiungere padding-right: 1ema liper impedire loro di traboccare il loro contenitore.


Preferisco anche questa correzione poiché quella in alto ha rotto i miei drop down su Twitter Bootstrap e mi ci è voluto un sacco di tempo per capire che il metodo sopra era il colpevole.
Ian Hoar,

2
Grazie per questo. Applicazione di overflow: nascosto; al contenitore UL ha impedito che il testo nei singoli elementi pubblicitari scorresse correttamente attorno al blocco mobile. Questa soluzione ha funzionato!
jsdalton,

1
Ho riscontrato un problema minore ma critico con questa soluzione e vorrei suggerire un'aggiunta al tuo miglioramento. Non sono sicuro del perché, ma quando si aggiunge position: relative;all'elemento pubblicitario, si crea un problema di sovrapposizione con il contenuto mobile. Ho scoperto (in Chrome e Firefox) che era difficile passare il mouse e fare clic sui collegamenti nel contenuto mobile. La correzione per me era quella di aggiungere position: relative; z-index: 1;l'elemento mobile, che sembrava risolvere il problema di impilamento.
jsdalton,

7
Sfortunatamente, su IE 10, i proiettili si sovrappongono all'elemento flottante.
Munawwar,

1
Mentre ul {overflow: hidden;}risolto questo problema in tutti i browser, la soluzione sopra era l'unico rimedio funzionante per questo problema con Prince XML , un convertitore XHTML + CSS3 in PDF.
Serge Stroobandt,

36

Qui è dove la proprietà "display" diventa unica. Imposta il CSS di seguito per far funzionare l'elenco accanto al contenuto mobile.

display: tabella; funziona a fianco di contenuti fluttuanti (colmando il gap) ma senza nasconderli dietro. Proprio come fa un tavolo :-)

.img {
  float: left;
}

.table {
  display: table;
}
<img class="img" src="https://via.placeholder.com/350x350" alt="">
<ul>
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>
<ul class="table">
  <li>Test content</li>
  <li>Test content</li>
  <li>Test content</li>
</ul>

EDIT: Ricorda di aggiungere una classe per isolare per quali elenchi desideri farlo. Ad esempio "ul.in-content" o più in generale ".content ul"


29

Prova la posizione in stile elenco: dentro per cambiare il layout dei proiettili.


3
list-style-position:insidesarebbe un'ottima soluzione, ma fa sì che le linee che si avvolgono inizino allineate con il punto elenco, anziché allineate con la linea sopra.
Marco Demaio,

troppo pieno: nascosto; non funziona per la mia immagine float sinistra, ma lista-stile-posizione: dentro lo ha fatto! grazie
menardmam

Questa è stata l'unica soluzione che ha ancora racchiuso il contenuto in IE per me. Grazie!
jordan314

Questa è un'ottima soluzione per quando il contenuto fluttua tra i tuoi proiettili e il contenuto del proiettile.
TylersSN,

Questa dovrebbe essere la risposta scelta.
Sleek Geek,

18

A http://archivist.incutio.com/viewlist/css-discuss/106382 ho trovato un suggerimento che ha funzionato per me: modellare gli elementi 'li' con:

position: relative;
left: 1em;

Dove si sostituisce "1em" con la larghezza dell'imbottitura / margine sinistro che avrebbero gli elementi della lista se il float non fosse presente. Questo funziona alla grande nella mia applicazione, anche gestendo il caso in cui il fondo del float si trova nel mezzo degli elenchi: i proiettili si spostano di nuovo sul margine sinistro (locale) giusto.


2
Soluzione fantastica, funziona come un fascino! Anche se ho dovuto sporcarmi le mani con IE7 in quanto non riusciva a mostrare i numeri delle voci di elenco su liste che non erano accanto a un elemento mobile.
maryisdead,

@maryisdead Qual è la tua soluzione per IE7?
TJ.

IE7 aveva bisogno di un margine in più a sinistra sulle voci dell'elenco. Guarda questo violino jsfiddle.net/maryisdead/wu6ew/5 e prendi nota dei due hack di IE7. Ci scusiamo per non averlo aggiunto prima.
maryisdead,

18

Perché overflow: hiddenfunziona

La soluzione è semplice come:

ul {overflow: hidden;}

Una casella di blocco con overflow:diversa da quella visible stabilisce un nuovo contesto di formattazione del blocco per il suo contenuto. Raccomandazione del W3C: http://www.w3.org/TR/CSS2/visuren.html#block-formatting

Esempio

I pulsanti sul mio sito Web , che sono <li>mascherati, sono fatti in questo modo. Riduci la finestra (finestra) del browser per vedere il rientro in azione .

Il mio sito Web come esempio

Risposte correlate

Articolo con esempi


1
grazie per aver spiegato perché funziona (non è menzionato nella soluzione accettata)
schellmax,

17

Aggiungendo overflow: auto;ai tuoi ullavori almeno per me.

Aggiornare

Ho aggiornato il mio jsfiddle per visualizzare cosa sta succedendo. Quando si ha il ullato mobile img, il contenuto del messaggio ulverrà spinto dal float, ma non dal contenitore effettivo. Aggiungendo overflow: autol'intero ul-box verrà spinto dal float invece che solo dal contenuto.


13

È possibile assegnare position: relative; left: 10px;al li. (Potresti anche volergli dare un margin-right: 10px;, altrimenti potrebbe diventare troppo largo sul lato destro.)

Oppure, se si desidera utilizzare floatper ul- come suggerito da altri - probabilmente si può impedire al resto di fluttuare a destra dell'ul usando clear: leftsull'elemento che segue l'ul.


grazie chris, quella posizione: parente lavorato. il problema che sorgerebbe dalla cancellazione dell'elemento dopo l'ul è che l'elemento cancellerebbe anche il div flottante a sinistra.
superUntitled


7

disconoscimento

Gli elenchi accanto agli elementi mobili causano problemi. Secondo me, il modo migliore per prevenire questo tipo di problemi fluttuanti è evitare le immagini fluttuanti che si intersecano con il contenuto. Aiuterà anche quando devi supportare la progettazione reattiva.

Un design semplice con immagini centrate tra i paragrafi sembrerà molto attraente e sarà molto più facile da supportare che cercare di diventare troppo fantasioso. È anche ad un passo da a <figure>.

Ma voglio davvero immagini fluttuanti!

Ok, quindi se sei pazzo abbastanza persistente da continuare su questa strada, ci sono un paio di tecniche che possono essere usate.

Il più semplice è fare in modo che l'elenco venga utilizzato overflow: hiddeno in overflow: scrollmodo tale che l'elenco sia sostanzialmente ridotto, il che riporta il padding al punto in cui è utile:

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Questa tecnica presenta alcuni problemi. Se l'elenco si allunga, in realtà non avvolge l'immagine, il che praticamente vanifica l'intero scopo dell'utilizzo floatsull'immagine.

img {
  float: left;
}
.wrapping-list {
  overflow: hidden;
  padding-left: 40px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Ma voglio davvero elenchi di wrapping!

Ok, quindi se sei ancora più pazzo e più persistente e devi assolutamente continuare su questa strada, c'è un'altra tecnica che può essere utilizzata per avvolgere gli elementi dell'elenco e mantenere i punti elenco.

Invece di riempire <ul>e cercare di far sì che si comporti bene con i proiettili (cosa che non sembra mai voler fare), togli quei proiettili da <ul>e consegnali a quelli <li>. I proiettili sono pericolosi e il <ul>giusto non è abbastanza responsabile per gestirli correttamente.

img {
  float: left;
}
.wrapping-list {
  padding: 0;
  list-style-position: inside;
}
.wrapping-list li {
  overflow: hidden;
  padding-left: 25px;
}
<img src="http://placehold.it/100x100"/>
<ul class="wrapping-list">
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
  <li>lorem</li>
  <li>ipsum</li>
  <li>dolor</li>
  <li>sit</li>
  <li>amet</li>
</ul>

Questo comportamento a capo può fare cose strane a contenuti complessi, quindi non consiglio di aggiungerlo per impostazione predefinita. È molto più facile configurarlo come qualcosa su cui si può optare piuttosto che come qualcosa che deve essere ignorato.


Mi piace la seconda opzione, ma il testo inizia effettivamente con i punti elenco su testi più lunghi (2 righe) :-(
Arany,

4

Prova quanto segue sul tuo tag UL. Questo dovrebbe occuparsi dei proiettili che si sovrappongono all'immagine e non devi confondere l'allineamento sinistro causato da list-position: inside.

overflow: hidden; 
padding-left: 2em; 

Ho dovuto usare questo con la soluzione di Blazemonger (n. 2 sopra). Il BLazemonger da solo non ha funzionato in IE 9-11 e Opera. Con questo, funziona in tutti i browser. La soluzione di Kamiel (n. 1) non ha funzionato per me perché nascondeva i miei proiettili. Conflitto con Bootstrap3 forse.
Leraa,

3

Ho lottato con questo me stesso. Il migliore che ho gestito è il seguente:

ul {
    list-style-position: inside;
    padding-left: 1em;
    text-indent: -1em;
}

Il testo non è effettivamente rientrato ma il punto elenco mostra.


2

Modificato per l'aggiornamento in base al commento di OP

ok, quindi suddividilo in 2 div annidati insieme

ul  {background: blue; position:static;}
.therest {position:relative; width:100%}
.indent {float:left; }

<div class="therest">
<p>
Est tincidunt doming iis nobis nibh. Ullamcorper eorum elit lius me delenit. 
</p>
<hr />
<h3>Lorem</h3>
<div class="indent">
<ul>
<li>list element</li>
<li>list element</li>
<li>list element</li>
</ul> 
<div>
the rest now under the UL
</div>

prova a cambiare l'ul li css in

ul {float: left; sfondo: blu; }


grazie, funziona, tuttavia, ora i paragrafi seguenti fluttuano contro il lato destro.
superUntitled

2

Dopo aver combattuto con questo interessante problema in diversi progetti e aver indagato sul perché ciò accada, credo finalmente di aver trovato entrambi: una soluzione funzionante e "reattiva" .

Ecco il trucco magico, esempio dal vivo: http://jsfiddle.net/superKalo/phabbtnx/

ul {
    list-style: none;
    position: relative;
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    left: 35px;
}
li {
    padding-left: 0; /* remove any left padding */
    margin-left: 0; /* remove any left margin */
    text-indent: -19px; /* adjust as much as needed */
}
li:before {
    content: '•\00a0\00a0\00a0';
    color: #000; /* bonus: you can customize the bullet color */
}

Ho aggiunto display: flex;a li, in modo che il bulletpoint sia inserito verticalmente, quando cambio font-dimensioni della :beforeparte.
Arany,

1

Lavorando all'interno di un LMS senza accesso al responsabile del documento, è stato più facile scegliere margin-right: 20pxcome stile in linea per l'immagine. Che devo a questo sito .


0

prova questo:

li{
    margin-left:5px;
}

Se vuoi che vadano a sinistra, inserisci un valore - ## px.


0

o potresti farlo:

 #content ul {
        background:none repeat scroll 0 0 #AACCDD;
        float:left;
        margin-right:10px;
        padding:10px;

e quindi rimuovere tutto lo styling dal li


1
il galleggiamento dell'ul risolve davvero il problema, tuttavia, sorge un altro problema ... tutti gli elementi di paragrafo che vengono dopo l'ul vengono flottati alla destra dell'ul.
superUntitled

ti ho dato +1 per quello ... Stavo facendo un presupposto qui guardando il link associato a questa domanda che <p> sarebbe fluttuante a destra di <ul>. Buona pesca.
Reece,


0
width: 300px;
height: 30px;
margin-left: auto;
right: 10px;

margin-left: auto farà allineare l'elemento stesso. Imposta l'altezza e la larghezza dell'elemento che vuoi - nel mio è un'immagine di sfondo in un div all'interno


0

Potresti anche provare a spostare ula sinistra e definirne uno appropriato width, in modo che galleggi vicino all'immagine.

Qualcosa di simile a questo jsfiddle ?




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.