javascript - 在 jQuery 中加载时图像没有获得 Div 高度
问题描述
我正在使用 jQuery 创建一个图像网格,其中包含不同高度的图像。我的 HTML 中有 4 列,我需要将每个上传的图像排列到最小高度列。所以我可以期待外观的页面平衡。为此,我制作了以下实时代码,但没有按预期工作。当我附加图像时,图像不会进入正确的列(最小高度列)。
$(document).ready(function() {
var itemsToLoad = 7
for (i = 0; i < itemsToLoad; i++) {
var col1 = $(".col1").outerHeight();
var col2 = $(".col2").outerHeight();
var col3 = $(".col3").outerHeight();
var col4 = $(".col4").outerHeight();
var sizes = [
[col1, "col1"],
[col2, "col2"],
[col3, "col3"],
[col4, "col4"]
];
var min = 1000000;
var mincol;
for (k = 0; k < 4; k++) {
if (sizes[k][0] < min) {
min = sizes[k][0];
mincol = sizes[k][1];
}
}
$("." + mincol).append("<img alt='Image" + i + "Title' class='a' src='images/image" + i + ".jpg' style='width:100%'>");
}
});
.row {
display: flex;
flex-wrap: wrap;
}
.column {
flex: 25%;
max-width: 25%;
height: max-content;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="row">
<div class="column col1">
</div>
<div class="column col2">
</div>
<div class="column col3">
</div>
<div class="column col4">
</div>
</div>
我做了另一个实时代码,图像被<Div>
不同高度的 s替换。它运行良好。当我加载一个新的 div 时,它会转到具有最小高度的正确列。
$(document).ready(function() {
var d1 = "<div style='background-color: #aaa; height: 75px; width:100%'>75</div>";
var d2 = "<div style='background-color: #faa; height: 175px; width:100%'>175</div>";
var d3 = "<div style='background-color: #afa; height: 95px; width:100%'>95</div>";
var d4 = "<div style='background-color: #aaf; height: 45px; width:100%'>45</div>";
var d5 = "<div style='background-color: #ffa; height: 75px; width:100%'>75</div>";
var d6 = "<div style='background-color: #faf; height: 115px; width:100%'>115</div>";
var d7 = "<div style='background-color: #aff; height: 125px; width:100%'>115</div>";
var d8 = "<div style='background-color: #333; height: 155px; width:100%'>115</div>";
var d9 = "<div style='background-color: #abc; height: 25px; width:100%'>115</div>";
var d10 = "<div style='background-color: #cba; height: 105px; width:100%'>115</div>";
var arr = [d1, d2, d3, d4, d5, d6, d7, d8, d9, d10];
var itemsToLoad = 7
for (i = 0; i < itemsToLoad; i++) {
var col1 = $(".col1").outerHeight();
var col2 = $(".col2").outerHeight();
var col3 = $(".col3").outerHeight();
var col4 = $(".col4").outerHeight();
var sizes = [
[col1, "col1"],
[col2, "col2"],
[col3, "col3"],
[col4, "col4"]
];
var min = 1000000;
var mincol;
for (k = 0; k < 4; k++) {
if (sizes[k][0] < min) {
min = sizes[k][0];
mincol = sizes[k][1];
}
}
$("." + mincol).append(arr[i]);
}
});
.row {
display: flex;
flex-wrap: wrap;
}
.column {
flex: 25%;
max-width: 25%;
height: max-content;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="row">
<div class="column col1">
</div>
<div class="column col2">
</div>
<div class="column col3">
</div>
<div class="column col4">
</div>
</div>
为什么图像不能这样工作?
解决方案
这似乎可以解决问题。
首先,我将图像附加到一个隐藏的容器中。此处将加载图像。所有图像都会获得一个 onload 事件处理程序,该处理程序将根据您的逻辑将图像移动到右列。
注意:图像添加到列的顺序有点随机,因为加载图像是异步的。
$(document).ready(function() {
var itemsToLoad = 7
for (i = 0; i < itemsToLoad; i++) {
//Code used to load dummy images starting with big size (700)
var height = (itemsToLoad - i) * 50;
var $img = $('<img>');
$img.attr('src', 'https://dummyimage.com/100x' + height + '/000/0011ff.png');
$img.width('100%');
$img.on('load', function() {
//once the image is loaded move it to the proper column
var col1 = $(".col1").outerHeight();
var col2 = $(".col2").outerHeight();
var col3 = $(".col3").outerHeight();
var col4 = $(".col4").outerHeight();
var sizes = [
[col1, "col1"],
[col2, "col2"],
[col3, "col3"],
[col4, "col4"]
];
var min = 1000000;
var mincol;
for (k = 0; k < 4; k++) {
if (sizes[k][0] < min) {
min = sizes[k][0];
mincol = sizes[k][1];
}
}
$(this).appendTo("." + mincol);
});
$("#imagePreloaded").append($img);
}
});
.row {
display: flex;
flex-wrap: wrap;
}
.column {
flex: 25%;
max-width: 25%;
height: max-content;
}
#imagePreloaded {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="row">
<div id="imagePreloaded">
</div>
<div class="column col1">
</div>
<div class="column col2">
</div>
<div class="column col3">
</div>
<div class="column col4">
</div>
</div>
推荐阅读
- r - 使用 R 从 ugarchboot 输出中提取预测区间
- google-drive-api - 如何使用 PyGSheets v2 在特定文件夹/目录中创建新工作表?
- autodesk-forge - Forge Properties - 如何识别返回的集合
- mybatis - 如何从 Mybatis 获取 db 列值进行分片?
- ios - WCSession 检查配套应用程序是否可以接收消息
- c# - 如何使用字符串生成器以表格格式应用
- java - ElasticSearh RestHighLevelClient ,如何添加重试?
- python-3.x - 是否还创建了内置模块的 pyc 文件?
- google-tag-manager - 可以在gtm脚本上方定义dataLayer,然后将数据推送到gtm脚本下方的dataLayer吗?
- r - 按基于条件创建的组汇总列值