ตรวจสอบด้วย jquery ว่า div มีองค์ประกอบมากเกินไปหรือไม่


130

ฉันมี div ที่มีความสูงคงที่และ overflow:hidden;

ฉันต้องการตรวจสอบด้วย jQuery ว่า div มีองค์ประกอบที่เกินความสูงคงที่ของ div หรือไม่ ฉันจะทำเช่นนี้ได้อย่างไร?


ฉันอาจจะผิด แต่ฉันไม่คิดว่าจะมีวิธี jQuery วิเศษในการตรวจสอบว่าองค์ประกอบนั้นอยู่นอกองค์ประกอบอื่นหรือไม่ คุณอาจต้องตรวจสอบความสูงและตำแหน่งขององค์ประกอบภายใน div ของคุณและทำการคำนวณเพื่อดูว่ามันล้นหรือไม่
adeneo

1
ใช่ฉันกำลังคิดที่จะตรวจสอบว่าความแตกต่างระหว่างตำแหน่งด้านบนของ div กับตำแหน่งของด้านล่างขององค์ประกอบลูกสุดท้ายภายใน div นั้นมากกว่าความสูงของ div หรือไม่
Justin Meltzer

เป็นไปได้ที่จะทำซ้ำการตรวจจับองค์ประกอบที่ล้นโดยใช้ jquery
Noyo

คำตอบ:


281

จริงๆแล้วคุณไม่จำเป็นต้องใช้ jQuery เพื่อตรวจสอบว่ามีเหตุการณ์ล้นเกิดขึ้นหรือไม่ การใช้element.offsetHeight, element.offsetWidth, element.scrollHeightและelement.scrollWidthคุณสามารถตรวจสอบว่าองค์ประกอบของคุณมีเนื้อหาที่มีขนาดใหญ่กว่าขนาดของมัน:

if (element.offsetHeight < element.scrollHeight ||
    element.offsetWidth < element.scrollWidth) {
    // your element have overflow
} else {
    // your element doesn't have overflow
}

ดูตัวอย่างการดำเนินการ: Fiddle

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

ป้อนคำอธิบายภาพที่นี่

หากคุณต้องการนับรายการที่มองเห็นได้ครึ่งหนึ่งมันจะเป็นสคริปต์ที่คุณต้องการ:

var invisibleItems = [];
for(var i=0; i<element.childElementCount; i++){
  if (element.children[i].offsetTop + element.children[i].offsetHeight >
      element.offsetTop + element.offsetHeight ||
      element.children[i].offsetLeft + element.children[i].offsetWidth >
      element.offsetLeft + element.offsetWidth ){

        invisibleItems.push(element.children[i]);
    }

}

และถ้าคุณไม่ต้องการนับแบบกึ่งมองเห็นคุณสามารถคำนวณโดยมีผลต่างเพียงเล็กน้อย


แก้ไขฉันถ้าฉันผิด แต่ดูเหมือนว่าจะไม่ทำงานอีกต่อไป Chrome V.20.0.1132.57 หากคุณเปลี่ยนข้อความภายใน div สีพื้นหลังจะยังคงเป็นสีเหลืองjsbin.com/ujiwah/25/edit#javascript,html,live
Robbie

4
@Robbie <p>เป็นองค์ประกอบระดับบล็อกและใช้ความกว้าง 100% p{display:inline}หากคุณต้องการที่จะลองนี้กับจำนวนของข้อความภายในพีเพียงให้ pภายในข้อความวิธีการนี้จะกำหนดความกว้างของ
Mohsen

ฉันอ่าน "คุณไม่จำเป็นต้องใช้ jQuery ใด ๆ " และทันทีที่ไป "duh มันเป็นคณิตศาสตร์ง่ายๆ
Michael J.Calkins

1
ใช้งานได้กับกรณีส่วนใหญ่ แต่จะไม่ครอบคลุมสถานการณ์ด้วยตาราง CSS (แสดง table-cell, table-rwo, table) -
Dmitry

ฉันเข้าใจว่า offsetHeight มีเส้นขอบซึ่งไม่นับรวมในพื้นที่ที่เลื่อนได้ เพียงแค่ทราบ (แก้ไขฉันถ้าฉันผิด)
Lodewijk

38

ฉันมีคำถามเดียวกันกับ OP และไม่มีคำตอบใดที่ตรงกับความต้องการของฉัน ฉันต้องการเงื่อนไขง่ายๆสำหรับความต้องการง่ายๆ

นี่คือคำตอบของฉัน:

if ($("#myoverflowingelement").prop('scrollWidth') > $("#myoverflowingelement").width() ) {
  alert("this element is overflowing !!");
}
else {
 alert("this element is not overflowing!!");
}

นอกจากนี้คุณสามารถเปลี่ยนได้scrollWidthโดยscrollHeightหากต้องการทดสอบทั้งสองกรณี


1
ขอบคุณที่ได้ผลสำหรับฉัน ต้องการแค่ตัวอย่างง่ายๆใน jquery แต่ไม่ใช่ใน js ธรรมดา
mikhail-t

4
ใช้ไม่ได้กับองค์ประกอบที่มีช่องว่างภายใน / ระยะขอบ use outerWidth (true) instread of width
Vladimir Shmidt

ไม่ทำงานเช่นทำงานได้ดีในโมซิลล่าและโครเมี่ยม
Sushil Kumar

ฉันมีเอฟเฟกต์แปลก ๆ กับสคริปต์นี้ การทดสอบใน Chrome ฉันเขียนใหม่เพื่อตรวจสอบความสูง (โดยใช้ OuterHeight) และถ้าฉันใช้ F5 เพื่อโหลดหน้าซ้ำเพื่อตรวจสอบสคริปต์หรือนำทางไปยังหน้านั้นจากหน้าอื่นมันจะกลับมาเป็น overflow = true เสมอ แต่ถ้าฉันใช้ ctrl-F5 มันจะมา กลับเป็น overflow = false นี่คือตอนทดสอบสถานการณ์ที่ควรจะกลับมาเป็นเท็จ เมื่อมันควรจะเป็นจริงมันก็ใช้ได้เสมอ
Dennis

โอเคฉันคิดออกเอง ฉันมีแท็กสคริปต์ของฉันอยู่ใน window.addEventListener ('DOMContentLoaded') ดังนั้นพวกเขาจะทำงานกับ jquery ที่โหลดแบบอะซิงโครนัสและไฟล์อื่น ๆ แต่การเรียกใช้สคริปต์นี้ในขั้นตอนนั้นจะส่งกลับการอ่านที่ผิดพลาดอย่างเห็นได้ชัดดังนั้นสำหรับสคริปต์นี้ฉันจึงแทนที่ DOMContentLoaded ด้วย 'load' เพื่อชะลอการเรียกใช้สคริปต์ต่อไป ตอนนี้จะส่งคืนผลลัพธ์ที่ถูกต้องทุกครั้ง และสำหรับจุดประสงค์ของฉันมันเป็นเรื่องปกติดีที่จะรอให้เรียกใช้จนกว่าจะโหลดหน้าเว็บแล้วฉันยังสามารถเพิ่มภาพเคลื่อนไหวเพื่อเน้นความสนใจของผู้ใช้ไปที่ปุ่ม "อ่านเพิ่มเติม"
Dennis

4

ฉันจึงใช้ไลบรารี jquery ล้น: https://github.com/kevinmarx/overflow

หลังจากติดตั้งไลบรารีแล้วหากคุณต้องการกำหนดคลาสoverflowingให้กับองค์ประกอบที่มากเกินไปคุณเพียงแค่เรียกใช้:

$('.targetElement').overflowing('.parentElement')

จากนั้นจะให้ชั้นเรียนoverflowingเช่นเดียว <div class="targetElement overflowing">กับองค์ประกอบทั้งหมดที่ล้น จากนั้นคุณสามารถเพิ่มสิ่งนี้ลงในตัวจัดการเหตุการณ์ (คลิกเมาส์โอเวอร์) หรือฟังก์ชันอื่น ๆ ที่จะเรียกใช้โค้ดด้านบนเพื่อให้อัปเดตแบบไดนามิก


3

บางส่วนขึ้นอยู่กับคำตอบของ Mohsen (เงื่อนไขแรกที่เพิ่มเข้ามาครอบคลุมกรณีที่เด็กถูกซ่อนไว้ก่อนผู้ปกครอง):

jQuery.fn.isChildOverflowing = function (child) {
  var p = jQuery(this).get(0);
  var el = jQuery(child).get(0);
  return (el.offsetTop < p.offsetTop || el.offsetLeft < p.offsetLeft) ||
    (el.offsetTop + el.offsetHeight > p.offsetTop + p.offsetHeight || el.offsetLeft + el.offsetWidth > p.offsetLeft + p.offsetWidth);
};

จากนั้นทำ:

jQuery('#parent').isChildOverflowing('#child');

2

วิธีหนึ่งคือตรวจสอบ scrollTop กับตัวเอง กำหนดค่าการเลื่อนให้เนื้อหาใหญ่กว่าขนาดจากนั้นตรวจสอบว่า scrollTop เป็น 0 หรือไม่ (ถ้าไม่ใช่ 0 แสดงว่ามีโอเวอร์โฟลว์)

http://jsfiddle.net/ukvBf/


1

ในภาษาอังกฤษล้วน: รับองค์ประกอบหลัก ตรวจสอบความสูงและบันทึกค่านั้น จากนั้นวนซ้ำองค์ประกอบลูกทั้งหมดและตรวจสอบความสูงของแต่ละบุคคล

สิ่งนี้สกปรก แต่คุณอาจได้รับแนวคิดพื้นฐาน: http://jsfiddle.net/VgDgz/


1
เป็นตัวอย่างที่ดี แต่เรื่องตำแหน่ง หากองค์ประกอบอยู่ในตำแหน่งที่แน่นอนตลอดทางที่ด้านบนของพาเรนต์องค์ประกอบนั้นอาจล้นแม้ว่าความสูงจะต่ำกว่าพาเรนต์
adeneo

แน่นอนว่ามีหลายกรณีที่อาจทำให้เกิดปัญหานี้ได้ เพียงตัวอย่างสั้น ๆ ว่าจะเริ่มต้นที่ไหน กรณีเฉพาะของ Op อาจกำหนดสิ่งที่ต้องตรวจสอบ
Doozer Blake

0

นี่เป็นโซลูชัน jQuery ที่บริสุทธิ์ แต่ค่อนข้างยุ่ง:

var div_height = $(this).height();
var vertical_div_top_position = $(this).offset().top;
var lastchild_height = $(this).children('p:last-child').height();
var vertical_lastchild_top_position = $(this).children('p:last-child').offset().top;
var vertical_lastchild_bottom_position = lastchild_height + vertical_lastchild_top_position;
var real_height = vertical_lastchild_bottom_position - vertical_div_top_position;

if (real_height > div_height){
    //overflow div
}

0

นี่คือโซลูชัน jQuery ที่ใช้ได้ผลสำหรับฉัน offsetWidthฯลฯ ไม่ได้ผล

function is_overflowing(element, extra_width) {
    return element.position().left + element.width() + extra_width > element.parent().width();
}

หากไม่ได้ผลตรวจสอบให้แน่ใจว่าพาเรนต์ขององค์ประกอบมีความกว้างตามที่ต้องการ (โดยส่วนตัวฉันต้องใช้parent().parent()). positionสัมพันธ์กับพาเรนต์ฉันรวมไว้ด้วยextra_widthเนื่องจากองค์ประกอบของฉัน ("แท็ก") มีรูปภาพที่ใช้เวลาน้อยในการ โหลด แต่ในระหว่างการเรียกใช้ฟังก์ชันพวกเขามีความกว้างเป็นศูนย์ทำให้เสียการคำนวณเพื่อหลีกเลี่ยงสิ่งนั้นฉันใช้รหัสการโทรต่อไปนี้:

var extra_width = 0;
$(".tag:visible").each(function() {
    if (!$(this).find("img:visible").width()) {
        // tag image might not be visible at this point,
        // so we add its future width to the overflow calculation
        // the goal is to hide tags that do not fit one line
        extra_width += 28;
    }
    if (is_overflowing($(this), extra_width)) {
        $(this).hide();
    }
});

หวังว่านี่จะช่วยได้


0

ฉันแก้ไขสิ่งนี้โดยการเพิ่ม div อื่นในอันที่ล้น จากนั้นคุณเปรียบเทียบความสูงของ 2 div

<div class="AAAA overflow-hidden" style="height: 20px;" >
    <div class="BBBB" >
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </div>
</div>

และ js

    if ($('.AAAA').height() < $('.BBBB').height()) {
        console.log('we have overflow')
    } else {
        console.log('NO overflow')
    }

แบบนี้ดูง่ายกว่า ...

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