假设我在容器<div>
中有六个<div>
个元素。这六个div中的每一个都是正方形,并且应用了CSS样式float: left
。默认情况下,当它们到达容器<div>
的边缘时,它们将换行。
现在,我的问题是,使用Javascript,是否可以确定包装的元素是什么?
如果它们显示在页面上,如:
___ ___
| 1 | | 2 |
----- -----
___ ___
| 3 | | 4 |
----- -----
我正在尝试确定第二个和第三个元素之间发生了换行。如果你想知道我是否已经失去了理智,我试图这样做的原因是如果点击其中一个框,我希望能够通过一些花哨的shQueryy jQuery下拉行之间的信息区域。 / p>
___ ___
| * | | ! |
----- -----
| Someinfo|
___ ___
| * | | * |
----- -----
有关确定中断发生位置的任何想法?
P.S。我浮动并让它自动换行的原因是为了让它具有响应性。现在,如果我调整浏览器大小,它会相应地包装盒子。我不想硬编码列宽。
[编辑] 感谢Explosion Pills提供的答案,我能够找到解决方案。
// Offset of first element
var first = $(".tool:first").offset().left;
var offset = 0;
var count = 0;
$(".box").each(function () {
// Get offset
offset = $(this).offset().left;
// If not first box and offset is equal to first box offset
if(count > 0 && offset == first)
{
// Show where break is
console.log("Breaks on element: " + count);
}
// Next box
count++;
});
在控制台中输出以下内容:
Breaks on element: 7
Breaks on element: 14
Breaks on element: 21
Breaks on element: 28
当我有30个盒子时,最后是7盒宽5行(最后一行只有2盒)
答案 0 :(得分:8)
将容器的宽度除以盒子的宽度。
(假设正方形宽度相等.. )
这将选择每行的最后一个元素
var wrapper = $('.wrapper'),
boxes = wrapper.children(),
boxSize = boxes.first().outerWidth(true);
$(window).resize(function(){
var w = wrapper.width(),
breakat = Math.floor( w / boxSize); // this calculates how many items fit in a row
last_per_row = boxes.filter(':nth-child('+breakat+'n)') // target the last element of each row
// do what you want with the last_per_row elements..
});
答案 1 :(得分:8)
我建议您迭代元素并比较顶部位置:
el.position().top;
如果顶部值不同 - 此元素位于下一行!
这是小提琴:http://jsfiddle.net/J8syA/1/
这种解决方案的优点是你不需要知道元素,填充等的确切像素宽度。如果你的css会改变,这段代码仍会找到行中的最后一个元素。
答案 2 :(得分:4)
var offset = 0;
var last = 0;
$(".wrappable-box").each(function () {
offset = $(this).offset().left;
if (offset < last) {
//this is the first box after a wrap
}
last = offset;
});
答案 3 :(得分:0)
示例:http://jsfiddle.net/gvL5ybsq/
function getLastElementInRow(el) {
var top = el.offset().top,
next = el.next();
if (next.size() == 0)
return el;
var nextTop = next.offset().top;
if (nextTop > top)
return el;
return getLastElementInRow(next);
};