Общая ширина элемента (включая отступы и границы) в jQuery

Как и в теме, как можно получить общую ширину элемента, включая его границы и отступы, используя jQuery? У меня есть плагин для измерений jQuery, и я запускаю.width() на моем 760px в ширину, 10px с отступом DIV возвращает 760.

Возможно, я делаю что-то не так, но если мой элемент проявляет себя как 780 пикселей в ширину, и Firebug сообщает мне, что на нем есть отступ в 10 пикселей, но вызов.width() дает только 760, мне будет трудно понять, как это сделать.

Спасибо за любые предложения.

6 ответов

Решение

[Обновить]

Первоначальный ответ был написан до jQuery 1.3, и функции, которые существовали в то время, были не в состоянии самостоятельно рассчитать всю ширину.

Теперь, как правильно утверждает JP, в jQuery есть функции externalWidth и outerHeight, которые включают border а также padding по умолчанию, а также margin если первый аргумент функции true


[Оригинальный ответ]

width метод больше не требует dimensions плагин, потому что он был добавлен в jQuery Core

Что вам нужно сделать, это получить значения padding, margin и border этого конкретного div и добавить их к результату width метод

Что-то вроде этого:

var theDiv = $("#theDiv");
var totalWidth = theDiv.width();
totalWidth += parseInt(theDiv.css("padding-left"), 10) + parseInt(theDiv.css("padding-right"), 10); //Total Padding Width
totalWidth += parseInt(theDiv.css("margin-left"), 10) + parseInt(theDiv.css("margin-right"), 10); //Total Margin Width
totalWidth += parseInt(theDiv.css("borderLeftWidth"), 10) + parseInt(theDiv.css("borderRightWidth"), 10); //Total Border Width

Разбить на несколько строк, чтобы сделать его более читаемым

Таким образом, вы всегда получите правильное вычисленное значение, даже если вы измените значения отступа или поля из CSS

Любой другой, спотыкающийся в этом ответе, должен заметить, что jQuery сейчас (>=1.3) имеет outerHeight / outerWidth функции для получения ширины, включая отступы / границы, например

$(elem).outerWidth(); // Returns the width + padding + borders

Чтобы включить маржу, просто передайте true:

$(elem).outerWidth( true ); // Returns the width + padding + borders + margins

Похоже, что externalWidth не работает в последней версии jquery.

Расхождение происходит, когда

внешний div плавает, внутренний div имеет установленную ширину (меньше, чем внешний div), внутренний div имеет style="margin:auto"

Просто для простоты я инкапсулировал замечательный ответ Андреаса Греча выше в некоторых функциях. Для тех, кто хочет немного счастья.

function getTotalWidthOfObject(object) {

    if(object == null || object.length == 0) {
        return 0;
    }

    var value       = object.width();
    value           += parseInt(object.css("padding-left"), 10) + parseInt(object.css("padding-right"), 10); //Total Padding Width
    value           += parseInt(object.css("margin-left"), 10) + parseInt(object.css("margin-right"), 10); //Total Margin Width
    value           += parseInt(object.css("borderLeftWidth"), 10) + parseInt(object.css("borderRightWidth"), 10); //Total Border Width
    return value;
}

function  getTotalHeightOfObject(object) {

    if(object == null || object.length == 0) {
        return 0;
    }

    var value       = object.height();
    value           += parseInt(object.css("padding-top"), 10) + parseInt(object.css("padding-bottom"), 10); //Total Padding Width
    value           += parseInt(object.css("margin-top"), 10) + parseInt(object.css("margin-bottom"), 10); //Total Margin Width
    value           += parseInt(object.css("borderTopWidth"), 10) + parseInt(object.css("borderBottomWidth"), 10); //Total Border Width
    return value;
}
$(document).ready(function(){     
$("div.width").append($("div.width").width()+" px");
$("div.innerWidth").append($("div.innerWidth").innerWidth()+" px");   
$("div.outerWidth").append($("div.outerWidth").outerWidth()+" px");         
});


<div class="width">Width of this div container without including padding is: </div>  
<div class="innerWidth">width of this div container including padding is: </div> 
<div class="outerWidth">width of this div container including padding and margin is:     </div>

Те же браузеры могут возвращать строку для ширины границы, в этом parseInt будет возвращать NaN, поэтому убедитесь, что вы правильно проанализировали значение in t.

        var getInt = function (string) {
            if (typeof string == "undefined" || string == "")
                return 0;
            var tempInt = parseInt(string);

            if (!(tempInt <= 0 || tempInt > 0))
                return 0;
            return tempInt;
        }

        var liWidth = $(this).width();
        liWidth += getInt($(this).css("padding-left"));
        liWidth += getInt($(this).css("padding-right"));
        liWidth += getInt($(this).css("border-left-width"));
        liWidth += getInt($(this).css("border-right-width"));
Другие вопросы по тегам