创建动态网格时阻止 div growing/stretching
Prevent div growing/stretching when creating a dynamic grid
我正在处理动态图像网格,但无法让网格保留在容器中。这个想法很简单,使用 jQuery 向容器中添加尽可能多的框,并在添加时缩小它们以适合容器而不添加滚动条,或者 运行 离开屏幕.这适用于添加列,但在添加行时,它只会让 运行 远离屏幕底部。
如何修复容器 div 以便在添加行时缩小图像而不是添加带有滚动条的行?
function GenerateGrid(rows, cols) {
// Get the available space of the container.
var gridContainerH = $('#container').height();
var gridContainerW = $('#container').width();
// Adjust the image size to fit in the available space.
var imageWidth = gridContainerW / cols;
var imageHeight = gridContainerH / rows;
const container = document.getElementById("container");
var img = document.createElement("img");
img.src = "panel.jpg";
container.style.setProperty('--grid-rows', rows);
container.style.setProperty('--grid-cols', cols);
for (i = 0; i < (rows * cols); i++) {
let cell = document.createElement("div");
cell.innerHTML = '<img src=box.jpg width=' + imageWidth + ' height=' + imageHeight + '>';
container.appendChild(cell).className = "grid-item";
};
// Recalculate height
var panelHeight = imageWidth * rows;
$('#container').height(panelHeight);
$('#gridContainer').height(panelHeight);
};
// Start with a 5x7 grid
$(window).on("load", function() {
GenerateGrid(5, 7);
})
// If the column amount changes, rebuild the grid.
$('#columns').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
// If the row amount changes, rebuild the grid.
$('#rows').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
:root {
--grid-cols: 1;
--grid-rows: 1;
}
#container {
display: grid;
grid-gap: 0em;
grid-template-rows: repeat(var(--grid-rows), 0fr);
grid-template-columns: repeat(var(--grid-cols), 0fr);
}
#gridContainer {
width: 768px;
height: 600px;
max-height: 600px;
}
#staticContainer {
width: 768px;
height: 600px;
max-height: 600px;
}
.grid-item {
padding: 0em;
text-align: center;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2">
<form>
<label for="columns">Columns</label>
<input type="number" id="columns" name="columns" value="7">
<label for="rows">Rows</label>
<input type="number" id="rows" name="rows" value="5">
</form>
</div>
<div class="col-lg-10">
<div class="container" id="gridContainer">
<div class="row">
<div class="col-lg-8 text-center">
Horizontal label
</div>
</div>
<div class="row h-100">
<div class="col-lg-1 my-auto">
Vertical label
</div>
<div class="col-lg-7 staticContainer">
<div id="container"></div>
</div>
<div class="col-lg-4 mt-auto">
Right Side
</div>
</div>
</div>
</div>
</div>
</div>
为网格创建不会超出定义的宽度和高度的 Div 容器涉及什么?
编辑:请以图片为例。
5x7 grid
9x10
1x1
避免在评论中出现 link:。这是你想做的吗? :
(修改结构+添加bs4 class)
function GenerateGrid(rows, cols) {
// Get the available space of the container.
var gridContainerH = $('#container').height();
var gridContainerW = $('#container').width();
// Adjust the image size to fit in the available space.
var imageWidth = gridContainerW / cols;
var imageHeight = gridContainerH / rows;
const container = document.getElementById("container");
var img = document.createElement("img");
img.src = "panel.jpg";
container.style.setProperty('--grid-rows', rows);
container.style.setProperty('--grid-cols', cols);
for (i = 0; i < (rows * cols); i++) {
let cell = document.createElement("div");
cell.innerHTML = '<img src=box.jpg width=' + imageWidth + ' height=' + imageHeight + '>';
container.appendChild(cell).className = "grid-item";
};
// Recalculate height
var panelHeight = imageWidth * rows;
$('#container').height(panelHeight);
$('#gridContainer').height(panelHeight);
};
// Start with a 5x7 grid
$(window).on("load", function() {
GenerateGrid(5, 7);
})
// If the column amount changes, rebuild the grid.
$('#columns').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
// If the row amount changes, rebuild the grid.
$('#rows').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
:root {
--grid-cols: 1;
--grid-rows: 1;
}
#container {
flex:1;
display: grid;
grid-gap: 0em;
grid-template-rows: repeat(var(--grid-rows), 0fr);
grid-template-columns: repeat(var(--grid-cols), 0fr);
}
#staticContainer {/* width sizing ? while col-lg-7 ?
Added to parent flex-shrink-0 flex-wrap classes but unsure of what you really want */
width: 768px;
height: 600px;
text-align:center;
}
.grid-item {
padding: 0em;
text-align: center;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2">
<form>
<label for="columns">Columns</label>
<input type="number" id="columns" name="columns" value="7">
<label for="rows">Rows</label>
<input type="number" id="rows" name="rows" value="5">
</form>
</div>
<div class="col-lg-10 d-flex align-items-center flex-shrink-0 flex-wrap">
<div class="col-lg-1">Vertical label</div>
<div class="col-lg-7 d-flex flex-column" id="staticContainer">
<div>Horizontal label</div>
<div id="container"></div>
</div>
<div class="col-lg-4">
Right Side
</div>
</div>
</div>
</div>
使用带有断点和固定大小的 classes 其他地方会使预期的渲染非常混乱......你能澄清预期的大小和行为吗?
object-fit 也会是一个提示吗?
function GenerateGrid(rows, cols) {
// Get the available space of the container.
var gridContainerH = $('#container').height();
var gridContainerW = $('#container').width();
// Adjust the image size to fit in the available space.
var imageWidth = gridContainerW / cols;
var imageHeight = gridContainerH / rows;
const container = document.getElementById("container");
var img = document.createElement("img");
img.src = "http://dummyimage.com/100x200&text=panel.jpg";
container.style.setProperty('--grid-rows', rows);
container.style.setProperty('--grid-cols', cols);
for (i = 0; i < (rows * cols); i++) {
let cell = document.createElement("div");
cell.innerHTML = '<img src="http://dummyimage.com/100x200&text=box.jpg" width=' + imageWidth + ' height=' + imageHeight + '>';
container.appendChild(cell).className = "grid-item";
};
// Recalculate height
var panelHeight = imageWidth * rows;
$('#container').height(panelHeight);
$('#gridContainer').height(panelHeight);
};
// Start with a 5x7 grid
$(window).on("load", function() {
GenerateGrid(5, 7);
})
// If the column amount changes, rebuild the grid.
$('#columns').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
// If the row amount changes, rebuild the grid.
$('#rows').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
:root {
--grid-cols: 1;
--grid-rows: 1;
}
#container {
flex:1;
display: grid;
grid-gap: 0em;
grid-template-rows: repeat(var(--grid-rows), 0fr);
grid-template-columns: repeat(var(--grid-cols), 0fr);
}
#staticContainer {/* width sizing ? while col-lg-7 ?
Added to parent flex-shrink-0 flex-wrap classes but unsure of what you really want */
width: 768px;
height: 600px;
text-align:center;
}
.grid-item {
padding: 0em;
text-align: center;
}
.grid-item img {object-fit:cover;display:block}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2">
<form>
<label for="columns">Columns</label>
<input type="number" id="columns" name="columns" value="7">
<label for="rows">Rows</label>
<input type="number" id="rows" name="rows" value="5">
</form>
</div>
<div class="col-lg-10 d-flex align-items-center flex-shrink-0 flex-wrap">
<div class="col-lg-1">Vertical label</div>
<div class="col-lg-7 d-flex flex-column" id="staticContainer">
<div>Horizontal label</div>
<div id="container"></div>
</div>
<div class="col-lg-4">
Right Side
</div>
</div>
</div>
</div>
我正在处理动态图像网格,但无法让网格保留在容器中。这个想法很简单,使用 jQuery 向容器中添加尽可能多的框,并在添加时缩小它们以适合容器而不添加滚动条,或者 运行 离开屏幕.这适用于添加列,但在添加行时,它只会让 运行 远离屏幕底部。
如何修复容器 div 以便在添加行时缩小图像而不是添加带有滚动条的行?
function GenerateGrid(rows, cols) {
// Get the available space of the container.
var gridContainerH = $('#container').height();
var gridContainerW = $('#container').width();
// Adjust the image size to fit in the available space.
var imageWidth = gridContainerW / cols;
var imageHeight = gridContainerH / rows;
const container = document.getElementById("container");
var img = document.createElement("img");
img.src = "panel.jpg";
container.style.setProperty('--grid-rows', rows);
container.style.setProperty('--grid-cols', cols);
for (i = 0; i < (rows * cols); i++) {
let cell = document.createElement("div");
cell.innerHTML = '<img src=box.jpg width=' + imageWidth + ' height=' + imageHeight + '>';
container.appendChild(cell).className = "grid-item";
};
// Recalculate height
var panelHeight = imageWidth * rows;
$('#container').height(panelHeight);
$('#gridContainer').height(panelHeight);
};
// Start with a 5x7 grid
$(window).on("load", function() {
GenerateGrid(5, 7);
})
// If the column amount changes, rebuild the grid.
$('#columns').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
// If the row amount changes, rebuild the grid.
$('#rows').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
:root {
--grid-cols: 1;
--grid-rows: 1;
}
#container {
display: grid;
grid-gap: 0em;
grid-template-rows: repeat(var(--grid-rows), 0fr);
grid-template-columns: repeat(var(--grid-cols), 0fr);
}
#gridContainer {
width: 768px;
height: 600px;
max-height: 600px;
}
#staticContainer {
width: 768px;
height: 600px;
max-height: 600px;
}
.grid-item {
padding: 0em;
text-align: center;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2">
<form>
<label for="columns">Columns</label>
<input type="number" id="columns" name="columns" value="7">
<label for="rows">Rows</label>
<input type="number" id="rows" name="rows" value="5">
</form>
</div>
<div class="col-lg-10">
<div class="container" id="gridContainer">
<div class="row">
<div class="col-lg-8 text-center">
Horizontal label
</div>
</div>
<div class="row h-100">
<div class="col-lg-1 my-auto">
Vertical label
</div>
<div class="col-lg-7 staticContainer">
<div id="container"></div>
</div>
<div class="col-lg-4 mt-auto">
Right Side
</div>
</div>
</div>
</div>
</div>
</div>
为网格创建不会超出定义的宽度和高度的 Div 容器涉及什么?
编辑:请以图片为例。
5x7 grid 9x10 1x1
避免在评论中出现 link:。这是你想做的吗? :
(修改结构+添加bs4 class)
function GenerateGrid(rows, cols) {
// Get the available space of the container.
var gridContainerH = $('#container').height();
var gridContainerW = $('#container').width();
// Adjust the image size to fit in the available space.
var imageWidth = gridContainerW / cols;
var imageHeight = gridContainerH / rows;
const container = document.getElementById("container");
var img = document.createElement("img");
img.src = "panel.jpg";
container.style.setProperty('--grid-rows', rows);
container.style.setProperty('--grid-cols', cols);
for (i = 0; i < (rows * cols); i++) {
let cell = document.createElement("div");
cell.innerHTML = '<img src=box.jpg width=' + imageWidth + ' height=' + imageHeight + '>';
container.appendChild(cell).className = "grid-item";
};
// Recalculate height
var panelHeight = imageWidth * rows;
$('#container').height(panelHeight);
$('#gridContainer').height(panelHeight);
};
// Start with a 5x7 grid
$(window).on("load", function() {
GenerateGrid(5, 7);
})
// If the column amount changes, rebuild the grid.
$('#columns').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
// If the row amount changes, rebuild the grid.
$('#rows').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
:root {
--grid-cols: 1;
--grid-rows: 1;
}
#container {
flex:1;
display: grid;
grid-gap: 0em;
grid-template-rows: repeat(var(--grid-rows), 0fr);
grid-template-columns: repeat(var(--grid-cols), 0fr);
}
#staticContainer {/* width sizing ? while col-lg-7 ?
Added to parent flex-shrink-0 flex-wrap classes but unsure of what you really want */
width: 768px;
height: 600px;
text-align:center;
}
.grid-item {
padding: 0em;
text-align: center;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2">
<form>
<label for="columns">Columns</label>
<input type="number" id="columns" name="columns" value="7">
<label for="rows">Rows</label>
<input type="number" id="rows" name="rows" value="5">
</form>
</div>
<div class="col-lg-10 d-flex align-items-center flex-shrink-0 flex-wrap">
<div class="col-lg-1">Vertical label</div>
<div class="col-lg-7 d-flex flex-column" id="staticContainer">
<div>Horizontal label</div>
<div id="container"></div>
</div>
<div class="col-lg-4">
Right Side
</div>
</div>
</div>
</div>
使用带有断点和固定大小的 classes 其他地方会使预期的渲染非常混乱......你能澄清预期的大小和行为吗?
object-fit 也会是一个提示吗?
function GenerateGrid(rows, cols) {
// Get the available space of the container.
var gridContainerH = $('#container').height();
var gridContainerW = $('#container').width();
// Adjust the image size to fit in the available space.
var imageWidth = gridContainerW / cols;
var imageHeight = gridContainerH / rows;
const container = document.getElementById("container");
var img = document.createElement("img");
img.src = "http://dummyimage.com/100x200&text=panel.jpg";
container.style.setProperty('--grid-rows', rows);
container.style.setProperty('--grid-cols', cols);
for (i = 0; i < (rows * cols); i++) {
let cell = document.createElement("div");
cell.innerHTML = '<img src="http://dummyimage.com/100x200&text=box.jpg" width=' + imageWidth + ' height=' + imageHeight + '>';
container.appendChild(cell).className = "grid-item";
};
// Recalculate height
var panelHeight = imageWidth * rows;
$('#container').height(panelHeight);
$('#gridContainer').height(panelHeight);
};
// Start with a 5x7 grid
$(window).on("load", function() {
GenerateGrid(5, 7);
})
// If the column amount changes, rebuild the grid.
$('#columns').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
// If the row amount changes, rebuild the grid.
$('#rows').change(function() {
var columns = $("#columns").val();
var rows = $("#rows").val();
$('#container').empty();
GenerateGrid(rows, columns);
});
:root {
--grid-cols: 1;
--grid-rows: 1;
}
#container {
flex:1;
display: grid;
grid-gap: 0em;
grid-template-rows: repeat(var(--grid-rows), 0fr);
grid-template-columns: repeat(var(--grid-cols), 0fr);
}
#staticContainer {/* width sizing ? while col-lg-7 ?
Added to parent flex-shrink-0 flex-wrap classes but unsure of what you really want */
width: 768px;
height: 600px;
text-align:center;
}
.grid-item {
padding: 0em;
text-align: center;
}
.grid-item img {object-fit:cover;display:block}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid">
<div class="row">
<div class="col-lg-2">
<form>
<label for="columns">Columns</label>
<input type="number" id="columns" name="columns" value="7">
<label for="rows">Rows</label>
<input type="number" id="rows" name="rows" value="5">
</form>
</div>
<div class="col-lg-10 d-flex align-items-center flex-shrink-0 flex-wrap">
<div class="col-lg-1">Vertical label</div>
<div class="col-lg-7 d-flex flex-column" id="staticContainer">
<div>Horizontal label</div>
<div id="container"></div>
</div>
<div class="col-lg-4">
Right Side
</div>
</div>
</div>
</div>