Periksa dengan jquery jika div memiliki elemen yang berlebihan

130

Saya memiliki div dengan ketinggian tetap dan overflow:hidden;

Saya ingin memeriksa dengan jQuery jika div memiliki elemen yang meluap melewati ketinggian tetap div tersebut. Bagaimana saya bisa melakukan ini?

Justin Meltzer
sumber
Saya bisa saja salah, tetapi saya tidak berpikir ada cara jQuery ajaib untuk memeriksa apakah suatu elemen di luar elemen lain. Anda mungkin harus memeriksa ketinggian dan posisi elemen di dalam div Anda dan melakukan beberapa perhitungan untuk melihat apakah elemen-elemen tersebut meluap.
adeneo
1
Ya, saya berpikir untuk memeriksa apakah perbedaan antara posisi bagian atas div dan posisi bagian bawah elemen anak terakhir di dalam div lebih besar daripada ketinggian div
Justin Meltzer
Kemungkinan duplikat elemen deteksi meluap menggunakan jquery
Noyo

Jawaban:

281

Anda sebenarnya tidak memerlukan jQuery untuk memeriksa apakah ada overflow atau tidak. Menggunakan element.offsetHeight, element.offsetWidth, element.scrollHeightdan element.scrollWidthAnda dapat menentukan apakah elemen Anda memiliki konten yang lebih besar dari ukuran itu:

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

Lihat contoh dalam aksi: Fiddle

Tetapi jika Anda ingin tahu elemen apa di dalam elemen Anda yang terlihat atau tidak, Anda perlu melakukan lebih banyak perhitungan. Ada tiga negara bagian untuk elemen anak dalam hal visibilitas:

masukkan deskripsi gambar di sini

Jika Anda ingin menghitung item semi-terlihat itu adalah skrip yang Anda butuhkan:

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

}

Dan jika Anda tidak ingin menghitung semi-terlihat, Anda dapat menghitung dengan sedikit perbedaan.

Mohsen
sumber
Perbaiki saya jika saya salah tetapi ini tampaknya tidak berfungsi lagi Chrome V.20.0.1132.57. Jika Anda mengubah teks di dalam div, warna latar tetap kuning, jsbin.com/ujiwah/25/edit#javascript,html,live
Robbie
4
@Robbie <p>adalah elemen level blok dan membutuhkan lebar 100%. Jika Anda ingin mencoba ini dengan jumlah teks di dalam p buat saja p{display:inline}. Dengan cara ini teks di dalam menentukan lebar p.
Mohsen
Saya membaca "Anda sebenarnya tidak memerlukan jQuery" dan segera berkata, "duh, ini matematika sederhana."
Michael J. Calkins
1
Bekerja untuk sebagian besar kasus tetapi tidak akan menutupi skenario dengan tabel CSS (display table-cell, table-rwo, table) -
Dmitry
Saya mengerti offsetHeight termasuk batas, yang tidak diperhitungkan pada area yang dapat digulir. Hanya sebuah catatan. (koreksi saya jika saya salah)
Lodewijk
38

Saya memiliki pertanyaan yang sama dengan OP, dan tidak ada jawaban yang sesuai dengan kebutuhan saya. Saya membutuhkan kondisi sederhana, untuk kebutuhan sederhana.

Inilah jawaban saya:

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

Juga, Anda dapat mengubah scrollWidthdengan scrollHeightjika Anda perlu untuk menguji kasus baik.

sidney
sumber
1
Terima kasih, itu berhasil untuk saya. hanya perlu contoh sederhana di jquery tetapi tidak di js polos.
mikhail-t
4
tidak berfungsi untuk elemen dengan padding / margin. gunakan instread lebar outerWidth (true)
Vladimir Shmidt
Tidak berfungsi yaitu, berfungsi dengan baik di mozilla dan chrome.
Sushil Kumar
Saya memiliki beberapa efek aneh dengan skrip ini. Menguji di Chrome. Saya menulis ulang untuk memeriksa ketinggian (menggunakan OuterHeight) dan jika saya menggunakan F5 untuk memuat ulang halaman untuk memeriksa skrip, atau menavigasi ke sana dari halaman lain, itu selalu kembali sebagai overflow = true, tetapi jika saya menggunakan ctrl-F5 itu datang kembali sebagai overflow = false. Ini adalah saat menguji situasi yang seharusnya kembali salah. Ketika itu seharusnya benar itu selalu berhasil.
Dennis
Ok, saya sendiri yang menemukannya. Saya memiliki tag skrip saya dibungkus dengan window.addEventListener ('DOMContentLoaded') sehingga mereka akan bekerja dengan jquery yang dimuat secara asinkron dan file lainnya. Tetapi menjalankan skrip ini pada tahap itu mengembalikan bacaan yang keliru, jadi untuk skrip ini saya mengganti DOMContentLoaded dengan hanya 'memuat' untuk menunda eksekusi skrip lebih lanjut. Sekarang ia mengembalikan hasil yang benar setiap waktu. Dan untuk keperluan saya, tidak apa-apa menunggu untuk menjalankannya sampai setelah halaman dimuat, maka saya bahkan dapat menambahkan animasi untuk menyoroti perhatian pengguna pada tombol "baca lebih lanjut".
Dennis
4

Jadi saya menggunakan perpustakaan jquery meluap: https://github.com/kevinmarx/overflowing

Setelah menginstal perpustakaan, jika Anda ingin menetapkan kelas overflowinguntuk semua elemen meluap, Anda cukup menjalankan:

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

Ini kemudian akan memberikan kelas overflowing, seperti pada <div class="targetElement overflowing">semua elemen yang meluap. Anda kemudian dapat menambahkan ini ke beberapa pengendali acara (klik, tetikus) atau fungsi lain yang akan menjalankan kode di atas sehingga pembaruan secara dinamis.

maudulus
sumber
3

Sebagian didasarkan pada jawaban Mohsen (kondisi pertama yang ditambahkan mencakup kasus di mana anak disembunyikan di hadapan orang tua):

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

Maka lakukan saja:

jQuery('#parent').isChildOverflowing('#child');
brauliobo
sumber
2

Salah satu metode adalah memeriksa scrollTop terhadap dirinya sendiri. Berikan konten nilai gulir lebih besar dari ukurannya dan kemudian periksa untuk melihat apakah scrollTopnya adalah 0 atau tidak (jika bukan 0, ia telah meluap.)

http://jsfiddle.net/ukvBf/

Joseph Marikle
sumber
1

Dalam bahasa Inggris biasa: Dapatkan elemen induk. Periksa ketinggiannya, dan simpan nilainya. Kemudian putar semua elemen anak dan periksa ketinggian masing-masing.

Ini kotor, tetapi Anda mungkin mendapatkan ide dasarnya: http://jsfiddle.net/VgDgz/

Doozer Blake
sumber
1
Ini contoh yang bagus, tapi bagaimana dengan posisinya. Jika suatu elemen diposisikan absolut jauh di atas induknya, ia dapat meluap walaupun tingginya lebih rendah dari induknya.
adeneo
Tentu saja, ada beberapa kasus berbeda yang dapat menyebabkannya. Hanya contoh cepat dari mana harus memulai. Kasus spesifik Op mungkin akan menentukan apa yang perlu diperiksa
Doozer Blake
0

Ini solusi jQuery murni, tapi agak berantakan:

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
}
Justin Meltzer
sumber
0

Ini adalah solusi jQuery yang bekerja untuk saya. offsetWidthdll tidak bekerja.

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

Jika ini tidak berhasil, pastikan bahwa induk elemen memiliki lebar yang diinginkan (secara pribadi, saya harus menggunakan parent().parent()). positionRelatif terhadap induk. Saya juga menyertakan extra_widthkarena elemen saya ("tag") berisi gambar yang membutuhkan waktu sedikit untuk memuat, tetapi selama panggilan fungsi mereka memiliki lebar nol, merusak perhitungan. Untuk menyiasatinya, saya menggunakan kode panggilan berikut:

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

Semoga ini membantu.

Dennis Golomazov
sumber
0

Saya memperbaikinya dengan menambahkan div lain di salah satu yang meluap. Kemudian Anda membandingkan ketinggian 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>

dan js

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

Ini terlihat lebih mudah ...

alex toader
sumber