Ich versuche, ein Flexbox-basiertes Layout zu verwenden, um eine klebrige Fußzeile für meine Seite zu erhalten. Dies funktioniert gut in Chrome und Firefox, aber in IE11 befindet sich die Fußzeile direkt nach meinem Hauptinhalt. Mit anderen Worten, der Hauptinhalt ist nicht auf den gesamten verfügbaren Platz beschränkt.
Beispiel hier - http://jsfiddle.net/ritchieallen/3tpuryso/
HTML:
<body>
<header role="banner"><h1> .. </h1></header>
<main role="main">
<p>.....</p>
</main>
<footer>...</footer>
</body>
CSS:
body {
border: red 1px solid;
min-height: 100vh;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-ms-flex-direction: column;
-webkit-flex-direction: column;
flex-direction: column;
}
header, footer {
background: #dd55dd;
}
main {
background: #87ccfc;
-ms-flex: 1 0 auto;
-webkit-flex: 1 0 auto;
flex: 1 0 auto;
}
In IE - Wie kann ich das Hauptelement in einem flexiblen Layout strecken lassen, wenn die Höheneinheiten der Container in vh gemessen werden? Ich habe nachgesehen, ob dieses Verhalten auf einen Fehler in der Art und Weise zurückzuführen ist, wie IE die Flexbox-Spezifikationen implementiert, aber ich konnte dieses Problem an keiner anderen Stelle finden.
Das Problem ist nicht vh
Einheiten, sondern min-height
Ich habe eine halb funktionierende CSS-Lösung gefunden:
min-height: 100vh;
height: 100px;
Die zusätzliche height
ermöglicht IE, den Bildschirm vertikal auszufüllen, auch wenn der Inhalt nicht groß genug ist. Der Nachteil ist, dass IE den Inhalt nicht mehr umgibt, wenn er länger als der Darstellungsbereich ist.
Da dies nicht genug ist, habe ich eine Lösung in JS gemacht:
Diese Funktion testet den Fehler: true
bedeutet, dass er fehlerhaft ist.
function hasBug () {
// inner should fill outer
// if inner's height is 0, the browser has the bug
// set up
var outer = document.createElement('div');
var inner = document.createElement('div');
outer.setAttribute('style', 'display:-ms-flexbox; display:flex; min-height:100vh;');
outer.appendChild(inner);
(document.body || document.documentElement).appendChild(outer);
// test
var bug = !inner.offsetHeight;
// remove setup
outer.parentNode.removeChild(outer);
return bug;
}
Der Fix besteht aus dem manuellen Festlegen der height
des Elements in px
function fixElementHeight (el) {
// reset any previously set height
el.style.height = 'auto';
// get el height (the one set via min-height in vh)
var height = el.offsetHeight;
// manually set it in pixels
el.style.height = height + 'px';
}
Die Höhe des Elements wird genau auf die Höhe des Inhalts eingestellt. height
wird als sekundärer min-height
im IE verwendet, wobei das in der Nur-CSS-Lösung beobachtete Verhalten verwendet wird.
Sobald diese beiden Funktionen definiert sind, richten Sie sie folgendermaßen ein:
if(hasBug()) {
// fix the element now
fixElementHeight(el);
// update the height on resize
window.addEventListener('resize', function () {
fixElementHeight(el);
});
}
function hasBug () {
// inner should fill outer
// if inner's height is 0, the browser has the bug
// set up
var outer = document.createElement('div');
var inner = document.createElement('div');
outer.setAttribute('style', 'display:-ms-flexbox; display:flex; min-height:100vh;');
outer.appendChild(inner);
(document.body || document.documentElement).appendChild(outer);
// test
var bug = !inner.offsetHeight;
// remove setup
outer.parentNode.removeChild(outer);
return bug;
}
function fixElementHeight (el) {
// reset any previously set height
el.style.height = 'auto';
// get el height (the one set via min-height in vh)
var height = el.offsetHeight;
// manually set it in pixels
el.style.height = height + 'px';
}
var output = document.getElementById('output');
output.innerHTML = hasBug()?'Browser is buggy':'Browser works correctly';
var el = document.getElementById('flex');
if(hasBug()) {
// fix the element now
fixElementHeight(el);
// update the height on resize
window.addEventListener('resize', function () {
fixElementHeight(el);
});
}
.half-screen {
display:-ms-flexbox;
display: flex;
min-height: 50vh;
padding: 10px;
background: #97cef0;
}
.content {
padding: 10px;
background: #b5daf0;
}
The inner box should fill the outer box vertically, even if the browser is buggy.
<div class="half-screen" id="flex">
<div class="content" id="output">
Text
</div>
</div>
Ich bin gestern auf diesen Fehler gestoßen und konnte ihn auch nicht selbst lösen. Leider scheint im Moment nichts dagegen zu tun zu sein, weil es IE - Fehler ist, der den Microsoft-Entwicklern vor fast einem Jahr gemeldet wurde, hier:
Der Trick, den ich gefunden habe, um klebrige Fußzeilen in IE11 zu erhalten, besteht darin sicherzustellen, dass flex-basis
100%
oder sogar 100vh
ist. Bitte sehen Sie ein Beispiel unten oder ein live Codepen-Beispiel das Sie in IE11 testen können.
html {
display: flex;
flex-direction: column;
}
body {
display: flex;
flex-direction: column;
flex-grow: 1;
flex-basis: 100%;
min-height: 100vh;
}
header {
padding: 32px;
background-color: seagreen;
}
main {
flex-grow: 1;
padding: 32px;
background-color: rgba(0, 0, 0, 0.05);
}
footer {
padding: 32px;
background-color: coral;
}
<header>
Header
</header>
<main>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
<p>I will not skateboard in the halls.</p>
</main>
<footer>
Footer
</footer>