ความกว้างรวมขององค์ประกอบ (รวมถึงการขยายและขอบ) ใน jQuery


164

ในเรื่องนั้นเราจะได้ความกว้างทั้งหมดขององค์ประกอบรวมถึงเส้นขอบและช่องว่างภายในโดยใช้ jQuery ได้อย่างไร ฉันมีขนาด jQuery ปลั๊กอินและการทำงาน.width()ของฉัน760px-wide, ผลตอบแทน10px padding DIV760

บางทีฉันอาจจะทำสิ่งผิดปกติ แต่ถ้าองค์ประกอบของฉันปรากฏตัวในขณะที่780 pixels wideและ Firebug บอกฉันว่ามี10px paddingอยู่ในนั้น แต่โทร.width()เพียงให้ 760 ฉันจะกดยากที่จะดูว่า

ขอบคุณสำหรับคำแนะนำใด ๆ

คำตอบ:


216

[Update]

คำตอบดั้งเดิมเขียนขึ้นก่อน jQuery 1.3 และฟังก์ชั่นที่มีอยู่ ณ เวลาที่ตัวเองไม่เพียงพอในการคำนวณความกว้างทั้งหมด

ตอนนี้ในขณะที่JPถูกต้อง jQuery มีฟังก์ชั่นouterWidthและouterHeightซึ่งรวมถึงborderและpaddingโดยค่าเริ่มต้นและmarginถ้าอาร์กิวเมนต์แรกของฟังก์ชั่นคือtrue


[คำตอบเดิม]

widthวิธีการไม่ต้องใช้dimensionsปลั๊กอินเพราะมันได้รับการเพิ่มjQuery Core

สิ่งที่คุณต้องทำคือรับค่า padding, margin และ border width ของ 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


3
โดยทั่วไปฉันอยากจะเชื่อ jQuery มากกว่าทำการคำนวณด้วยตัวเอง ปัญหาคือฟังก์ชั่น width () ไม่ได้ระบุสิ่งที่มันจะทำในกรณีของ "ขนาดกล่อง: เส้นขอบกล่อง" ฉันเพิ่งทดสอบมันและมันกลับความกว้างด้านในไม่รวมถึงช่องว่างภายใน ฯลฯ สิ่งนี้อาจหรืออาจไม่ถูกต้อง คนต่างกันอาจคาดหวังสิ่งต่าง ๆ ตัวอย่างโค้ดด้านบนใช้งานได้จริง แต่อาจไม่ใช่วิธีที่น่าเชื่อถือที่สุด ตามที่ระบุในคำตอบอื่น ๆ ฉันขอแนะนำให้ใช้ฟังก์ชั่น outerWidth () แทน อย่างน้อยก็สัญญาสิ่งที่ควรจะเป็นในเอกสารประกอบ
Jan Zich

4
ไม่มีฟังก์ชั่น outerWidth / outerHeight เมื่อฉันเขียนคำตอบนี้
Andreas Grech

เพียงแสดงความคิดเห็นอย่างรวดเร็วเกี่ยวกับรหัสเก่าของฉันหากใครยังใช้มันอยู่ parseInts สามารถเปลี่ยนไปยัง+ผู้ประกอบการที่จะทำให้รหัสรวบรัดมากขึ้น ดังนั้นparseInt(theDiv.css("padding-left"), 10)สามารถหันไปหา+theDiv.css("padding-left")ฯลฯ ...
Andreas Grech

182

ใครก็ตามที่สะดุดกับคำตอบนี้ควรทราบว่าตอนนี้ jQuery (> = 1.3) มีouterHeight/ outerWidthฟังก์ชั่นเพื่อดึงความกว้างรวมถึงช่องว่างภายใน / ขอบเช่น

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

หากต้องการรวมส่วนต่างเพียงแค่ผ่านtrue:

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

3
ฉันไม่มีความสามารถในการแก้ไข แต่ฉันจะเปลี่ยนความคิดเห็นแรกเป็น: // ส่งกลับความกว้าง + ช่องว่างภายใน + และเปลี่ยนความคิดเห็นที่สองเป็น // คืนความกว้าง + ช่องว่างภายใน + ขอบ + ระยะขอบ
CtrlDot

2

ดูเหมือน outerWidth จะแตกใน jQuery เวอร์ชันล่าสุด

ความคลาดเคลื่อนเกิดขึ้นเมื่อ

div ด้านนอกลอยอยู่ div ด้านในมีชุดความกว้าง (เล็กกว่า div ด้านนอก) div ด้านในมี style = "margin: auto"


2

เพื่อความเรียบง่ายฉันได้คำตอบที่ยอดเยี่ยมของ Andreas Grech ในฟังก์ชั่นบางอย่าง สำหรับผู้ที่ต้องการความสุขตัดและวาง

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

0

เบราว์เซอร์เดียวกันอาจส่งคืนสตริงสำหรับความกว้างชายแดนใน 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"));

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

ขอบคุณสำหรับการโพสต์คำตอบของคุณ! โปรดอ่านคำถามที่พบบ่อยเกี่ยวกับการส่งเสริมตนเองอย่างรอบคอบ นอกจากนี้โปรดทราบว่าคุณจำเป็นต้องโพสต์ข้อจำกัดความรับผิดชอบทุกครั้งที่คุณเชื่อมโยงไปยังเว็บไซต์ / ผลิตภัณฑ์ของคุณเอง
Andrew Barber เมื่อ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.