답변:
.scrollHeight
DOM 노드 의 속성을 사용하십시오 .$('#your_div')[0].scrollHeight
scrollHeight
또한 때로는 숨겨져 있거나 부모가 숨겨져 있으면 성가신 경우 0을 반환합니다.
overflow: hidden
: /
document.getElementById('your_div').scrollHeight
다른 가능성은 HTML을 오버플로가 아닌 비 숨겨진 요소에 배치하는 것입니다 : 위치 절대 상단과 왼쪽 아래로 5000px와 같이 화면의 'out'에 배치 한 다음이 요소 높이를 읽으십시오. 추악하지만 잘 작동합니다.
나는 이것을 위해 또 다른 해결책을 요리했습니다. 더 이상-최대에서 최대 높이 값을 사용할 필요가 없습니다. 접힌 DIV의 내부 높이를 계산하려면 몇 줄의 자바 스크립트 코드가 필요하지만 그 후에는 모두 CSS입니다.
1) 페치 및 설정 높이
축소 된 요소의 내부 높이를 가져옵니다 (을 사용하여 scrollHeight
). 내 요소에는 클래스가 .section__accordeon__content
있으며 실제로 forEach()
모든 패널의 높이를 설정하기 위해 루프 에서 이것을 실행 하지만 아이디어를 얻습니다.
document.querySelectorAll( '.section__accordeon__content' ).style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
2) CSS 변수를 사용하여 활성 항목을 확장하십시오
그런 다음 max-height
항목에 .active
클래스 가있을 때 CSS 변수를 사용하여 값 을 설정하십시오 .
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
마지막 예
전체 예제는 다음과 같습니다. 먼저 모든 아코디언 패널을 반복하고 해당 scrollHeight
값을 CSS 변수로 저장 합니다. 그런 다음 CSS 변수를 max-height
요소의 활성 / 확장 / 열림 상태 값으로 사용하십시오.
자바 스크립트 :
document.querySelectorAll( '.section__accordeon__content' ).forEach(
function( accordeonPanel ) {
accordeonPanel.style.cssText = "--accordeon-height: " + accordeonPanel.scrollHeight + "px";
}
);
CSS :
.section__accordeon__content {
max-height: 0px;
overflow: hidden;
transition: all 425ms cubic-bezier(0.465, 0.183, 0.153, 0.946);
}
.section__accordeon__content.active {
max-height: var(--accordeon-height);
}
그리고 거기 있습니다. CSS와 몇 줄의 JavaScript 코드 (jQuery 필요 없음) 만 사용하는 적응 가능한 최대 높이 애니메이션.
이것이 미래의 누군가 (또는 내 미래의 자기 참조)를 돕기를 바랍니다.
넘치지 않고 네거티브 마진으로 숨어있는 사람들의 경우 :
$('#element').height() + -parseInt($('#element').css("margin-top"));
(추악하지만 지금까지 작동하는 것만)
또 다른 간단한 해결책 (매우 우아하지는 않지만 너무 추한 것도 아닙니다)은 내부를 배치 한 div / span
다음 높이를 얻는 것입니다 ( $(this).find('span).height()
).
이 전략을 사용하는 예는 다음과 같습니다.
$(".more").click(function(){
if($(this).parent().find('.showMore').length) {
$(this).parent().find('.showMore').removeClass('showMore').css('max-height','90px');
$(this).parent().find('.more').removeClass('less').text('More');
} else {
$(this).parent().find('.text').addClass('showMore').css('max-height',$(this).parent().find('span').height());
$(this).parent().find('.more').addClass('less').text('Less');
}
});
* {transition: all 0.5s;}
.text {position:relative;width:400px;max-height:90px;overflow:hidden;}
.showMore {}
.text::after {
content: "";
position: absolute; bottom: 0; left: 0;
box-shadow: inset 0 -26px 22px -17px #fff;
height: 39px;
z-index:99999;
width:100%;
opacity:1;
}
.showMore::after {opacity:0;}
.more {border-top:1px solid gray;width:400px;color:blue;cursor:pointer;}
.more.less {border-color:#fff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
<div class="text">
<span>
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.
</span></div>
<div class="more">More</div>
</div>
(이 특정 예제는이 트릭을 사용하여 최대 높이에 애니메이션을 적용하고 접을 때 애니메이션 지연을 피합니다 (max-height 속성에 높은 수를 사용하는 경우).
.scrollHeight
DOM 기능은 IE <8.0 (작동하지 않습니다 developer.mozilla.org/en/DOM/element.scrollHeight )