Перевірте за допомогою jquery, чи в div є переповнені елементи


130

У мене є дів з фіксованою висотою і overflow:hidden;

Я хочу перевірити за допомогою jQuery, чи є в розділі елементи, які переповнюються повз фіксовану висоту діла. Як я можу це зробити?


Я можу помилитися, але я не думаю, що існує магічний спосіб jQuery перевірити, чи є елемент поза іншим елементом. Ймовірно, вам доведеться перевірити висоту та положення елементів всередині вашого діва та зробити кілька розрахунків, щоб побачити, чи вони переповнюються.
adeneo

1
Так, я думав перевірити, чи різниця між положенням верху діва та положенням нижнього дочірнього елемента всередині діва більша за висоту діва
Джастін Мельцер

Можливий
повтор

Відповіді:


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
Роббі

4
@Robbie <p>- це елемент рівня блоку і займає 100% ширини. Якщо ви хочете спробувати це з кількістю тексту всередині p, просто зробіть p{display:inline}. Таким чином текст усередині визначає ширину p.
Мохсен

Я прочитав "Насправді вам не потрібен жоден jQuery" і одразу перейшов "так, це проста математика".
Майкл Дж. Калкінс

1
Працює в більшості випадків, але не прикриває сценарій таблицями CSS (відображення стільникової комірки, table-rwo, table) -
Дмитро

Я розумію, що зміщення висоти включає межі, які не враховуються до прокручуваної області. Просто записка. (виправте мене, якщо я помиляюся)
Lodewijk

38

У мене було те саме питання, що і в ОП, і жоден із цих відповідей не відповідав моїм потребам. Мені потрібна була проста умова, для простої потреби.

Ось моя відповідь:

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
не працює для елементів із набиванням / запасом. використовуйте зовнішню (справжню) величину ширини
Володимир Шмідт

Не працює в тобто, прекрасно працює в мозіллі та хромі.
Сушил Кумар

У мене є деякі дивні ефекти з цим сценарієм. Тестування в Chrome. Я переписав його, щоб перевірити висоту (використовуючи OuterHeight), і якщо я використовую F5 для перезавантаження сторінки для перевірки сценарію або переходу на нього з іншої сторінки, він завжди повертається як переповнення = true, але якщо я використовую ctrl-F5, він приходить назад як переповнення = хибне. Це під час тестування ситуації, яка повинна повернутися помилковою. Коли це має бути правдою, це завжди працює.
Денніс

Гаразд я сам це зрозумів. У мене є теги скриптів, загорнуті у window.addEventListener ("DOMContentLoaded"), щоб вони працювали з моїм асинхронно завантаженим jquery та іншими файлами. Але запуск цього сценарію на цьому етапі повертає, мабуть, помилкові показання, тому для цього сценарію я замінив DOMContentLoaded лише «завантаженням», щоб затримати виконання сценарію далі. Тепер він щоразу повертає правильні результати. І для моїх цілей прекрасно, що він чекає запуску його до завантаження сторінки, тоді я навіть можу додати анімацію, щоб підкреслити увагу користувачів кнопкою "прочитати більше".
Денніс

4

Тому я використав переповнену бібліотеку jquery: https://github.com/kevinmarx/overflowing

Після установки бібліотеки, якщо ви хочете призначити клас overflowingусім переповненим елементам, просто запустіть:

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

Це дасть клас overflowing, як <div class="targetElement overflowing">і всі елементи, що переповнюються. Потім ви можете додати це до якогось обробника подій (клацання, перехід миші) або іншої функції, яка запустить вищевказаний код, щоб він динамічно оновлювався.


3

Частково грунтується на відповіді Мохсена (додана перша умова охоплює випадок, коли дитина ховається перед батьком):

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 проти себе. Надайте вмісту значення прокрутки, що перевищує його розмір, а потім перевірте, чи є його прокрутка 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 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')
    }

Це виглядає простіше ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.