이것이 답입니까?
"무엇을 계산해야하지만 표시하지 않으면 요소를 visibility:hidden
and로 설정하고 position:absolute
DOM 트리에 추가하고 offsetHeight를 가져 와서 제거하십시오 (이것은 프로토 타입 라이브러리가 마지막으로 확인했을 때 줄 뒤에서 수행하는 작업입니다)."
여러 요소에 대해 동일한 문제가 있습니다. 사이트에서 사용할 jQuery 또는 Prototype은 없지만 작동하는 경우 기술을 빌리는 것을 선호합니다. 작동하지 않은 몇 가지 예를 들어 다음과 같은 코드가 있습니다.
// Layout Height Get
function fnElementHeightMaxGet(DoScroll, DoBase, elementPassed, elementHeightDefault)
{
var DoOffset = true;
if (!elementPassed) { return 0; }
if (!elementPassed.style) { return 0; }
var thisHeight = 0;
var heightBase = parseInt(elementPassed.style.height);
var heightOffset = parseInt(elementPassed.offsetHeight);
var heightScroll = parseInt(elementPassed.scrollHeight);
var heightClient = parseInt(elementPassed.clientHeight);
var heightNode = 0;
var heightRects = 0;
//
if (DoBase) {
if (heightBase > thisHeight) { thisHeight = heightBase; }
}
if (DoOffset) {
if (heightOffset > thisHeight) { thisHeight = heightOffset; }
}
if (DoScroll) {
if (heightScroll > thisHeight) { thisHeight = heightScroll; }
}
//
if (thisHeight == 0) { thisHeight = heightClient; }
//
if (thisHeight == 0) {
// Dom Add:
// all else failed so use the protype approach...
var elBodyTempContainer = document.getElementById('BodyTempContainer');
elBodyTempContainer.appendChild(elementPassed);
heightNode = elBodyTempContainer.childNodes[0].offsetHeight;
elBodyTempContainer.removeChild(elementPassed);
if (heightNode > thisHeight) { thisHeight = heightNode; }
//
// Bounding Rect:
// Or this approach...
var clientRects = elementPassed.getClientRects();
heightRects = clientRects.height;
if (heightRects > thisHeight) { thisHeight = heightRects; }
}
//
// Default height not appropriate here
// if (thisHeight == 0) { thisHeight = elementHeightDefault; }
if (thisHeight > 3000) {
// ERROR
thisHeight = 3000;
}
return thisHeight;
}
기본적으로 모든 것을 시도하여 결과를 얻지 못합니다. 영향을 미치지 않는 ClientHeight. 문제 요소를 사용하면 기본적으로 NaN이 오프셋 및 스크롤 높이에서 0이됩니다. 그런 다음 Add DOM 솔루션과 clientRects를 사용하여 여기에서 작동하는지 확인했습니다.
2011 년 6 월 29 일, 필자는 예상 한 것보다 더 나은 결과로 DOM과 clientHeight에 모두 추가하기 위해 실제로 코드를 업데이트했습니다.
1) clientHeight도 0이었습니다.
2) 돔은 실제로 나에게 키를 주었다.
3) ClientRects는 DOM 기술과 거의 동일한 결과를 반환합니다.
추가 된 요소는 본질적으로 유동적이기 때문에 빈 DOM Temp 요소에 추가 될 때 해당 컨테이너의 너비에 따라 렌더링됩니다. 결국 이상으로 30px 더 짧기 때문에 이상합니다.
높이를 다르게 계산하는 방법을 보여주기 위해 몇 가지 스냅 샷을 추가했습니다.
높이 차이는 분명합니다. 절대 위치를 추가하고 숨길 수는 있지만 아무런 영향을 미치지 않습니다. 나는 이것이 작동하지 않을 것이라고 확신했다!
(더 멀어짐) 높이는 실제 렌더링 높이보다 낮습니다 (렌더링). 이것은 기존의 부모와 일치하도록 DOM Temp 요소의 너비를 설정하여 해결할 수 있으며 이론적으로 상당히 정확하게 수행 할 수 있습니다. 또한 제거하고 기존 위치에 다시 추가하여 어떤 결과가 발생하는지 알 수 없습니다. 그들이 innerHTML 기술을 통해 도착했을 때 나는이 다른 접근법을 사용하여 찾고 있습니다.
* 그러나 * 그 중 어느 것도 필요하지 않았습니다. 실제로 그것은 광고 된대로 작동하고 올바른 높이를 반환했습니다!
메뉴를 다시 표시 할 수 있었을 때 DOM은 페이지 상단의 유동적 레이아웃 당 올바른 높이 (279px)를 반환했습니다. 위의 코드는 280px를 반환하는 getClientRects도 사용합니다.
다음 스냅 샷에 설명되어 있습니다 (한 번 작업 한 후에 Chrome에서 가져옴).
이제 프로토 타입 트릭이 왜 작동하는지 전혀 알지 못합니다. 또는 getClientRects도 작동합니다.
이러한 특정 요소에 대한이 모든 문제의 원인은 appendChild 대신 innerHTML을 사용하는 것으로 의심되지만이 시점에서는 순수한 추측입니다.