Detetando Elementos que Estão Transbordando em um div
com jQuery
Resposta Rápida
Para detectar transbordo em um div
, compare innerWidth()
e innerHeight()
com prop('scrollWidth')
e prop('scrollHeight')
. Se o scrollWidth
exceder o innerWidth
, ou o scrollHeight
exceder o innerHeight
, está ocorrendo transbordo. Aqui está um exemplo de código que realiza essa operação:
var $div = $('#divId'); // Aqui está o nosso div.
var overflowX = $div.innerWidth() < $div.prop('scrollWidth');
var overflowY = $div.innerHeight() < $div.prop('scrollHeight');
console.log(overflowX || overflowY ? 'Atenção, temos um problema.' : 'Tudo certo, sem transbordo.');
Substitua #divId
pelo ID do div
que você precisa, e as informações sobre o transbordo serão registradas no console.
Métodos Avançados de Detecção
Se você precisa de uma verificação mais detalhada, utilize métodos avançados para detectar transbordo.
Monitorando Mudanças
Conteúdo que muda dinamicamente pode causar transbordo. Para rastrear tais mudanças, use manipuladores de eventos como input
, resize
ou DOMNodeInserted
.
$div.on('input resize DOMNodeInserted', function() {
// Aqui você pode incluir sua verificação de transbordo da Resposta Rápida
});
Encontrando Elementos Filhos Ocultos
Identifique elementos filhos que estão totalmente visíveis ou parcialmente ocultos. Você pode avaliar sua visibilidade usando offsetTop
, offsetLeft
, offsetHeight
e offsetWidth
.
$.fn.isChildOverflowing = function() {
var $parent = this;
var bottomPai = $parent.offset().top + $parent.innerHeight();
return $parent.find('*').filter(function() {
var $child = $(this);
return $child.offset().top >= bottomPai;
}).length > 0;
};
var hasOverflowingChild = $div.isChildOverflowing();
console.log(hasOverflowingChild ? 'Atenção, um filho está transbordando!' : 'Todos os filhos estão visíveis.');
Este método é semelhante a checar se cada elemento permanece dentro dos limites do seu pai div
.
Como Ocorre o Transbordo
O transbordo é uma inevitabilidade. A chave é estar preparado para tais situações.
Estilizando Elementos em Transbordo
Quando ocorre transbordo, os elementos ainda podem ser estilizados. Use a classe overflowing
para destacá-los.
if (overflowX || overflowY) {
$div.addClass('overflowing');
}
Ajuste de Altura Adaptativa
Assim como em um famoso conto de fadas, com jQuery você pode ajustar a altura do div
para que ele se encaixe perfeitamente no conteúdo atual.
if (overflowY) {
$div.height($div.prop('scrollHeight'));
}
Pense no div
como um alfaiate habilidoso que pode ajustar perfeitamente a altura de acordo com o conteúdo.
Visualização
Imagine o div
como um vaso transparente (🏺), e os elementos dentro dele como bolas coloridas (🔵🟢🔴). Quando essas bolas começam a transbordar do vaso, o CSS vem em socorro:
🏺: [🔵🟢🔴🔵] <-- Bolas visíveis
[🟢🔴🟢] <-- Bolas ocultas
E aqui vem a mágica do CSS para destacar os elementos que estão transbordando:
.overflowing {
border: 2px solid red;
}
Ao atribuir a classe overflowing
ao seu div
, você marca visualmente o transbordo.
Prevendo e Respondendo ao Transbordo
Uma estratégia proativa ajudará a evitar muitos problemas.
Flexibilidade às Mudanças
O conteúdo está em constante mudança. Evite alturas fixas e não esconda o transbordo. Esteja preparado para alterações na forma como os dados são exibidos.
Três Estágios de Visibilidade
Todos os elementos filhos do div
podem estar totalmente visíveis, parcialmente visíveis ou ocultos. Ao estilizar, certifique-se de considerar isso para manter a interface limpa e visualmente atraente.
Otimizando Atualizações de Estado
Use uma combinação de delegação de eventos e throttling para um rastreamento eficaz de transbordo e atualizações de estado sem desacelerar a aplicação web.
Recursos Úteis
- JavaScript - Determinar se o conteúdo de um elemento HTML está transbordando - Stack Overflow
- .width() | Documentação da API jQuery
- .outerWidth() | Documentação da API jQuery
- Determinando as dimensões dos elementos - Web APIs | MDN
- overflow | CSS-Tricks - CSS-Tricks
- Popping Out of Hidden Overflow | CSS-Tricks - CSS-Tricks
- scroll event | Documentação da API jQuery