如何使用jquery获取一组元素的最高“左”值?

时间:2014-02-10 13:08:45

标签: javascript jquery offset absolute highest

我需要得到一组元素的最高left值,这些元素都具有left值,因为它们是用绝对位置设置的。我需要检索具有最高左值的元素,以便在我可以向此元素添加特定类之后。

window.load(function()
{
    $('.elements').each(function() 
    {
        var leftValue = $(this).offset().left;
    });
});

7 个答案:

答案 0 :(得分:2)

所有答案都忘了一件事:他询问左边最高值的元素,而不是元素中的最大值。

所以:

window.load(function()
{
    var max = 0, $element;
    $('.elements').each(function()
    {
        if($(this).offset().left > max)
        {
            max = $(this).offset().left;
            $element = $(this);
        }
    }
}

最后,$element将具有左值最高的元素

答案 1 :(得分:1)

您可以将它们添加到数组中,然后使用Math.max获取最大数字。

var arr = [], max = 0, $elements = $('.elements');

$elements.each(function() {
  arr.push($(this).offset().left);
});

max = Math.max.apply(null, arr);

然后使用$.grep获取相关元素。

var element = $.grep($elements, function (e) {
  return $(e).offset().left === max;
});

Demo

答案 2 :(得分:1)

您可以在window.load内或任何需要的地方运行:

var max = $('.elements').toArray().reduce(function(max, elem) {
    return Math.max(max, $(elem).offset().left || 0);
}, Number.NEGATIVE_INFINITY);

虽然您可以在最后一行使用0而不是Number.NEGATIVE_INFINITY,但这样您也可以考虑可能的负值。

JSFiddle 上的示例。


更新

正如 @Eagle 指出的那样,这与许多答案一样,错过了OP想要的元素,而不是实际的大小。更新后的 JSFiddle 会显示对该技术的修改,而不是。

var maxElem = $('.elements').toArray().reduce(function(curr, elem) {
    var left = $(elem).offset().left;
    return left > curr.val ? {elem: elem, val: left} : curr 
}, {elem: null, val: Number.NEGATIVE_INFINITY}).elem;

答案 3 :(得分:0)

window.load(function(){

        var max = 0;
        $('.elements').each(function() {
            var leftValue = $(this).offset().left;
            if ( leftValue > max ) 
            {
               max = leftValue;
            }
        });

    });

max变量是最高的。

答案 4 :(得分:0)

我知道没有max内置函数,但你可以

window.load(function(){
    var maxLeft = 0;

    $('.elements').each(function() {
        var leftValue = $(this).offset().left;
        if (leftValue > maxLeft) {
            maxLeft = leftValue;
        }
    });

    console.log(maxLeft);
});

答案 5 :(得分:0)

您需要做的是将变量保留在each范围之外。然后,您只需将您的值与您找到的所有其他值进行比较,然后分配最高值。

window.load(function()
{
    var leftValue = 0;
    $('.elements').each(function() 
    {
        maxLeft = $(this).offset().left;
        if (maxLeft > leftValue) 
        {
            leftValue = maxLeft;
        }
    });
});

答案 6 :(得分:0)

这里有一个使用递归的替代方法:http://jsfiddle.net/wared/Y762p/。请注意,您现在可以在不重新启动小提琴的情况下调整演示面板的大小。

var els = $('.elements').get();
var $el = mostLeft(els);

function mostLeft(list) {    
    var biggestLeft; // saves "left" to reduce calls to .offset()
    return function rec(list) {
        var sel, $el, left; // "sel" means "selection"
        if (list.length) {
            $el = $(list[0]);
            left = $el.offset().left;
            sel = rec(list.slice(1));
            if (!sel || left > biggestLeft) {
                biggestLeft = left;
                sel = $el;
            } 
            return sel;
        }
    }(list);    
};

previous version相比的变化:

  • 原始元素列表不再被修改,因此,它是可重用的,
  • 删除了sel参数,以防止错误使用和错误。