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

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

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

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

Ответ 1

[Обновление]

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

Теперь, когда JP правильно заявляет, jQuery имеет функции outerWidth и 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

Ответ 2

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

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

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

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

Ответ 3

выглядит как наружная ширина разбита в последней версии jquery.

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

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

Ответ 4

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

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;
}

Ответ 5

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

        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"));

Ответ 6

$(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>