คุณจะได้ความสูงที่แสดงขององค์ประกอบได้อย่างไร


405

คุณจะได้ความสูงที่แสดงขององค์ประกอบได้อย่างไร

สมมติว่าคุณมี<div>องค์ประกอบพร้อมเนื้อหาภายใน <div>นี้ภายในเนื้อหาเป็นไปเพื่อยืดความสูงของ คุณจะรับความสูง "ที่เรนเดอร์" ได้อย่างไรเมื่อคุณไม่ได้ตั้งค่าความสูงอย่างชัดเจน เห็นได้ชัดว่าฉันพยายาม:

var h = document.getElementById('someDiv').style.height;

มีเคล็ดลับในการทำเช่นนี้หรือไม่? ฉันใช้ jQuery ถ้าช่วยได้


ดูคำตอบนี้stackoverflow.com/questions/19581307/…
KarSho

คำตอบ:


183

มันควรจะเป็น

$('#someDiv').height();

ด้วย jQuery สิ่งนี้จะดึงความสูงของรายการแรกในชุดที่ห่อเป็นตัวเลข

พยายามใช้

.style.height

ใช้งานได้เฉพาะถ้าคุณได้ตั้งค่าคุณสมบัติในสถานที่แรก ไม่มีประโยชน์มาก!


1
หนึ่งคำ - ยอดเยี่ยม! ขอบคุณสำหรับการมีส่วนร่วมของทุกคน ข้อมูลที่ดีมากมายในกระทู้นี้ สิ่งนี้จะทำให้ฉันสามารถจัดกึ่งกลางเพจโดยใช้ CSS แต่ใช้ jQuery เพื่อทำให้ความสูงโดยรวมของ div "container" ถูกต้องโดยไม่ต้องเสี่ยงกับ CSS hackville ขอบคุณอีกครั้ง.
BuddyJoe

3
แม้ว่าคุณจะไม่ได้ใช้ jQuery หรือไม่ต้องการแนะนำให้ใครก็ตามที่ใช้สิ่งนี้โดยใช้ offsetHeight แล้วก็ไปดาวน์โหลดซอร์ส jQuery แล้วค้นหา "height" เพื่อค้นหารหัสที่พวกเขาใช้ มีสิ่งที่บ้าเกิดขึ้นมากมายในนั้น!
Simon_Weaver

1
@matejkramny - คำถามนี้และคำตอบก็คือมากกว่า 5 ปีที่ผ่านมา OP ใช้ jQuery บนไซต์แล้วแทนที่จะใช้ตรรกะเดียวกัน / คล้ายกันอีกครั้งทำไมไม่ใช้ฟังก์ชั่นหนึ่งบรรทัด jQuery ที่ทำไปแล้ว? ฉันเห็นด้วยว่า jQuery เกินความจำเป็นหลายอย่างและฉันไม่กลัววานิลลา JS แต่เมื่อมีฟังก์ชั่นในห้องสมุดที่ทำสิ่งที่คุณต้องการดูเหมือนว่าโง่ที่จะไม่ใช้มันโดยเฉพาะอย่างยิ่งด้วยเหตุผล ของ "ไม่ได้คิดค้นที่นี่"
Russ Cam

3
@matejkramny ความตั้งใจของ OPs เมื่อถามคำถามคือทำให้ความสูงขององค์ประกอบนั้นไม่เข้าใจว่าเกิดอะไรขึ้นใน DOM และเบื้องหลัง หากนั่นคือเจตนาของพวกเขาพวกเขาถามคำถามผิด ฉันยอมรับว่าผู้คนควรมีแนวโน้มที่จะเข้าใจห้องสมุดและกรอบการทำงานที่พวกเขาใช้ความรู้คือพลังและสิ่งเหล่านั้น แต่บางครั้งคนเราต้องการคำตอบสำหรับคำถามเฉพาะ แท้จริงแล้วความคิดเห็นข้างต้นแนะนำให้มองผ่านรหัส jQuery เพื่อทำความเข้าใจว่าเกิดอะไรขึ้นเบื้องหลัง
Russ Cam

21
สำหรับ OP การใช้ jQuery เป็นคำตอบที่ถูกต้อง สำหรับส่วนที่เหลือของโลกที่เห็นสิ่งนี้จากนั้นเป็นต้นมาคำตอบที่ไม่ใช่ jQuery เป็นคำตอบที่ดีที่สุด บางที SO จำเป็นต้องปรับให้เข้ากับความเป็นจริงนั้นบางทีคำตอบที่ได้รับการโหวตมากที่สุดควรจะเน้นในบางวิธีมากกว่าคำตอบที่ยอมรับ
Dimitris

1219

ลองหนึ่งใน:

var h = document.getElementById('someDiv').clientHeight;
var h = document.getElementById('someDiv').offsetHeight;
var h = document.getElementById('someDiv').scrollHeight;

clientHeight รวมถึงความสูงและระยะห่างแนวดิ่ง

offsetHeight รวมถึงความสูงการแพ็ดตามแนวตั้งและเส้นขอบแนวตั้ง

scrollHeight รวมความสูงของเอกสารที่มี (จะสูงกว่าความสูงในกรณีของการเลื่อน) การขยายแนวตั้งและเส้นขอบแนวตั้ง


3
ขอบคุณฉันไม่รู้เกี่ยวกับอสังหาริมทรัพย์นี้ มันเข้ากันได้กับ IE8 +
lyubeto

ฉันงุนงงกับความหมายของลูกค้าสูง ฉันมีองค์ประกอบ div ที่มีองค์ประกอบ p อยู่ในนั้นและเนื้อหาไปไกลเกินกว่าขอบเขตที่สามารถดูได้ของเบราว์เซอร์ลง และฉันคาดหวังว่าลูกค้าความสูงจะให้ความสูงที่แสดงผลและเลื่อนความสูงเพื่อให้ความยาวเต็ม แต่พวกเขาเกือบเท่ากัน
Bti

10
@bahti ยกเว้นว่าตัวเองมีความสูงที่ จำกัด และการโอเวอร์โฟลว์: ซ่อนหรือรูปแบบของการล้น: เลื่อนองค์ประกอบจะขยาย (ไม่ว่าจะอยู่ในมุมมองของคุณหรือไม่) เพื่อแสดงเนื้อหาทั้งหมดและ scrollHeight และ clientHeight จะเท่ากัน
Ulad Kasach

4
คำตอบที่ดี แต่มีเหตุผลขอบที่มีผลต่อความสูงขององค์ประกอบคือขอบด้านบนและด้านล่างซึ่งเป็นแนวนอน คำตอบนี้อ้างถึงพวกเขาเป็น "เส้นขอบแนวตั้ง" แค่คิดว่าฉันจะลด 2 เซนต์ของฉัน
Kehlan Krumme

1
จากสิ่งที่ฉันรู้.clientWidth/.clientHeight ไม่ต้องรวมความกว้างของการเลื่อนถ้ามีการแสดงการเลื่อน หากคุณต้องการรวมความกว้างของสโครลสามารถใช้element.getBoundingClientRect().width แทนได้
Dmitry Gonchar

151

NON JQUERY เนื่องจากมีลิงก์จำนวนมากที่ใช้elem.style.heightในคำตอบด้านบน ...

ความสูงภายใน:
https://developer.mozilla.org/en-US/docs/Web/API/Element.clientHeight

document.getElementById(id_attribute_value).clientHeight;

ความสูงภายนอก:
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetHeight

document.getElementById(id_attribute_value).offsetHeight; 

หรือหนึ่งในการอ้างอิงที่ฉันชอบ: http://youmightnotneedjquery.com/


49

คุณสามารถใช้ได้ .outerHeight()เพื่อวัตถุประสงค์นี้

มันจะให้ความสูงที่แสดงเต็มขององค์ประกอบ นอกจากนี้คุณไม่จำเป็นต้องตั้งค่าcss-heightองค์ประกอบใด ๆ เพื่อความไม่ประมาทคุณสามารถรักษาระดับความสูงโดยอัตโนมัติเพื่อให้สามารถแสดงผลตามความสูงของเนื้อหา

//if you need height of div excluding margin/padding/border
$('#someDiv').height();

//if you need height of div with padding but without border + margin
$('#someDiv').innerHeight();

// if you need height of div including padding and border
$('#someDiv').outerHeight();

//and at last for including border + margin + padding, can use
$('#someDiv').outerHeight(true);

สำหรับมุมมองที่ชัดเจนของฟังก์ชันเหล่านี้คุณสามารถไปที่ไซต์ของ jQuery หรือโพสต์แบบละเอียดที่นี่โพสต์รายละเอียดที่นี่

มันจะล้างความแตกต่างระหว่าง.height()/ innerHeight()/outerHeight()


1
ขอบคุณ ในการทำงานกับโฟลทฉันมีปัญหาเกี่ยวกับรถยนต์สูง แต่ก็ไม่มีประสบการณ์ โดยทั่วไปฉันไม่ได้ตั้งค่าความสูงยกเว้นในสคริปต์เลย์เอาต์ที่ซับซ้อนซึ่งตอนแรกฉันจะล้างฟิลด์ แต่ตั้งค่าให้เท่ากันสำหรับแต่ละบล็อก (Div) ที่ลงท้ายด้วยส่วนบนสุดเดียวกัน แม้แต่ความแตกต่างของพิกเซลหนึ่งเดียวระหว่างบล็อกยังสามารถไขเค้าโครงเมื่อปรับขนาดหน้าต่าง
DHorse

1
BTW ฉันคิดว่าออฟเซ็ตมีการใช้งานเบราว์เซอร์บางรุ่นขึ้นอยู่กับระยะขอบซึ่งจะกำจัด
DHorse

2
คำถามไม่ได้เรียก jQuery ฮึ.
dthree

1
@dthree ฉันคิดว่าเขาพูดอย่างชัดเจนว่าเขาใช้ jQuery (รวมอยู่ในแท็ก) :)
เปิดและฟรี

44

ฉันใช้สิ่งนี้เพื่อให้ได้ความสูงขององค์ประกอบ(return float) :

document.getElementById('someDiv').getBoundingClientRect().height

นอกจากนี้ยังทำงานเมื่อคุณใช้DOM เสมือน ฉันใช้มันใน Vue เช่นนี้:

this.$refs['some-ref'].getBoundingClientRect().height

1
getBoundingClientRect (). height ส่งกลับตัวเลข floating-point (ในขณะที่คนอื่นคืนค่าเป็นจำนวนเต็ม), nice :)
Ari


14

ใช้อย่างแน่นอน

$('#someDiv').height()   // to read it

หรือ

$('#someDiv').height(newHeight)  // to set it

ฉันโพสต์สิ่งนี้เป็นคำตอบเพิ่มเติมเนื่องจากมีสิ่งสำคัญสองสามอย่างที่ฉันเพิ่งเรียนรู้

ตอนนี้ฉันเกือบจะตกหลุมพรางแล้ว นี่คือสิ่งที่เกิดขึ้น:

  • ฉันใช้กลอุบายเก่า ๆ ที่ดีในการใช้ดีบักเกอร์เพื่อ 'ดู' คุณสมบัติที่องค์ประกอบของฉันมี
  • ฉันเห็นสิ่งที่มีค่าประมาณค่าที่ฉันคาดหวัง
  • มันถูกชดเชยความสูง - ดังนั้นฉันจึงใช้มัน
  • จากนั้นฉันก็รู้ว่ามันไม่ได้ทำงานกับ DIV ที่ซ่อนอยู่
  • ฉันพยายามซ่อนหลังจากคำนวณ maxHeight แต่มันดูเงอะงะ - มีระเบียบ
  • ฉันค้นหา - ค้นพบ jQuery.height () - และใช้มัน
  • พบความสูง () ทำงานได้แม้ในองค์ประกอบที่ซ่อนอยู่
  • เพียงเพื่อความสนุกฉันตรวจสอบการใช้ jQuery ของความสูง / ความกว้าง

นี่เป็นเพียงส่วนหนึ่งของมัน:

Math.max(
Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
Math.max(document.body["offset" + name], document.documentElement["offset" + name])
) 

ใช่มันดูทั้งการเลื่อนและการชดเชย หากล้มเหลวมันดูยิ่งขึ้นโดยคำนึงถึงเบราว์เซอร์บัญชีและ css ปัญหาความเข้ากันได้ ในคำอื่น ๆ สิ่งที่ฉันไม่สนใจเกี่ยวกับ - หรือต้องการ

แต่ฉันไม่จำเป็นต้อง ขอบคุณ jQuery!

คุณธรรมของเรื่องราว: หาก jQuery มีวิธีการสำหรับบางสิ่งบางอย่างมันอาจจะมีเหตุผลที่ดีซึ่งอาจเกี่ยวข้องกับความเข้ากันได้

หากคุณยังไม่ได้อ่านรายการวิธีการjQueryเมื่อเร็ว ๆ นี้ฉันขอแนะนำให้คุณดู


เห็นความคิดเห็นอื่น ๆ ของคุณในระดับคำถาม ฉันขายใน jQuery ได้รับในขณะที่ แต่นี่เป็นการปิดผนึกข้อตกลง ฉันตกหลุมรักกับความจริงที่ว่าสิ่งง่าย ๆ นี้จะแก้ปัญหาเลย์เอาต์ได้ 100s (ส่วนใหญ่บนไซต์อินทราเน็ตที่ฉันรู้ว่า JavaScript กำลังทำงานอยู่)
BuddyJoe

13
document.querySelector('.project_list_div').offsetHeight;

4
เพิ่มคำอธิบายสำหรับโซลูชันของคุณ
Freelancer

offsetHeight แล้ว
Ritwik

6
โรงแรมนี้จะปัดเศษค่าไปยังจำนวนเต็ม หากคุณต้องการค่าลอยใช้elem.getBoundingClientRect().height
Penny Liu

12

ฉันสร้างรหัสง่ายๆที่ไม่จำเป็นต้องใช้ JQuery และอาจช่วยคนอื่นได้ จะได้รับความสูงรวมของ 'ID1' หลังจากโหลดและใช้กับ 'ID2'

function anyName(){
    var varname=document.getElementById('ID1').offsetHeight;
    document.getElementById('ID2').style.height=varname+'px';
}

จากนั้นเพียงแค่ตั้งค่าร่างกายให้โหลด

<body onload='anyName()'>

มันมีประโยชน์และฉันใช้สิ่งที่คล้ายกันในรหัสที่ซับซ้อนมากขึ้น
DHorse

10

หืมเราสามารถรับรูปทรงเรขาคณิตขององค์ประกอบ ...

var geometry;
geometry={};
var element=document.getElementById(#ibims);
var rect = element.getBoundingClientRect();
this.geometry.top=rect.top;
this.geometry.right=rect.right;
this.geometry.bottom=rect.bottom;
this.geometry.left=rect.left;
this.geometry.height=this.geometry.bottom-this.geometry.top;
this.geometry.width=this.geometry.right-this.geometry.left;
console.log(this.geometry);

แล้ว JS แบบธรรมดาล่ะ?


1
var geometry; geometry={};สามารถเป็นได้var geometry={};
Mark Schultheiss

10

ฉันคิดว่าวิธีที่ดีที่สุดในการทำเช่นนี้ในปี 2020 คือใช้ js ธรรมดาและ getBoundingClientRect().height;

นี่คือตัวอย่าง

let div = document.querySelector('div');
let divHeight = div.getBoundingClientRect().height;

console.log(`Div Height: ${divHeight}`);
<div>
  How high am I? 🥴
</div>

ด้านบนของการเดินทางheightด้วยวิธีนี้เรายังมีการเข้าถึงพวงของสิ่งอื่น ๆ divเกี่ยวกับการ

let div = document.querySelector('div');
let divInfo = div.getBoundingClientRect();

console.log(divInfo);
<div>What else am I? 🥴</div>


8

ดังนั้นนี่คือคำตอบ?

ถ้าคุณต้องการคำนวณบางอย่าง แต่ไม่แสดงให้ตั้งค่าองค์ประกอบเป็นvisibility:hiddenและposition:absoluteเพิ่มลงในทรี DOM รับ offsetHeight และลบออก (นั่นคือสิ่งที่ไลบรารีต้นแบบทำอยู่หลังบรรทัดสุดท้ายที่ฉันตรวจสอบ)"

ฉันมีปัญหาเดียวกันกับองค์ประกอบหลายอย่าง ไม่มี jQuery หรือ Prototype ที่จะใช้บนเว็บไซต์ แต่ฉันทุกคนชอบที่จะยืมเทคนิคถ้ามันใช้งานได้ ตัวอย่างของบางสิ่งที่ล้มเหลวในการทำงานตามด้วยสิ่งที่ทำฉันมีรหัสต่อไปนี้:

// Layout Height Get
function fnElementHeightMaxGet(DoScroll, DoBase, elementPassed, elementHeightDefault)
{
    var DoOffset = true;
    if (!elementPassed) { return 0; }
    if (!elementPassed.style) { return 0; }
    var thisHeight = 0;
    var heightBase = parseInt(elementPassed.style.height);
    var heightOffset = parseInt(elementPassed.offsetHeight);
    var heightScroll = parseInt(elementPassed.scrollHeight);
    var heightClient = parseInt(elementPassed.clientHeight);
    var heightNode = 0;
    var heightRects = 0;
    //
    if (DoBase) {
        if (heightBase > thisHeight) { thisHeight = heightBase; }
    }
    if (DoOffset) {
        if (heightOffset > thisHeight) { thisHeight = heightOffset; }
    }
    if (DoScroll) {
        if (heightScroll > thisHeight) { thisHeight = heightScroll; }
    }
    //
    if (thisHeight == 0) { thisHeight = heightClient; }
    //
    if (thisHeight == 0) { 
        // Dom Add:
        // all else failed so use the protype approach...
        var elBodyTempContainer = document.getElementById('BodyTempContainer');
        elBodyTempContainer.appendChild(elementPassed);
        heightNode = elBodyTempContainer.childNodes[0].offsetHeight;
        elBodyTempContainer.removeChild(elementPassed);
        if (heightNode > thisHeight) { thisHeight = heightNode; }
        //
        // Bounding Rect:
        // Or this approach...
        var clientRects = elementPassed.getClientRects();
        heightRects = clientRects.height;
        if (heightRects > thisHeight) { thisHeight = heightRects; }
    }
    //
    // Default height not appropriate here
    // if (thisHeight == 0) { thisHeight = elementHeightDefault; }
    if (thisHeight > 3000) {
        // ERROR
        thisHeight = 3000;
    }
    return thisHeight;
}

ซึ่งโดยทั่วไปจะพยายามทำทุกอย่างเพื่อให้ได้ผลลัพธ์เป็นศูนย์ ความสูงของลูกค้าที่ไม่มีผลกระทบ ด้วยองค์ประกอบของปัญหาฉันมักจะได้ NaN ในฐานและศูนย์ในระดับความสูงออฟเซ็ตและสโคร ฉันลองใช้โซลูชันเพิ่ม DOM และ clientRects เพื่อดูว่าทำงานได้ที่นี่หรือไม่

29 มิ.ย. 2011 ฉันได้ทำการปรับปรุงรหัสเพื่อลองทั้งการเพิ่มใน DOM และ clientHeight ด้วยผลลัพธ์ที่ดีกว่าที่ฉันคาดไว้

1) ลูกค้าความสูงเป็น 0

2) Dom ให้ความสูงแก่ฉันซึ่งเยี่ยมมาก

3) ClientRects ส่งคืนผลลัพธ์ที่เกือบจะเหมือนกับเทคนิค DOM

เนื่องจากองค์ประกอบที่เพิ่มเป็นของเหลวในธรรมชาติเมื่อมีการเพิ่มองค์ประกอบ DOM ชั่วคราวว่างเปล่าพวกเขาจะแสดงผลตามความกว้างของภาชนะที่ สิ่งนี้ดูแปลกเพราะนั่นสั้นกว่า 30px ในที่สุด

ฉันเพิ่มภาพรวมเล็กน้อยเพื่อแสดงให้เห็นว่าการคำนวณความสูงแตกต่างกันอย่างไร บล็อกเมนูแสดงผลตามปกติ เพิ่มเมนูบล็อกในองค์ประกอบ DOM Temp

ความแตกต่างของความสูงนั้นชัดเจน ฉันสามารถเพิ่มตำแหน่งแน่นอนและซ่อนเร้นได้ แต่ฉันแน่ใจว่าจะไม่มีผลกระทบ ฉันยังคงเชื่อมั่นว่านี่จะไม่ทำงาน!

(ฉันพูดนอกเรื่องเพิ่มเติม) ความสูงออกมา (แสดงผล) ต่ำกว่าความสูงที่แสดงผลจริง สิ่งนี้สามารถแก้ไขได้โดยการตั้งค่าความกว้างขององค์ประกอบ DOM ชั่วคราวเพื่อให้ตรงกับผู้ปกครองที่มีอยู่และสามารถทำได้อย่างถูกต้องในทางทฤษฎี ฉันไม่ทราบด้วยว่าจะมีอะไรเกิดขึ้นในการลบออกและเพิ่มกลับเข้าไปในตำแหน่งที่มีอยู่เดิม เมื่อพวกเขามาถึงเทคนิค InnerHTML ฉันจะมองใช้วิธีการที่แตกต่างกันนี้

* อย่างไร *ไม่มีสิ่งที่จำเป็น ในความเป็นจริงมันทำงานตามโฆษณาและคืนความสูงที่ถูกต้อง !!!

เมื่อฉันสามารถทำให้เมนูมองเห็นได้อีกครั้งอย่างน่าอัศจรรย์ DOM ได้คืนค่าความสูงที่ถูกต้องต่อเลย์เอาต์ของเหลวที่ด้านบนของหน้า (279px) รหัสข้างต้นยังใช้ getClientRects ซึ่งผลตอบแทน 280px

นี่คือภาพประกอบในภาพรวมต่อไปนี้ (นำมาจาก Chrome เมื่อใช้งานได้)
ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ฉันมีความคิด noooooo ทำไมต้นแบบต้นแบบนั้นทำงานได้ แต่ดูเหมือนว่า หรือมิฉะนั้น getClientRects ก็ใช้ได้เช่นกัน

ฉันสงสัยว่าสาเหตุของปัญหาทั้งหมดที่เกิดขึ้นกับองค์ประกอบเหล่านี้คือการใช้ InnerHTML แทนภาคผนวกเด็ก แต่นั่นเป็นการคาดเดาที่บริสุทธิ์ ณ จุดนี้


6

offsetHeightมักจะ

หากคุณต้องการคำนวณบางสิ่ง แต่ไม่แสดงให้ตั้งค่าองค์ประกอบเป็นvisibility:hiddenและposition:absoluteเพิ่มลงในทรี DOM รับoffsetHeightและลบออก (นั่นคือสิ่งที่ห้องสมุดต้นแบบทำอยู่เบื้องหลังเมื่อฉันตรวจสอบครั้งล่าสุด)


น่าสนใจ ฉันไม่เคยตรวจสอบต้นแบบ ความคิดใดที่ว่าทำไม jQuery ไม่ทำอย่างนั้น?
Simon_Weaver

ผมเห็นว่าเมื่อมีความยากลำบากและผ่านการทดสอบจากเทคนิคที่และมันทำงานได้ค่อนข้างดีใน JavaScript ธรรมดา
DHorse

5

บางครั้ง offsetHeight จะส่งกลับค่าศูนย์เนื่องจากองค์ประกอบที่คุณสร้างยังไม่ได้แสดงผลใน Dom ฉันเขียนฟังก์ชันนี้สำหรับสถานการณ์เช่นนี้:

function getHeight(element)
{
    var e = element.cloneNode(true);
    e.style.visibility = "hidden";
    document.body.appendChild(e);
    var height = e.offsetHeight + 0;
    document.body.removeChild(e);
    e.style.visibility = "visible";
    return height;
}

คุณต้องโคลนองค์ประกอบมิฉะนั้นมันจะถูกลบออกจาก Dom อย่างสมบูรณ์ดูเหมือนว่าจากรหัสของคุณนั่นคือสิ่งที่จะเกิดขึ้น
punkbit

รหัสนี้ไม่ได้มีวัตถุประสงค์เพื่อเก็บองค์ประกอบใน DOM มันตั้งใจที่จะใส่ลงใน DOM สั้น ๆ (นานพอที่จะทำให้มันได้รับความสูง) จากนั้นก็นำมันออกมา คุณสามารถวางองค์ประกอบลงในที่อื่น ๆ ในภายหลังได้ (รู้ว่าความสูงของมันนั้นคืออะไรก่อนคุณทำ สังเกตชื่อฟังก์ชั่น "getHeight"; นั่นคือทั้งหมดที่รหัสตั้งใจจะทำ
Lonnie Best

@punkbit: ฉันเห็นสิ่งที่คุณหมายถึง องค์ประกอบของคุณอยู่ในโดมแล้ว รหัสที่ฉันเขียนมีไว้สำหรับองค์ประกอบที่ยังไม่ได้อยู่ใน DOM การโคลนนิ่งน่าจะดีกว่าอย่างที่คุณพูดเพราะมันไม่สำคัญว่าองค์ประกอบจะอยู่ในโดมหรือไม่
Lonnie Best

@punkbit: ฉันแก้ไขการใช้รหัสโคลน แต่ยังไม่ได้ทดสอบ
Lonnie Best

ใช่นั่นคือจุดของฉัน ดูเหมือนว่าฉันจะบอกว่า "องค์ประกอบ" สำหรับองค์ประกอบที่มีอยู่ใน DOM แต่ทั้งหมดดี! อย่าเข้าใจผิด
punkbit

4

หากคุณใช้ jQuery อยู่แล้วทางออกที่ดีที่สุดของคุณคือ.outerHeight()หรือ.height()ตามที่ระบุไว้

หากไม่มี jQuery คุณสามารถตรวจสอบขนาดของกล่องที่ใช้งานและเพิ่มการเติมช่องว่าง + ขอบ + ไคลเอนต์ความสูงหรือคุณสามารถใช้getComputedStyle :

var h = getComputedStyle (document.getElementById ('someDiv')) ความสูง;

h ตอนนี้จะเป็นสตริงเช่น "53.825px"

และฉันไม่สามารถหาข้อมูลอ้างอิงได้ แต่ฉันคิดว่าฉันได้ยินว่าgetComputedStyle()อาจมีราคาแพงดังนั้นอาจไม่ใช่สิ่งที่คุณต้องการโทรหาในแต่ละwindow.onscrollเหตุการณ์ (แต่แล้วไม่ใช่ jQuery height())


เมื่อคุณมีความสูงgetComputedStyleใช้parseInt(h, 10)เพื่อรับจำนวนเต็มสำหรับการคำนวณ
RhodanV5500


1

หากฉันเข้าใจคำถามของคุณถูกต้องบางทีสิ่งนี้อาจช่วย:

function testDistance(node1, node2) {
    /* get top position of node 1 */
    let n1Pos = node1.offsetTop;
    /* get height of node 1 */
    let n1Height = node1.clientHeight;
    /* get top position of node 2 */
    let n2Pos = node2.offsetTop;
    /* get height of node 2 */
    let n2Height = node2.clientHeight;

    /* add height of both nodes */
    let heightTogether = n1Height + n2Height;
    /* calculate distance from top of node 1 to bottom of node 2 */
    let actualDistance = (n2Pos + n2Height) - n1Pos;

    /* if the distance between top of node 1 and bottom of node 2
       is bigger than their heights combined, than there is something between them */
    if (actualDistance > heightTogether) {
        /* do something here if they are not together */
        console.log('they are not together');
    } else {
        /* do something here if they are together */
        console.log('together');
    } 
}

-4

คุณได้ตั้งค่าความสูงใน css โดยเฉพาะหรือไม่? หากคุณไม่จำเป็นต้องใช้offsetHeight;มากกว่าheight

var h = document.getElementById('someDiv').style.offsetHeight;

8
offsetHeight เป็นคุณสมบัติขององค์ประกอบเองไม่ใช่สไตล์ของมัน
Shog9
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.