I want to make canvas-based uPlot plots responsive in width.
The ResizeObserver
observes the parent div width and changes the plot/canvas width accordingly.
It works for simple layouts. If the parent div is part of a flexbox layout, growing works, but shrinking doesn't. Why?
const plotContainer1 = document.getElementById("plot-container1");
const plotContainer2 = document.getElementById("plot-container2");
const plot1 = document.getElementById("plot1");
const plot2 = document.getElementById("plot2");
const resizeObserver1 = new ResizeObserver(() => {
plot1.width = plotContainer1.clientWidth;
});
resizeObserver1.observe(plotContainer1);
const resizeObserver2 = new ResizeObserver(() => {
plot2.width = plotContainer2.clientWidth;
});
resizeObserver2.observe(plotContainer2);
.container {
display: flex;
}
.left {
width: 300px;
flex-grow: 0;
flex-shrink: 0;
}
.main {
width: 100%;
flex-grow: 0;
flex-shrink: 1;
}
.plot-container {
background: red;
}
.plot {
display: flex !important;
background: black;
}
<h1>Plot full width</h1>
<div class="plot-container" id="plot-container1">
Plot 1
<canvas class="plot" id="plot1"></canvas>
</div>
<h1>Plot in flexbox layout</h1>
<div class="container">
<div class="left">Navigation</div>
<div class="main">
<div class="plot-container" id="plot-container2">
Plot 2
<canvas class="plot" id="plot2"></canvas>
</div>
</div>
</div>
Example on codepen: https://codepen.io/lukasberbuer/pen/LYjLmdE