2013-04-16 45 views
14

Ich lese die following code on w3schools und verstehe nicht, wie die overflow Eigenschaft würde auswirken, ob Text rechts neben der ul oder nicht angezeigt wird.CSS-Überlauf: Versteckt mit Schwimmern

ul { 
 
    list-style-type: none; 
 
    margin: 0; 
 
    padding: 0; 
 
    overflow: hidden; 
 
} 
 

 
li { 
 
    float: left; 
 
} 
 

 
a { 
 
    display: block; 
 
    width: 60px; 
 
    background-color: #dddddd; 
 
    padding: 8px; 
 
}
<ul> 
 
    <li><a href="#home">Home</a></li> 
 
    <li><a href="#news">News</a></li> 
 
    <li><a href="#contact">Contact</a></li> 
 
    <li><a href="#about">About</a></li> 
 
</ul> 
 
<p><b>Note:</b> overflow:hidden is added to the ul element to prevent li elements from going outside of the list.</p>

Ich weiß, dass overflow:hidden Inhalt zu handhaben verwendet wird, die außerhalb der Box geht aber nicht verstehen, wie es in diesem Fall gilt.

Antwort

29

Ich versuche, die Verwirrung zu beenden:

ul ist ein Element auf Blockebene, wie auch das Element (sie erstrecken sich auf 100% der Elternbreite). Deshalb erscheint die p standardmäßig unter der ul, wenn für diese Elemente keine Breite oder Anzeige deklariert ist.

Jetzt in Ihrem Beispiel enthält die ul nur floated Elemente. Dadurch fällt es auf eine Höhe von 0px (Es hat immer noch 100% Breite, wie Sie in dem Beispiel sehen können). Die angrenzenden werden rechts neben den schwebenden li s angezeigt, da sie als normal floated Elemente betrachtet werden.

Jetzt overflow (jeder Wert außer visible) erklärt, wird eine neue block formatting context, die die ul enthält seine Kinder macht. Plötzlich erscheint die ul "wieder", nicht mehr Größe 0px. Die wird nach unten geschoben. Sie könnten auch position:absolute deklarieren, um den gleichen "Klärungseffekt" zu erzielen (mit dem Nebeneffekt, dass jetzt der ul aus dem normalen Elementfluss genommen wird - die s werden vom ul überlappt.

)

See the example fiddle

Wenn Sie in die technischen Sachen sind, zu vergleichen, die nach den Absätzen der CSS-Spezifikation:

§10.6.3 Block-level non-replaced elements in normal flow when 'overflow' computes to 'visible'
und
§10.6.7 'Auto' heights for block formatting context roots. (Danke an BoltClock für das Ausgraben der Links).

ul{ 
 
    list-style-type:none; 
 
    margin:0; padding:0; 
 
    background-color:#dddddd; 
 
    border:2px solid red; 
 
} 
 
li{ 
 
    float:left; 
 
} 
 
a{ 
 
    display:block; 
 
    width:60px; 
 
    background-color:#555; 
 
    color:white; 
 
} 
 
p{ 
 
    margin:0; 
 
    outline:2px dotted blue; 
 
} 
 
#two{ 
 
    clear:both; 
 
    overflow:hidden; 
 
}
No overflow: 
 
<ul> 
 
<li><a href="#home">Home</a></li> 
 
<li><a href="#news">News</a></li> 
 
<li><a href="#contact">Contact</a></li> 
 
<li><a href="#about">About</a></li> 
 
</ul> 
 
<p>Notice the collapsed ul - no background-color visible, collapsed border and this paragraph treats the lis as regular floats </p> 
 
<br> 
 
With overflow: hidden 
 
<ul id="two"> 
 
<li><a href="#home">Home</a></li> 
 
<li><a href="#news">News</a></li> 
 
<li><a href="#contact">Contact</a></li> 
 
<li><a href="#about">About</a></li> 
 
</ul> 
 
<p>the ul reappeared - it now contains the child li's - the float is cleared</p>

+8

+1 endlich eine noch bessere Antwort;) Beachten Sie, dass der Grund * warum * 'ul 'keine Höhe hat, wenn seine Kinder floating sind, weil die Elternhöhenberechnung Floats ignoriert, da sie nicht im normalen Fluss sind, wenn der Elternteil keine erstellt BFC für sie. Vergleichen Sie [§10.6.3 Nicht ersetzte Elemente auf Blockebene im normalen Ablauf, wenn 'Überlauf' zu 'sichtbar' berechnet wird (http://www.w3.org/TR/CSS21/visudet.html#normal-block) mit [§10.6.7 'Auto' Höhen für Block Formatierung Kontext Wurzeln] (http://www.w3.org/TR/CSS21/visudet.html#root-height) – BoltClock

+0

@BoltClock Excellent, suchte ich nach diesen Absätzen. Danke für das Teilen! Ich werde diese zur Antwort hinzufügen. – Christoph

-1

Anstelle der overflow:hidden;clear:both; für die <p> verwenden. hier wird es verwendet http://jsfiddle.net/Mvv8w/. Grundsätzlich wird overflow:hidden alles löschen, was beiseite ist, genauso wie clear:both; tut.

+0

Das ist nicht das gleiche ist. Werfen Sie einen Blick auf Ihr [modifiziertes Beispiel] (http://jsfiddle.net/Mvv8w/1/) – Christoph

+0

Ich habe nicht gesagt, sie waren die gleichen ?. Ich habe nur gesagt, dass es Elemente beiseite legen wird. Es gab also keine Notwendigkeit für die negative Bewertung. – Tyler

+0

1) Ich habe nicht downvote. 2) Wie Sie von der Geige, die ich gepostet habe, sehen können, wird der Überlauf in diesem Beispiel verwendet, um zu bewirken, dass das Elternelement die floattierten Kindelemente enthält. Ich lege Hintergrundfarbe auf die ul, um es klar zu machen: die zweite ul expandiert, um ihre floated Kinder zu enthalten, während die float in der ersten Liste ebenfalls gelöscht wird, aber die ul enthält kein floated child li und hat somit die Höhe 0 = no Hintergrundfarbe. – Christoph

-1

Aus diesem Grund w3schools für Web-Designer/Entwickler keine zuverlässige Quelle ist. Du hast recht, es ist ein schreckliches Beispiel.

Dies liegt nicht daran, dass das übergeordnete Element in diesem Beispiel kein fixed mit hat. Darüber hinaus ist es ein unbestelltes Listen-Tag, das sich unabhängig von der Größe seiner Kinder ausdehnt.

http://jsfiddle.net/EhphH/

CSS

.parent { 
    width: 150px; 
    height: 100px; 
    padding: 10px; 
    background: yellow; 
    overflow: hidden; 

} 
.child { 
    float: left; 
    width: 75px; 
    height: 120px; 
    margin: 10px; 
    background: blue; 

} 
.baby { 
    width: 200px; 
    height: 25px; 
    background: green; 
} 

Markup

<div class="parent"> 
    <div class="child"> 
     <div class="baby"> 
     </div> 
    </div> 
    <div class="child"> 
    </div> 
</div> 
+1

Aufhellen, bevor Sie einen Schlaganfall haben. Wütend ist keine Möglichkeit zu leben. – Plummer

+0

Hehe, ich bin überhaupt nicht wütend. Ich bin amüsiert, wie bestimmte Leute über ihre falsche Meinung sein können. Du solltest meine Beispielgeige genauer betrachten und einige Stunden darüber meditieren. – Christoph

+0

@tPlummer: "Aufhellen, bevor Sie einen Schlaganfall haben. Wütend ist keine Möglichkeit zu leben." [Sprechen] (http://stackoverflow.com/revisions/16041526/1) für [sich] (http://stackoverflow.com/revisions/16041526/2). Wie auch immer, weil jsFiddle den ganzen Nachmittag für mich unten war, gehe ich davon aus, dass das, was du hinzugefügt hast, der gleiche Code ist, der in deinem Link ist - obwohl deine Position dazu noch etwas zweifelhaft erscheint. – BoltClock

Verwandte Themen