Jquery ile div'in taşan öğeleri olup olmadığını kontrol edin


130

Sabit yüksekliğe sahip bir div'im var ve overflow:hidden;

JQuery ile div öğesinin div'in sabit yüksekliğini aşan öğeleri olup olmadığını kontrol etmek istiyorum. Bunu nasıl yapabilirim?


Yanılıyor olabilirim, ancak bir öğenin başka bir öğenin dışında olup olmadığını kontrol etmenin sihirli bir jQuery yolu olduğunu sanmıyorum. Muhtemelen div'inizdeki öğelerin yüksekliğini ve konumunu kontrol etmeniz ve taşıp taşmadıklarını görmek için bazı hesaplamalar yapmanız gerekir.
adeneo

1
Evet, div'in üst kısmının konumu ile div içindeki son alt öğenin altının konumu arasındaki farkın div'in yüksekliğinden daha büyük olup olmadığını kontrol etmeyi düşünüyordum
Justin Meltzer

Yanıtlar:


281

Aslında bir taşma olup olmadığını kontrol etmek için herhangi bir jQuery'ye ihtiyacınız yoktur. Kullanılması element.offsetHeight, element.offsetWidth, element.scrollHeightve element.scrollWidthsenin eleman 's boyutundan daha içerik büyük varsa belirleyebilirsiniz:

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

Eylemdeki örneğe bakın: Fiddle

Ancak, öğenizin içindeki hangi öğenin görünür olup olmadığını bilmek istiyorsanız, o zaman daha fazla hesaplama yapmanız gerekir. Görünürlük açısından bir alt öğe için üç durum vardır:

görüntü açıklamasını buraya girin

Yarı görünür öğeleri saymak istiyorsanız, ihtiyacınız olan komut dosyası olacaktır:

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

}

Yarı görünür saymak istemiyorsanız, küçük bir farkla hesaplayabilirsiniz.


Yanılıyorsam düzelt ama bu artık çalışmıyor Chrome V.20.0.1132.57. Div içindeki metni değiştirirseniz, arka plan rengi sarı kalır, jsbin.com/ujiwah/25/edit#javascript,html,live
Robbie

4
@Robbie <p>, blok seviyesinde bir öğedir ve% 100 genişliğe sahiptir. Bunu denemek istiyorsanız, sadece p içindeki metin miktarı ile yapın p{display:inline}. Bu şekilde içindeki metin genişliğini belirler p.
Mohsen

"Aslında jQuery'ye ihtiyacınız yok" u okudum ve hemen "ha, bu basit matematik" dedim.
Michael J. Calkins

1
Çoğu durumda işe yarar, ancak senaryoyu CSS tablolarıyla örtmez (tablo hücresi, tablo-rwo, tablo) -
Dmitry

OffsetHeight'ın kaydırılabilir alan olarak sayılmayan kenarlıklar içerdiğini anlıyorum. Sadece bir not. (yanılıyorsam düzeltin)
Lodewijk

38

OP ile aynı soruyu sordum ve bu yanıtların hiçbiri ihtiyaçlarıma uymuyordu. Basit bir ihtiyaç için basit bir duruma ihtiyacım vardı.

İşte cevabım:

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

Ayrıca, değiştirebilir scrollWidthtarafından scrollHeightya durumda test etmek gerekirse.


1
Teşekkürler, bu benim için çalıştı. sadece jquery'de basit bir örneğe ihtiyacım vardı, düz js'de değil.
mikhail-t

4
padding / margin içeren öğeler için çalışmaz. OuterWidth (true) instread of width
Vladimir Shmidt

İe'de çalışmıyor, mozilla ve chrome'da gayet iyi çalışıyor.
Sushil Kumar

Bu senaryoda bazı tuhaf etkilerim var. Chrome'da test ediliyor. Yüksekliği kontrol etmek için (OuterHeight kullanarak) yeniden yazdım ve komut dosyasını kontrol etmek için bir sayfayı yeniden yüklemek için F5 kullanırsam veya başka bir sayfadan ona gidersem, her zaman overflow = true olarak geri gelir, ancak ctrl-F5 kullanırsam gelir taşma olarak geri = yanlış. Bu, yanlış dönmesi beklenen bir durumu test ederken gerçekleşir. Doğru olması gerektiğinde her zaman işe yarar.
Dennis

Tamam kendim çözdüm. Betik etiketlerim window.addEventListener ('DOMContentLoaded') içine sarılmış durumda, böylece eşzamansız olarak yüklenen jquery ve diğer dosyalarımla çalışacaklar. Ancak bu komut dosyasını bu aşamada çalıştırmak görünüşte yanlış okumalar döndürüyor, bu nedenle komut dosyasının yürütülmesini daha da geciktirmek için bu komut dosyası için DOMContentLoaded'ı yalnızca 'load' ile değiştirdim. Artık her seferinde doğru sonuçları veriyor. Ve benim amacım için, sayfa yüklenene kadar çalıştırmayı beklemesi gayet iyi, o zaman kullanıcıların dikkatini "daha fazla oku" düğmesine vurgulamak için bir animasyon bile ekleyebilirim.
Dennis

4

Bu yüzden taşan jquery kitaplığını kullandım: https://github.com/kevinmarx/overflowing

Kitaplığı kurduktan sonra, sınıfı overflowingtüm taşan öğelere atamak isterseniz , şunu çalıştırmanız yeterlidir:

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

Bu daha sonra , taşan tüm öğelerde olduğu overflowinggibi sınıfı verecektir <div class="targetElement overflowing">. Daha sonra bunu bir olay işleyicisine (tıklama, fareyle üzerine gelme) veya yukarıdaki kodu çalıştıracak başka bir işleve ekleyebilirsiniz, böylece dinamik olarak güncellenir.


3

Kısmen Mohsen'in cevabına dayanmaktadır (eklenen ilk koşul, çocuğun ebeveynden önce gizlendiği durumu kapsar):

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

O zaman yap:

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

2

Bir yöntem, scrollTop'u kendisine karşı kontrol etmektir. İçeriğe boyutundan daha büyük bir kaydırma değeri verin ve ardından scrollTop değerinin 0 olup olmadığını kontrol edin (0 değilse, taşması vardır.)

http://jsfiddle.net/ukvBf/


1

Düz İngilizce: Ana öğeyi alın. Yüksekliğini kontrol edin ve bu değeri kaydedin. Ardından tüm alt unsurları gözden geçirin ve bireysel yüksekliklerini kontrol edin.

Bu kirli, ancak temel fikre sahip olabilirsiniz: http://jsfiddle.net/VgDgz/


1
Bu iyi bir örnek, peki ya pozisyon. Bir öğe mutlak olarak üst öğenin tepesine tamamen yerleştirilirse, yükseklik üst öğeden daha düşük olsa bile taşabilir.
adeneo

Kesinlikle, buna neden olabilecek pek çok farklı durum vardır. Belki nereden başlayacağınıza dair hızlı bir örnek.
Op'un

0

İşte saf bir jQuery çözümü, ancak oldukça karmaşık:

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

Bu benim için çalışan jQuery çözümü. offsetWidthvb işe yaramadı.

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

Bu işe yaramazsa, öğelerin ebeveyninin istenen genişliğe sahip olduğundan emin olun (kişisel olarak, kullanmak zorunda kaldım parent().parent()). positionEbeveyne göre. extra_widthÖğelerim ("etiketler") de kısa zaman alan resimler içerdiği için de dahil ettim yük, ancak işlev çağrısı sırasında sıfır genişliğe sahipler, bu da hesaplamayı bozuyor. Bunu aşmak için aşağıdaki çağrı kodunu kullanıyorum:

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

Bu yardımcı olur umarım.


0

Bunu, taşan birine başka bir div ekleyerek düzelttim. Sonra 2 div'in yüksekliklerini karşılaştırırsınız.

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

ve js

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

Bu daha kolay görünüyor ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.