Controlla con jquery se div ha elementi traboccanti


130

Ho un div con un'altezza fissa e overflow:hidden;

Voglio verificare con jQuery se il div ha elementi che traboccano oltre l'altezza fissa del div. Come posso fare questo?


Potrei sbagliarmi, ma non penso che ci sia un modo jQuery magico per verificare se un elemento è esterno a un altro elemento. Probabilmente dovresti controllare l'altezza e la posizione degli elementi all'interno del div e fare alcuni calcoli per vedere se traboccano.
adeneo,

1
Sì, stavo pensando di verificare se la differenza tra la posizione della parte superiore del div e la posizione della parte inferiore dell'ultimo elemento figlio all'interno del div fosse maggiore dell'altezza del div
Justin Meltzer,

Possibile duplicato dell'overflow degli elementi
Noyo,

Risposte:


281

In realtà non è necessario alcun jQuery per verificare se si verifica un overflow. Usando element.offsetHeight, element.offsetWidth, element.scrollHeighted element.scrollWidthè possibile determinare se il vostro elemento ha contenuto più grande di quanto le sue dimensioni:

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

Vedi esempio in azione: violino

Ma se vuoi sapere quale elemento all'interno del tuo elemento è visibile o meno, devi fare più calcoli. Esistono tre stati per un elemento figlio in termini di visibilità:

inserisci qui la descrizione dell'immagine

Se vuoi contare elementi semi-visibili sarebbe lo script che ti serve:

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

}

E se non vuoi contare semi-visibile puoi calcolare con una piccola differenza.


Correggimi se sbaglio, ma questo sembra non funzionare più Chrome V.20.0.1132.57. Se cambi il testo all'interno del div, il colore di sfondo rimane giallo, jsbin.com/ujiwah/25/edit#javascript,html,live
Robbie,

4
@Robbie <p>è un elemento a livello di blocco e ha una larghezza del 100%. Se vuoi provare questo con una quantità di testo all'interno della p, crea semplicemente p{display:inline}. In questo modo il testo all'interno determina la larghezza di p.
Mohsen,

Ho letto "In realtà non hai bisogno di alcun jQuery" e immediatamente sono andato "duh, è semplice matematica".
Michael J. Calkins,

1
Funziona per la maggior parte dei casi ma non copre lo scenario con tabelle CSS (display table-cell, table-rwo, table) -
Dmitry

Comprendo offsetHeight include i bordi, che non contano per l'area scorrevole. Solo una nota. (correggimi se sbaglio)
Lodewijk,

38

Avevo la stessa domanda del PO e nessuna di quelle risposte rispondeva alle mie esigenze. Avevo bisogno di una condizione semplice, per un'esigenza semplice.

Ecco la mia risposta:

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

Inoltre, è possibile modificare scrollWidthda scrollHeightse avete bisogno di testare la entrambi i casi.


1
Grazie, ha funzionato per me. avevo solo bisogno di un semplice esempio in jquery ma non in js semplice.
mikhail-t,

4
non funziona con elementi con riempimento / margine. usa outerWidth (true) per larghezza
Vladimir Shmidt,

Non funziona, vale a dire, funziona bene in Mozilla e Chrome.
Sushil Kumar,

Ho alcuni strani effetti con questo script. Test in Chrome. L'ho riscritto per controllare l'altezza (usando OuterHeight) e se uso F5 per ricaricare una pagina per controllare lo script, o navigo da un'altra pagina, torna sempre come overflow = true, ma se uso ctrl-F5 viene ritorna come overflow = false. Questo è quando si verifica una situazione che dovrebbe tornare falsa. Quando dovrebbe essere vero, funziona sempre.
Dennis,

Ok l'ho capito da solo. Ho i miei tag di script racchiusi in window.addEventListener ('DOMContentLoaded') in modo che funzionino con il mio jquery caricato in modo asincrono e altri file. Ma l'esecuzione di questo script in quella fase restituisce letture apparentemente false, quindi per questo script ho sostituito DOMContentLoaded con un semplice "caricamento" per ritardare ulteriormente l'esecuzione dello script. Ora restituisce risultati corretti ogni volta. E per i miei scopi è perfettamente bene che aspetti di eseguirlo fino a quando non viene caricata la pagina, quindi posso anche aggiungere un'animazione per evidenziare l'attenzione degli utenti su un pulsante "leggi di più".
Dennis,

4

Quindi ho usato la libreria jquery traboccante: https://github.com/kevinmarx/overflowing

Dopo aver installato la libreria, se si desidera assegnare la classe overflowinga tutti gli elementi di overflow, è sufficiente eseguire:

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

Questo darà quindi la classe overflowing, come in <div class="targetElement overflowing">tutti gli elementi che traboccano. È quindi possibile aggiungere questo ad alcuni gestori di eventi (clic, passaggio del mouse) o altre funzioni che eseguiranno il codice sopra riportato in modo che si aggiorni in modo dinamico.


3

Parzialmente basato sulla risposta di Mohsen (la prima condizione aggiunta copre il caso in cui il bambino è nascosto davanti al genitore):

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

Quindi fai semplicemente:

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

2

Un metodo consiste nel verificare scrollTop contro se stesso. Assegna al contenuto un valore di scorrimento maggiore della sua dimensione e quindi controlla se il suo scrollTop è 0 o meno (se non è 0, ha un overflow).

http://jsfiddle.net/ukvBf/


1

In parole povere: ottieni l'elemento genitore. Controlla la sua altezza e salva quel valore. Quindi scorrere tutti gli elementi figlio e verificarne le singole altezze.

Questo è sporco, ma potresti avere l'idea di base: http://jsfiddle.net/VgDgz/


1
È un buon esempio, ma per quanto riguarda la posizione. Se un elemento viene posizionato in modo assoluto nella parte superiore del genitore, potrebbe traboccare anche se l'altezza è inferiore al genitore.
adeneo,

Assolutamente, ci sono probabilmente diversi casi che potrebbero causarlo. Solo un rapido esempio di dove forse iniziare. Il caso specifico di Op definirà probabilmente ciò che deve essere verificato
Doozer Blake,

0

Ecco una soluzione jQuery pura, ma è piuttosto disordinata:

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

Questa è la soluzione jQuery che ha funzionato per me. offsetWidthecc. non ha funzionato.

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

Se questo non funziona, assicurati che il genitore degli elementi abbia la larghezza desiderata (personalmente, ho dovuto usarlo parent().parent()). positionÈ relativo al genitore. Ho anche incluso extra_widthperché i miei elementi ("tag") contengono immagini che impiegano poco tempo per caricare, ma durante la chiamata di funzione hanno larghezza zero, rovinando il calcolo. Per aggirare questo, uso il seguente codice chiamante:

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

Spero che questo ti aiuti.


0

Ho risolto questo aggiungendo un altro div in quello che trabocca. Quindi si confrontano le altezze dei 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>

e il js

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

Sembra più facile ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.