Warum überlappen meine Aufzählungszeichen mit schwebenden Elementen schwebende Elemente?

166

Ich habe eine (XHTML Strict) Seite, auf der ich ein Bild neben regulären Textabschnitten schwebe. Alles geht gut, außer wenn eine Liste anstelle von Absätzen verwendet wird. Die Aufzählungszeichen der Liste überlappen das schwebende Bild.

Das Ändern des Randes der Liste oder der Listenelemente hilft nicht. Der Rand wird von der linken Seite berechnet, aber der Schwimmer drückt die Listenelemente nach rechts innerhalb der liselbst. Der Rand hilft also nur, wenn ich ihn breiter als das Bild mache.

Das Schweben der Liste neben dem Bild funktioniert auch, aber ich weiß nicht, wann sich die Liste neben einem Float befindet. Ich möchte nicht jede Liste in meinem Inhalt schweben lassen, nur um dies zu beheben. Wenn Sie nach links schweben, wird das Layout durcheinander gebracht, wenn ein Bild nach rechts statt nach links in der Liste verschoben wird.

Durch die Einstellung werden li { list-style-position: inside }die Aufzählungszeichen zusammen mit dem Inhalt verschoben, aber es wird auch veranlasst, dass Zeilen, die umbrochen werden, mit dem Aufzählungszeichen ausgerichtet werden, anstatt mit der obigen Zeile ausgerichtet zu werden.

Das Problem wird offensichtlich dadurch verursacht, dass die Kugel außerhalb der Box gerendert wird und der Schwimmer den Inhalt der Box nach rechts drückt (nicht die Box selbst). So gehen IE und FF mit der Situation um und soweit ich weiß, nicht falsch gemäß Spezifikation. Die Frage ist, wie kann ich das verhindern?

Kamiel Wanrooij
quelle

Antworten:

280

Ich habe eine Lösung für dieses Problem gefunden. Durch Anwenden von a ul { overflow: hidden; }auf wird ulsichergestellt, dass die Box selbst vom Schwimmer anstelle des Inhalts der Box beiseite geschoben wird.

Nur IE6 benötigt ul { zoom: 1; }in unseren bedingten Kommentaren ein, um sicherzustellen, dass das ulLayout vorhanden ist.

Kamiel Wanrooij
quelle
1
+1: Tolles CSS, ich habe wie ein Verrückter nach einer GUTEN VIELSEITIGEN Lösung gesucht und hier ist es auf SO. Der einzige kleine Nachteil ist, dass die Zoom-Eigenschaft CSS nicht validiert, aber ich habe getestet und auf IE7 ist IE8 nicht erforderlich, daher ist es wahrscheinlich nur für IE6.
Marco Demaio
14
Damit dies wirklich funktioniert, musste ich auch Folgendes anwenden: ul, ol {overflow: hidden; Polsterung links: 40px; Rand links: 0; } ol li, ul li {Listenstil-Position: außerhalb; links auffüllen: 0; } Dies erzwang ein konsistentes Rendern über alle Browser hinweg und zwang IE6, die Aufzählungszeichen anzuzeigen. Die Kugeln waren sonst versteckt. Die ul {zoom: 1; } war auch in den ie6-spezifischen Einstellungen noch erforderlich.
Mandrake
1
So lächerlich einfache Lösung für solch lächerliche BUG in MSIE.
SF.
10
Es ist keine perfekte Lösung. Wie Blazemonger Schlag erwähnt hat, fließt die Liste nicht um das schwebende Bild herum, wenn das Bild klein und die Liste sehr lang ist. Die Liste hat einen großen Rand von oben bis zum Ende, wenn das Bild sehr breit ist.
Yang
2
Nett! Ich kann jedoch nicht sehen, wie dies beim Lesen des W3C-Dokuments über Überlauf Sinn macht: w3schools.com/cssref/pr_pos_overflow.asp
MSC
66

Hinzufügen einer Verbesserung zu Glen E. Iveys Lösung :

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

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

Ich bevorzuge diese Technik, da sie funktioniert, wenn die Liste um das schwebende Bild herum fließen muss, während die overflow: hiddenTechnik dies nicht tut. Es ist jedoch auch notwendig, die zu ergänzen, um padding-right: 1emzu verhindern li, dass sie ihren Behälter überlaufen.

Blazemonger
quelle
Ich bevorzuge auch dieses Update, da das oberste meine Twitter Bootstrap-Dropdowns unterbrochen hat und ich ewig gebraucht habe, um herauszufinden, dass die oben genannte Methode der Schuldige war.
Ian Hoar
2
Danke dafür. Überlauf anwenden: versteckt; UL verhinderte, dass der Text in den einzelnen Werbebuchungen ordnungsgemäß um den schwebenden Block lief. Diese Lösung hat es geschafft!
Jsdalton
1
Ich bin auf ein kleines, aber kritisches Problem mit dieser Lösung gestoßen, und ich möchte eine Ergänzung zu Ihrer Verbesserung vorschlagen. Ich bin mir nicht sicher, warum, aber wenn Sie der Werbebuchung hinzufügen position: relative;, entsteht ein Stapelproblem mit dem schwebenden Inhalt. Ich habe festgestellt (in Chrome und Firefox), dass es schwierig ist, mit dem Mauszeiger über Links im schwebenden Inhalt zu klicken. Die Lösung für mich bestand darin position: relative; z-index: 1;, das schwebende Element zu erweitern, wodurch das Stapelproblem behoben zu werden schien.
jsdalton
7
Leider überlappen sich in IE 10 die Aufzählungszeichen mit dem schwebenden Element.
Munawwar
1
Während ul {overflow: hidden;}dieses Problem in allen Browsern behoben wurde, war die obige Lösung das einzige funktionierende Mittel gegen dieses Problem mit Prince XML , einem Konverter von XHTML + CSS3 in PDF.
Serge Stroobandt
36

Hier kommt die Eigenschaft "display" zur Geltung. Stellen Sie das folgende CSS ein, damit die Liste neben dem schwebenden Inhalt funktioniert.

Anzeige: Tabelle; arbeitet neben schwebenden Inhalten (füllt die Lücke), ohne jedoch Inhalte dahinter zu verbergen. Ähnlich wie ein Tisch :-)

.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>

BEARBEITEN: Denken Sie daran, eine Klasse hinzuzufügen, um zu isolieren, für welche Listen Sie dies tun möchten. ZB "ul.in-content" oder allgemeiner ".content ul"

martinedwards
quelle
29

Versuchen Sie es mit list-style-position: inside , um das Layout der Aufzählungszeichen zu ändern.

Annakata
quelle
3
list-style-position:insideDies wäre eine großartige Lösung, führt jedoch dazu, dass Linien, die umbrochen werden, mit dem Aufzählungszeichen ausgerichtet werden, anstatt mit der obigen Linie ausgerichtet zu werden.
Marco Demaio
Überlauf versteckt; funktioniert nicht für mein linkes Float-Bild, sondern für die Position im Listenstil: innen hat es geschafft! danke
Menardmam
Dies war für mich die einzige Lösung, die noch Inhalte in IE verpackte. Vielen Dank!
Jordan314
Dies ist eine großartige Lösung, wenn Inhalte zwischen Ihren Aufzählungszeichen und dem Aufzählungszeicheninhalt schweben.
TylersSN
Dies sollte die gewählte Antwort sein.
Sleek Geek
18

Unter http://archivist.incutio.com/viewlist/css-discuss/106382 habe ich einen Vorschlag gefunden, der für mich funktioniert hat: Gestalten Sie die 'li'-Elemente mit:

position: relative;
left: 1em;

Wo Sie "1em" durch die Breite des linken Abstandes / Randes ersetzen, den Ihre Listenelemente hätten, wenn der Float nicht vorhanden wäre. Dies funktioniert in meiner Anwendung hervorragend, selbst wenn der untere Teil des Gleitkommas in der Mitte der Liste liegt - die Aufzählungszeichen werden wieder auf den (lokalen) linken Rand genau nach rechts verschoben.

Glen E. Ivey
quelle
2
Fantastische Lösung, funktioniert wie ein Zauber! Obwohl ich mir mit IE7 die Hände schmutzig machen musste, da es keine Listenelementnummern in Listen zeigte, die sich nicht neben einem schwebenden Element befanden.
Maryisdead
@ Maryisdead Was ist Ihre Lösung für IE7?
TJ.
IE7 benötigte einen zusätzlichen linken Rand für die Listenelemente. Sehen Sie sich diese Geige jsfiddle.net/maryisdead/wu6ew/5 an und beachten Sie die beiden IE7-Hacks. Es tut uns leid, dass Sie dies nicht früher hinzugefügt haben.
Maryisdead
18

Warum overflow: hidden funktioniert

Die Lösung ist so einfach wie:

ul {overflow: hidden;}

Ein overflow:anderes Blockfeld als erstellt visible einen neuen Blockformatierungskontext für seinen Inhalt. W3C-Empfehlung: http://www.w3.org/TR/CSS2/visuren.html#block-formatting

Beispiel

Die Schaltflächen auf meiner Website , die sich <li>verkleiden, sind wie folgt gestaltet. Verkleinern Sie das Ansichtsfenster (Fenster) Ihres Browsers, um den Einzug in Aktion zu sehen .

Meine Website als Beispiel

Verwandte Antworten

Artikel mit Beispielen

Serge Stroobandt
quelle
1
Vielen
17

Durch Hinzufügen overflow: auto;zu Ihremul Sie zumindest für mich Werken .

Aktualisieren

Ich habe meine jsfiddle aktualisiert, um zu visualisieren, was los ist. Wenn Sie das ulneben dem Floating haben img, wird der Inhalt des ulvom Float verschoben, nicht jedoch vom eigentlichen Container. Durch Hinzufügen overflow: autoder gesamten ulBox wird der Float anstelle nur des Inhalts verschoben.

Maehler
quelle
13

Sie könnten zuweisen position: relative; left: 10px;zu dem li. (Möglicherweise möchten Sie es zusätzlich mit einem versehen margin-right: 10px;, da es sonst auf der rechten Seite zu breit wird.)

Oder wenn Sie floatfür die ul- wie von anderen vorgeschlagen - verwenden möchten, können Sie wahrscheinlich verhindern, dass der Rest rechts von der Ul schwebt, indem Sie clear: leftdas Element verwenden, das der Ul folgt.

Chris Lercher
quelle
danke chris, diese position: relativ gearbeitet. Das Problem, das sich aus dem Löschen des Elements nach der ul ergeben würde, besteht darin, dass das Element auch das links schwebende div löschen würde.
SuperUntitled
7

Ich benutze dies, um dieses Problem zu lösen:

ul {
   display: table;
}
Das Leben ist kurz
quelle
7

Haftungsausschluss

Listen neben schwebenden Elementen verursachen Probleme. Meiner Meinung nach besteht der beste Weg, um diese Art von schwebenden Problemen zu vermeiden, darin, schwebende Bilder zu vermeiden, die sich mit Inhalten überschneiden. Dies ist auch hilfreich, wenn Sie Responsive Design unterstützen müssen.

Ein einfaches Design mit zentrierten Bildern zwischen Absätzen sieht sehr attraktiv aus und ist viel einfacher zu unterstützen als der Versuch, zu ausgefallen zu werden. Es ist auch einen Schritt von einem entfernt <figure>.

Aber ich möchte wirklich schwebende Bilder!

Ok, wenn Sie verrückt genug sind, um diesen Weg fortzusetzen, gibt es ein paar Techniken, die verwendet werden können.

Am einfachsten ist die Liste Gebrauch zu machen overflow: hiddenoder overflow: scrollso , dass die Liste im Wesentlichen eingeschrumpft , welche auf die Polsterung zurück zieht , wo es nützlich ist :

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>

Diese Technik hat jedoch einige Probleme. Wenn die Liste lang wird, wird sie nicht wirklich um das Bild gewickelt, was den gesamten Zweck der Verwendung floatauf dem Bild ziemlich zunichte macht.

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>

Aber ich möchte wirklich Listen einpacken!

Ok, wenn Sie noch verrückter und hartnäckiger sind und diesen Weg unbedingt fortsetzen müssen , gibt es eine andere Technik, mit der Sie die Listenelemente umschließen und Aufzählungszeichen verwalten können.

Anstatt das aufzufüllen <ul>und zu versuchen, es dazu zu bringen, sich gut mit Kugeln zu verhalten (was es anscheinend nie zu wollen scheint), nehmen Sie diese Kugeln vom <ul>und nehmen Sie sie dem <li>s. Kugeln sind gefährlich und die <ul>einfach nicht verantwortlich genug, um sie richtig zu handhaben.

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>

Dieses Umhüllungsverhalten kann bei komplexen Inhalten seltsame Dinge bewirken, daher empfehle ich nicht, es standardmäßig hinzuzufügen. Es ist viel einfacher, es als etwas einzurichten, für das man sich entscheiden kann, als als etwas, das überschrieben werden muss.

zzzzBov
quelle
Ich mag die zweite Option, aber der Text beginnt tatsächlich mit den Aufzählungspunkten auf längeren Texten (2 Zeilen) :-(
Arany
4

Versuchen Sie Folgendes auf Ihrem UL-Tag. Dies sollte sich um die Kugeln kümmern, die Ihr Bild überlagern, und Sie müssen Ihre durch verursachte Linksausrichtung nicht durcheinander bringen list-position: inside.

overflow: hidden; 
padding-left: 2em; 
Joe
quelle
Ich musste dies mit Blazemongers Lösung (# 2 oben) verwenden. BLazemonger allein funktionierte nicht in IE 9-11 und Opera. Damit funktioniert es in allen Browsern. Kamiels (# 1) Lösung funktionierte bei mir nicht, da sie meine Kugeln versteckte. Konflikt mit Bootstrap3 vielleicht.
Leraa
3

Ich habe selbst damit gekämpft. Das Beste, was ich geschafft habe, ist Folgendes:

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

Der Text ist nicht wirklich eingerückt, aber die Kugel zeigt.

Stephen
quelle
2

Bearbeitet, um basierend auf dem Kommentar von OP zu aktualisieren

ok, dann zerlege es einfach in 2 zusammen verschachtelte Divs

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>

Versuchen Sie, die ul li css auf zu ändern

ul {float: left; Hintergrund: blau; }}

ANC_Michael
quelle
danke, das funktioniert aber jetzt schweben die folgenden Absätze gegen die rechte Seite.
SuperUntitled
2

Nachdem ich in mehreren Projekten mit diesem interessanten Problem gekämpft und untersucht habe, warum es passiert, glaube ich endlich, dass ich beides gefunden habe: eine funktionierende und eine reaktionsschnelle Lösung.

Hier ist der Zaubertrick, Live-Beispiel: 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 */
}
Kaloyan Kosev
quelle
Ich fügte hinzu , display: flex;zu li, so dass die vertikal Bulletpoint zentriert ist, wenn ich die Schriftgröße des ändern :beforeTeil.
Arany
1

Bei der Arbeit in einem LMS ohne Zugriff auf den Dokumentenkopf war es einfacher, margin-right: 20pxeinen Inline-Stil für das Bild zu verwenden. Was ich dieser Seite schulde .

Lynda Williams
quelle
0

Versuche dies:

li{
    margin-left:5px;
}

Wenn Sie möchten, dass sie nach links gehen, geben Sie einfach einen - ## px-Wert ein.

Douglas
quelle
0

oder Sie könnten dies tun:

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

und dann entfernen Sie das gesamte Styling von der li

Reece
quelle
1
Das Schweben der ul löst zwar das Problem, es tritt jedoch ein anderes Problem auf ... Alle Absatzelemente, die nach der ul kommen, werden rechts von der ul schweben gelassen.
SuperUntitled
gab dir +1 dafür ... Ich ging hier davon aus, dass das <p> rechts von <ul> schweben würde, wenn ich mir den mit dieser Frage verbundenen Link anschaue. Guter Fang.
Reece
0

Wie wäre es damit?

ul{float:left; clear:right}
Adam Lynch
quelle
0
width: 300px;
height: 30px;
margin-left: auto;
right: 10px;

Rand-Links: Auto bewirkt, dass das Element selbst rechtsbündig ausgerichtet wird. Stellen Sie die Höhe und Breite des gewünschten Elements ein - in meinem Fall handelt es sich um ein Hintergrundbild in einem Div im Inneren

Nikolay Ivanov
quelle
0

Sie können auch versuchen, das ulnach links zu schweben und ein geeignetes zu definierenwidth zu , damit sie neben dem Bild schwebt.

So etwas wie diese Geige ?

Houdmont
quelle
0

Ich habe es mit behoben

div.class-name ul {
  clear: both;
}
Neal Garrett
quelle
0
width: auto; overflow: hidden;
evan toder
quelle
-1

Hinzufügen display:table; zu ul:

ul{display:table;}
evan toder
quelle