div에 넘치는 요소가 있는지 jquery로 확인하십시오.


130

높이가 고정 된 div가 있고 overflow:hidden;

div에 div의 고정 높이를 초과하는 요소가 있는지 jQuery로 확인하고 싶습니다. 어떻게해야합니까?


틀릴 수도 있지만 요소가 다른 요소 밖에 있는지 확인하는 마법의 jQuery 방법이 없다고 생각합니다. div 내부의 요소의 높이와 위치를 확인하고 오버플로가 발생하는지 계산해야합니다.
adeneo

1
사업부의 정상의 위치와 사업부 내 마지막 자식 요소의 하단의 위치 사이의 차이는 DIV의 높이보다 큰 경우 네, 확인 생각
저스틴 멜쩌

답변:


281

실제로 오버플로가 발생하는지 여부를 확인하기 위해 jQuery가 필요하지 않습니다. 사용 element.offsetHeight, element.offsetWidth, element.scrollHeightelement.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
Robbie

4
@Robbie <p>는 블록 레벨 요소이며 너비는 100 %입니다. p 안에 많은 양의 텍스트로 이것을 시도하려면 make하십시오 p{display:inline}. 이렇게하면 내부 텍스트가 너비를 결정 p합니다.
Mohsen

"실제로 jQuery가 필요하지 않습니다."를 읽고 즉시 "duh, 간단한 수학입니다."
Michael J. Calkins

1
대부분의 경우 작동하지만 CSS 테이블 (디스플레이 테이블 셀, 테이블 rwo, 테이블)로 시나리오를 다루지 않습니다. –
Dmitry

오프셋 높이에는 테두리가 포함되며 스크롤 가능한 영역에는 포함되지 않습니다. 그냥 참고하십시오. (내가 틀렸다면 나를 고치세요)
Lodewijk

38

나는 OP와 같은 질문을 받았으며 그 대답 중 어느 것도 나의 필요에 맞지 않았다. 간단한 요구가 필요한 간단한 조건이 필요했습니다.

내 대답은 다음과 같습니다.

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
여백 / 여백이있는 요소에는 작동하지 않습니다. 사용 outerWidth 폭 (참) instread
블라디미르 Shmidt

즉, 모질라와 크롬에서 잘 작동합니다.
Sushil Kumar

이 스크립트에는 이상한 효과가 있습니다. Chrome에서 테스트 중입니다. 높이를 확인하기 위해 다시 작성하고 (OuterHeight 사용) F5를 사용하여 페이지를 다시로드하여 스크립트를 확인하거나 다른 페이지에서 탐색하면 항상 overflow = true로 돌아옵니다. 그러나 ctrl-F5를 사용하면 나타납니다. 오버플로 = 거짓으로 다시. 이것은 거짓으로 돌아올 것으로 예상되는 상황을 테스트 할 때입니다. 그것이 사실이라고 가정하면 항상 작동합니다.
Dennis

좋아, 나는 그것을 스스로 알아 냈다. 내 스크립트 태그가 window.addEventListener ( 'DOMContentLoaded')에 래핑되어 비동기식으로로드 된 jquery 및 기타 파일과 함께 작동합니다. 그러나이 단계 에서이 스크립트를 실행하면 분명히 잘못된 판독 값이 반환 되므로이 스크립트의 경우 스크립트 실행을 더 지연시키기 위해 DOMContentLoaded를 'load'로 바꿨습니다. 이제 매번 올바른 결과를 반환합니다. 그리고 내 목적을 위해 페이지가로드 될 때까지 실행되기를 기다리는 것이 완벽합니다. 애니메이션을 추가하여 "더 읽기"버튼에주의를 집중시킬 수도 있습니다.
Dennis

4

그래서 넘침되는 jquery 라이브러리를 사용했습니다 : https://github.com/kevinmarx/overflowing

라이브러리를 설치 한 후 overflowing모든 오버 플로우 요소에 클래스 를 지정하려면 다음을 실행하십시오.

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

그러면 넘친 모든 요소 overflowing와 마찬가지로 클래스가 제공됩니다 <div class="targetElement overflowing">. 그런 다음이 이벤트 코드 (클릭, 마우스 오버) 또는 위 코드를 실행하는 다른 함수에 추가하여 동적으로 업데이트 할 수 있습니다.


3

Mohsen의 답변에 부분적으로 근거합니다 (추가 된 첫 번째 조건은 자녀가 부모보다 먼저 숨겨지는 경우를 포함합니다).

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을 자체적으로 확인하는 것입니다. 내용에 크기보다 큰 스크롤 값을 제공 한 다음 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내 요소 ( "태그") 작은 시간이 걸릴 이미지를 포함하기 때문에 함수 호출 중에는 너비가 0이며 계산이 손상됩니다.

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의 높이를 비교하십시오.

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

이것은 더 쉬워 보인다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.