2016-11-04 4 views
2

Ich habe ein Flexbox-Layout für eine Navigationsleiste verwendet, und ich habe ein seltsames Verhalten in Internet Explorer 11 bemerkt. Nicht in Chrome, FF oder Edge passieren. Ich habe eine Geige gemacht zu demonstrieren:IE11 flexbox: Opazität beeinflusst Layout

https://jsfiddle.net/6L06251k/

Es folgt eine weitere abgespeckte Version des Codes Geige:

HTML

<form> 
    <ul> 
    <li> 
     <button>Menu item</button> 
     <ul id="submenu"><li><button>Submenu item</button></li></ul> 
    </li> 
    </ul> 
</form> 

CSS

form { 
    display: flex; 
    flex-flow: column; 
} 

button { 
    display: inline-block; 
} 

#submenu { 
    display: inline-block; 
    position: absolute; 
    opacity: 0.5; 
} 

li:hover #submenu { 
    opacity: 1; /* RULE A */ 
} 

button:focus + #submenu { 
    opacity: 1; /* RULE B */ 
} 

Das Problem ist, dass, wenn ich über das äußere Menü <ul> schwinge, REGEL A auslöst und das opacity des Untermenüs von 0,5 auf 1 ändert, erhöht sich die Höhe des äußeren Menüs um einige Pixel. Dies geschieht nicht, wenn die Hover-Regel die Deckkraft auf beispielsweise 0,999 festlegt. Ich verstehe nicht, warum die Deckkraft eines Elements sein Layout beeinflussen sollte und warum dies nicht nur passieren sollte, wenn die Deckkraft 1 wird, aber nicht 0.999!

Wenn ich stattdessen die Deckkraft des Untermenüs mit REGEL B ändere, indem ich den Fokus auf die äußere <button> setze, tritt die Höhenänderung im äußeren Menü nicht auf, obwohl der exakt gleiche Stil angewendet wird.

Für die Geige, konnte ich dies lösen, indem Sie einfach eine opacity von 0,999, aber diese Lösung funktioniert nicht für das eigentliche Projekt, in dem ich dieses Problem aufgetreten ist. Es ist nicht leicht zu sagen, warum, also hoffe ich, dass ich durch das Verständnis des zugrundeliegenden Mechanismus dieser Eigenart etwas anderes herausfinden kann.

Antwort

2

Wenn Sie display: inline-block verwenden, kann ein seltsames Abstandsverhalten auftreten. Um dieses Problem zu beheben, können Sie einfach die folgenden Schritte aus

  1. Analysieren Sie die div hat das display: inline-block Attribut, in Ihrem Fall ist es #submenu.

  2. Fügen Sie font-size: 0 dem übergeordneten div des div hinzu, das die display: inline-block hat, in Ihrem Fall die li. Mit font-size: 0 entfernen Sie den von der Schriftart verursachten Abstand vollständig.

  3. nächste und letzte Schritt ist die Schriftgröße erneut auf diese divs hinzufügen , die durch Hinzufügen font-size: initial einen Text angezeigt werden soll, die button in Ihrem Fall.

Der CSS-Code aktualisiert würde jetzt so etwas wie dieses

form { 
 
    display: flex; 
 
    flex-flow: column; 
 
} 
 
ul { 
 
    background: #aaf; 
 
    list-style: none 
 
} 
 
li { 
 
    font-size: 0; 
 
} 
 
button { 
 
    background: #afa; 
 
    font-size: initial; 
 
} 
 
#submenu { 
 
    display: inline-block; 
 
    opacity: 0; 
 
} 
 
li:hover #submenu { 
 
    opacity: 1; 
 
}
<form> 
 
    <ul> 
 
    <li> 
 
     <button>Menu item</button> 
 
     <ul id="submenu"> 
 
     <li> 
 
      <button>Submenu item</button> 
 
     </li> 
 
     </ul> 
 
    </li> 
 
    </ul> 
 
</form>

+0

Großen Dank aussehen - das in [die Geige] (https://jsfiddle.net/9roq5yj7 gearbeitet hat /) und in meinem Hauptprojekt. Haben Sie Informationen oder Ressourcen darüber, warum dies geschah? Ich nehme an, dass dies in modernen Browsern nicht passieren würde. Es ist nur ein sehr seltsames Verhalten für die Opazität, für mich, und die Art und Weise, in der es von _which_ selector beeinflusst wurde, die Änderung der CSS auszulösen, war besonders merkwürdig. –

+0

@ JosephO'Donnell Großartig, kein Problem. Froh hätte helfen können. Das Problem mit Inline-Block ist, dass das Leerzeichen zwischen Ihren divs auf dem Bildschirm sichtbar wird. Weil sich Inline-Block so verhält, ist es eigentlich egal, wie modern Ihr Browser ist. Es ist wirklich interessant, dass die anderen Browser es korrekt angezeigt haben. Manchmal werden Sie das Leerzeichen gar nicht bemerken, aber in Ihrem Fall haben Sie es aufgrund der Änderung der Navigationshöhe beim Hover bemerkt. Später, wenn Sie nicht mit diesen Whitespace-Problemen umgehen wollen, können Sie einfach alles mit flex machen. – SvenL

+0

David Walsh schrieb einen [Artikel] (https://davidwalsh.name/remove-whitespace-inline-block) über dieses Thema und wies sogar noch mehr Wege auf, wie man das Whitespace Problem lösen könnte, aber ich denke in deinem Fall die Schriftart -size-Methode ist das Beste. – SvenL