I have a UI element in my web application that functions as a hovering panel. The panel itself has a header, footer, and content element. The panel will have a maximum height to avoid the panel overflowing from the window (this is updated on the window.onresize
event).
Since I'm only required to support IE10 and up, I'm using flexbox to support this layout.
I've managed to get this working cross-browser: http://jsfiddle.net/Pyn9e/9/
Try reducing the size of the 'Result' panel, and you'll see that the content panel begins to scroll rather than overflow, but still ensures the header and footer don't disappear.
function setMaxHeight() {
var maxHeight = $(window).height() - 16;
$("#panel").css({
height: maxHeight + "px"
});
}
$(window).on("resize", function() {
setMaxHeight();
});
setMaxHeight();
var i = 0;
setInterval(function() {
var ul = $("#list");
++i;
if (i <= 20) {
var li = $("<li>").text("Item " + i);
ul.append(li);
} else if (i <= 40) {
ul.children().last().remove();
} else {
i = 0;
}
}, 60);
.flex-container {
display: -ms-flex;
display: flex;
flex-direction: column;
-ms-flex-direction: column;
}
.flex-fixed {
flex: 0 1 auto;
-ms-flex: 0 1 auto;
}
.flex-var {
flex: 0 1 auto;
-ms-flex: 0 1 auto;
}
#panel {
position: absolute;
top: 8px;
left: 8px;
width: 200px;
color: white;
overflow: hidden;
}
#panel > header {
background: red;
}
#panel > .content {
background: blue;
overflow-y: auto;
}
#panel > footer {
background: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="panel" class="flex-container">
<header class="flex-fixed">This is the header</header>
<div class="flex-var content">
<ul id="list">
</ul>
</div>
<footer class="flex-fixed">This is the footer</footer>
</div>
However, the content of the panel is dynamic and will usually need to host another flexbox (e.g. another header, footer, content). This seems to be quite easy to do in Chrome and Firefox, but I'm having trouble getting IE10 and IE11 to work: http://jsfiddle.net/Pyn9e/11/
As you'll see in IE10 and IE11, the panel now overflows the window rather than starting to scroll.
function setMaxHeight() {
var maxHeight = $(window).height() - 16;
$("#panel").css({
height: maxHeight + "px"
});
}
$(window).on("resize", function() {
setMaxHeight();
});
setMaxHeight();
var i = 0;
setInterval(function() {
var ul = $("#list");
++i;
if (i <= 20) {
var li = $("<li>").text("Item " + i);
ul.append(li);
} else if (i <= 40) {
ul.children().last().remove();
} else {
i = 0;
}
}, 60);
.flex-container {
display: -ms-flex;
display: flex;
flex-direction: column;
-ms-flex-direction: column;
}
.flex-fixed {
flex: 0 0 auto;
-ms-flex: 0 0 auto;
}
.flex-var {
flex: 0 1 auto;
-ms-flex: 0 1 auto;
}
#panel {
position: absolute;
top: 8px;
left: 8px;
width: 200px;
color: white;
overflow: hidden;
}
#panel > header {
background: red;
}
#panel > .content {
background: blue;
}
#panel > footer {
background: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="panel" class="flex-container">
<header class="flex-fixed">This is the header</header>
<div class="flex-container flex-var content">
<header class="flex-fixed">Content</header>
<ul id="list" class="flex-var" style="overflow-y:scroll; padding: 0; margin:0">
</ul>
</div>
<footer class="flex-fixed">This is the footer</footer>
</div>
Can anyone see a way in which I can support IE without altering the layout too much? Thanks.
-ms-flexbox
, not -ms-flex
In both of your examples, you are using an incorrect browser prefix value: -ms-flex
.
The correct flexbox prefix value for IE is -ms-flexbox
.
Also, you don't need to use JavaScript to set the height of the container on window resize; you can achieve the same result by setting the height
of #panel
in the CSS:
#panel {
…
height: calc(100% - 16px);
…
}
Or, because #panel
is absolutely positioned, by setting the bottom
position:
#panel {
…
bottom: 8px;
…
}
var i = 0;
setInterval(function() {
var ul = $("#list");
++i;
if (i <= 20) {
var li = $("<li>").text("Item " + i);
ul.append(li);
} else if (i <= 40) {
ul.children().last().remove();
} else {
i = 0;
}
}, 60);
.flex-container {
display: -ms-flexbox;
display: flex;
flex-direction: column;
-ms-flex-direction: column;
}
.flex-fixed {
flex: 0 1 auto;
-ms-flex: 0 1 auto;
}
.flex-var {
flex: 0 1 auto;
-ms-flex: 0 1 auto;
}
#panel {
position: absolute;
top: 8px;
left: 8px;
bottom: 8px;
width: 200px;
color: white;
overflow: hidden;
}
#panel > header {
background: red;
}
#panel > .content {
background: blue;
overflow-y: auto;
}
#panel > footer {
background: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="panel" class="flex-container">
<header class="flex-fixed">This is the header</header>
<div class="flex-container flex-var content">
<header class="flex-fixed">Content</header>
<ul id="list" class="flex-var" style="overflow-y:scroll; padding: 0; margin:0">
</ul>
</div>
<footer class="flex-fixed">This is the footer</footer>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With