2015-10-07 9 views
5

Ich habe 3 verschachtelten divs:Verschachtelte divs, die eine Bildlaufleiste erzeugen. Warum?

<div class="outer"> 
    <div class="inner"><div class="item"></div></div> 
</div> 

Die .inner div Position absolut und sie haben jeweils 1px Grenze:

.outer{ 
    width:50%; 
    height:100px; 
    border: 1px solid red; 
    position:relative; 
    overflow-x:hidden; 
    box-sizing:border-box; 
} 
.inner{ 
    border:1px solid blue; 
    height:100%; 
    position: absolute; 
    box-sizing: border-box; 
} 
.item{ 
    width:100px; 
    height:100%; 
    background-color:yellow; 
    display: inline-block; 
    border:1px solid green; 
    box-sizing:border-box; 
} 

Diese Anordnung führt zu einer Bildlaufleiste am .outer div.

Hier ist ein codepen

Warum das so ist und was muss ich es passiert zu stoppen ändern?

Wenn die Breite der Umrandung des .inner div auf 3px erhöht wird, wird die Bildlaufleiste entfernt. Warum passiert das wieder?

+0

http://codepen.io/anon/pen/VvbNXp ich werde schreiben Antwort unten – deebs

Antwort

4

Dies geschieht, weil Ihr .item Element eingestellt ist als inline-block angezeigt werden soll. Dies bedeutet, dass es von Dingen wie line-height und vertical-align betroffen ist.

Die standardmäßige vertikale Ausrichtung auf inline-block Elementen ist Baseline. Dies bedeutet, dass sie so eingestellt sind, dass sie in der Basiszeile eines beliebigen Textes erscheinen, der daneben eingegeben werden kann. Ich bin mir nicht 100% ig sicher, aber ich denke, dass hier ein Problem auftreten kann, bei dem box-sizing ignoriert wird, und die Grundlinie endet 2 Pixel darunter, wo es sein sollte (aufgrund der kumulativen 2 Pixel Rand angewendet auf die Ober- und Unterseite des Elements).

Wenn Sie das Element wollen diese Art und Weise wird angezeigt bleiben, eine schnelle Lösung setzen seine vertical-align-top:

.item { 
    ... 
    vertical-align: top; 
} 

Codepen demo.

+0

leider nicht gut Ich brauche sie zentriert –

+0

@WillJenkins Ich bin mir nicht sicher, was du meinst. Wenn Sie möchten, dass das '.item'-Element zentriert angezeigt wird, können Sie Ihrem' .inner' -Element eine 'width' von' 100% 'und eine' text-align'-Menge auf 'center' geben. http://codepen.io/anon/pen/XmRQpL –

+0

Entfernen von 'display: inline-block', wobei entweder' vertical-align: top/middle/bottom' oder 'position: absolute' auf item gesetzt werden, funktioniert aber das Inline-Block-Kind eines absolut positionierten Elements nimmt sowieso Platz im Elternteil ein ?? – Tyblitz

0

Warum verwenden Sie inline-block im inneren Element? Wenn Sie zu blockieren Ihre Scroll ändern verschwindet:

.item{ 
    width:100px; 
    height:100%; 
    background-color:yellow; 
    display: block; 
    border:1px solid green; 
    box-sizing:border-box; 
} 
2

Die seltsamste Sache ist, dass wenn Sie overflow-x:hidden; entfernen die Bildlaufleiste weggeht. Der Grund dafür ist, dass das Standardverhalten von overflow ist visible also, wenn Sie nicht mit ihm verwirren tun, werden die Ergebnisse keine Scrollbalken sein, aberoverflow-x bis zu einem gewissen Wert, setzt overflow-y-auto anstelle des Standardwertes, die visible ist und Als Ergebnis wird die Bildlaufleiste angezeigt.

Wenn Sie overflow auf auto setzen, wird auch die Bildlaufleiste angezeigt.

Auf der anderen Seite ist .item auf inline-block gesetzt, so dass es line-height hat, die den Raum auf der Unterseite produziert. Die Einstellung auf line-height:0 wird den Raum verschwinden lassen, und wenn Sie ihn vergrößern, wird er auch zunehmen.

Auf der anderen (dritte Hand) können Sie den Raum nur einengen können, dass die Elemente innerhalb .inner Nehmen durch .inner-overflow:hidden

+0

Wow, netter Fund! – Tyblitz

+0

Ja, ich wusste das aber overflow-x: versteckt ist notwendig –

-1

Einstellung Es ist, weil Ihre Höhe 100% ist dann sind Sie 1px der Grenze auf jedem div Hinzufügen .Arbeits Demo: http://codepen.io/anon/pen/VvbNXp

So Ihre .inner und .item Klassen müssen die Höhe geändert:

height:calc(100% - 1px); 
+0

Nein, Box-Sizing: Border-Box nimmt die Randbreite in Rechnung. –

+0

Ich glaube, die Box-Sizing berücksichtigt nur die Polsterung und Marge, oder? Weil diese Lösung die Bildlaufleiste entfernt – deebs

+1

Nein. Es ist Polsterung und Rand aber nicht Rand. Siehe hier: https://developer.mozilla.org/en/docs/Web/CSS/box-sizing –