使用jQuery创建图像网格
Creating a grid of images with jQuery
我对web编程和jQuery非常陌生。我想加载图像并将它们排列在网格中。但是,要加载的图像数量并不是固定的。我有一个数组img_arr,其中包含每个图像的url和id。
加载和定位图像的代码如下:
var t = 0;
var l = 0;
for (i = 0; i < img_arr.length; i++) {
var img = new Image();
$(img)
.attr('src', img_arr[i]['url'])
.attr('id', img_arr[i]['id'])
.load(function(){
$('#container').append( $(this) );
// Your other custom code
$(this).css( {
"position": "absolute",
"top": t + 'px',
"left": l + 'px'
});
});
l = l + 50;
if (l > 300) {
t = t + 50;
l = 0;
}
}
但是,这些图像在最终偏移位置被放置在彼此的顶部。有人知道为什么会这样吗?
哇哈哈!(邪恶的笑声)
这里有一个错误,一个常见的、隐蔽的错误,一个与图像、CSS或jQuery无关的错误。这是Javascript中的延迟绑定错误。
OP使用变量t
和l
来表示"顶部"answers"左侧"(顺便说一句,OP, top
和left
作为变量名有什么问题),在循环中增加它们并在回调时调用它们。但是t
和l
是后期绑定。当onload函数被调用时,这些变量被设置为它们的最终值,而不是图像标签创建时的值。
因此,"图像在最终偏移位置被放置在彼此的顶部"。
试试这个:
var renderImage = function(imgdesc, t, l) {
var img = new Image();
$(img)
.attr('src', imgdesc['url'])
.attr('id', imgdesc['id'])
.load(function(){
$('#container').append( $(this) );
// Your other custom code
$(this).css( {
"position": "absolute",
"top": t + 'px',
"left": l + 'px'
});
});
};
var t = 0;
var l = 0;
for (i = 0; i < img_arr.length; i++) {
renderImage(img_arr[i], t, l)
l = l + 50;
if (l > 300) {
t = t + 50;
l = 0;
}
}
如果您不需要绝对地定位它们,您可以使用流布局来更轻松地完成此操作。
请看下面的例子。如果您更改#container
宽度的CSS,您将看到每行中的图像数量动态变化。我认为这是一个更清晰的方法。它去掉了所有的数学运算,让浏览器处理布局。
你的代码中有很多效率低下的地方。对于一个使用jQuery的人来说,当您可以执行$('<img />')
时,不需要执行new Image()
。而且,可能在某些时候,有人想要改变图像的数量,或者图像的高度,给自己一个选项。此外,您可以使用.attr({ ... })
一次设置多个标记属性,并记住jQuery附带了非常好的.each()
方法来处理常规数组。
我的解决方案是:
var numberAcross = 6,
widthOfImages = heightOfImages = 50;
$.each(img_arr, function(idx, value){
$('<img />').attr({
'src': value.url,
'id': value.id,
'width': widthOfImages,
'height': heightOfImages
}).css({
'position': 'absolute',
'top': Math.floor(idx / numberAcross) * heightOfImages,
'left': (idx * widthOfImages) % (numberAcross * widthOfImages)
}).appendTo('#container');
});
另外,您可能想要添加css到您的#container
元素,这样您可以更好地看到,同时开发:
<style>
#container {
width: 100%;
height: 600px;
background-color: #ccc;
position: relative;
}
</style>
请注意,position: relative
在那里意味着无论你把"容器",你的绝对定位项目将正确显示。
不知道为什么它们不能正常折叠。我很确定有一些漂亮的css技巧可以用来在css文件中设置这些位置,但让我们使用您的示例。
可能是容器不够高,不能包含额外的行,因此只是把它放在最后?
对于您的示例,我会将数学内联,并且对于每行6张图像只需执行以下操作,而不是使用所有这些计数变量:
$(this).css( {
"position": "absolute",
"top": Math.floor(i / 6) * 50 + 'px',
"left": (i % 6) * 50 + 'px'
});
这可能解决不了你的问题,但在我看来它更干净了。 - 如何在浏览器宽度/高度变化时动态调整图像网格的大小
- 网格化图像,如画布上的Pinterest布局
- 使用KendoUI网格,您将如何将可选图像或图标添加到行模板中
- JQuery mobile:使用网格将多个图像垂直和水平居中
- 网格状、多响应图像
- 用javascript制作一个网格视图图像
- 使用getJSON填充动画响应图像网格
- 我该如何使网页上的图像网格可排序
- jQuery图像网格在单击以显示每个特定内容,但仅显示1个部分
- 如何在网格中随机播放图像
- 如何在网格中为“完全出血”调整图像大小
- 将 jQuery 错误处理添加到列表、网格内的 JSF 页面上的所有图像
- 将可单击的图像添加到网格
- 通过图像和 CSS 显示背景网格
- 图像网格,如 500px.com 或灯箱..com
- 获取嵌套网格视图中图像鼠标悬停的动态详细信息
- 单击时如何从网格视图中缩放图像
- IE9 中未显示图像/网格
- 通过HTML5画布上下文进行缩放,并在给定图像上绘制网格
- FlexImages移动设备上对齐的网格图像大小