jQuery可以将元素的边界(位置,大小,边距等)复制到另一个元素吗?

时间:2010-10-06 18:15:50

标签: javascript jquery html jquery-ui bounds

我有一个任意类型的元素。我想创建另一个与第一个元素具有相同位置和大小的相同或不同类型的元素。该元素可能已定位,也可能未定位。

例如,我可以从具有特定大小的<select>开始,可能取决于其内容,即宽度/高度auto。我想创建一个出现在同一位置并且大小相同的新<div>

我已经尝试复制元素的浮动,清除,位置,宽度,高度,边距和填充,但这有点麻烦。此外,虽然它在Firefox中运行,但我在Webkit上进行测试时遇到了一些奇怪的问题。在我花费更多时间搞清楚之前,我想知道是否有一些jQuery或jQuery UI功能已经完成了我想要做的事情。

我意识到这个问题与an existing one类似,但我的重要区别在于需要使用不同类型的元素,这会排除clone作为解决方案。

3 个答案:

答案 0 :(得分:4)

这不是高效,测试或完整的。它可能与您已经在做的类似。但我还以为我会发布它:

var positioningProps = ["float","position","width","height","left","top","marginLeft","marginTop","paddingLeft","paddingTop"];
var select = $("#mySelect");
var div = $("<div>").hide().before(select);
// don't do this kind of loop in production code
// http://www.vervestudios.co/jsbench/
for(var i in positioningProps){
    div.css(positioningProps[i], select.css(positioningProps[i])||"");
}
select.hide();

答案 1 :(得分:3)

如何复制元素的偏移并将其绝对定位在页面上呢?

假设您在页面的某个位置有一个尺寸为100x25px的输入元素。

<input type="text" id="firstname" style="width: 100px; height: 20px" />

你想在它上面放置一个div(并隐藏输入)。

// Store the input in a variable
var $firstname = $("#firstname");

// Create a new div and assign the width/height/top/left properties of the input
var $newdiv = $("<div />").css({
    'width': $firstname.width(),
    'height': $firstname.height(),
    'position': 'absolute',
    'top': $firstname.offset().top,
    'left': $firstname.offset().left
});

// Add the div to the body
$(body).append($newdiv);

答案 2 :(得分:1)

你可以使用这个插件找到jQuery的元素边界。只需将您感兴趣的任何属性设置到另一个对象就可以了。

http://code.google.com/p/jquery-ui/source/browse/branches/labs/powella/coverslide/res/js/jquery/jquery.bounds.js?r=2698

/*
 * jQuery.bounds
 * author: Andrew Powell
*/

(function($){

        $.fn['bounds'] = function() 
        {
                var t = this, e = t[0];
                if (!e) return;

                var offset = t.offset(), pos = { width:e.offsetWidth, height:e.offsetHeight, left: 0, top: 0, right: 0, bottom: 0, x: 0, y: 0 };

                pos.left = offset.left; 
                pos.top = offset.top;

                //right and bottom
                pos.right = (pos.left + pos.width);
                pos.bottom = (pos.top + pos.height);
                pos.x = pos.left;
                pos.y = pos.top;
                pos.inner = {width: t.width(), height: t.height()};

                $.extend(pos, {toString: function(){ var t = this; return 'x: ' + t.x + ' y: ' + t.y + ' width: ' + t.width + ' height: ' + t.height + ' right: ' + t.right + ' bottom: ' + t.bottom; }});

                return pos;
        };

})(jQuery);