요소가 보이지 않을 때 jQuery에서 width ()가 0을 반환하는 것 같습니다. 말이되지만 부모를 표시하기 전에 부모의 너비를 설정하려면 테이블의 너비를 가져와야합니다.
아래에서 언급했듯이 부모에는 텍스트가있어 부모가 왜곡되고 불쾌 해 보입니다. 부모가 테이블만큼 넓고 텍스트 줄 바꿈이 있기를 바랍니다.
<div id="parent">
Text here ... Can get very long and skew the parent
<table> ... </table>
Text here too ... which is why I want to shrink the parent based on the table
</div>
CSS :
#parent
{
display: none;
}
자바 스크립트 :
var tableWidth = $('#parent').children('table').outerWidth();
if (tableWidth > $('#parent').width())
{
$('#parent').width(tableWidth);
}
tableWidth는 보이지 않기 때문에 항상 0을 반환합니다 (보이는 경우 숫자를 제공하기 때문에 내 추측입니다). 부모를 표시하지 않고 테이블의 너비를 얻는 방법이 있습니까?
답변
여기 내가 사용한 트릭이 있습니다. CSS 속성을 추가하여 jQuery가 요소를 볼 수 있다고 생각하도록 만들지 만 실제로는 여전히 숨겨져 있습니다.
var $table = $("#parent").children("table");
$table.css({ position: "absolute", visibility: "hidden", display: "block" });
var tableWidth = $table.outerWidth();
$table.css({ position: "", visibility: "", display: "" });
일종의 해킹이지만 저에게는 잘 작동하는 것 같습니다.
최신 정보
이 주제를 다루는 블로그 게시물 을 작성했습니다 . 위에서 사용 된 방법은 CSS 속성을 빈 값으로 재설정하기 때문에 문제가 될 수 있습니다. 이전에 가치가 있었다면 어떨까요? 업데이트 된 솔루션은 jQuery 소스 코드에있는 swap () 메서드를 사용합니다.
참조 된 블로그 게시물의 코드 :
//Optional parameter includeMargin is used when calculating outer dimensions
(function ($) {
$.fn.getHiddenDimensions = function (includeMargin) {
var $item = this,
props = { position: 'absolute', visibility: 'hidden', display: 'block' },
dim = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 },
$hiddenParents = $item.parents().andSelf().not(':visible'),
includeMargin = (includeMargin == null) ? false : includeMargin;
var oldProps = [];
$hiddenParents.each(function () {
var old = {};
for (var name in props) {
old[name] = this.style[name];
this.style[name] = props[name];
}
oldProps.push(old);
});
dim.width = $item.width();
dim.outerWidth = $item.outerWidth(includeMargin);
dim.innerWidth = $item.innerWidth();
dim.height = $item.height();
dim.innerHeight = $item.innerHeight();
dim.outerHeight = $item.outerHeight(includeMargin);
$hiddenParents.each(function (i) {
var old = oldProps[i];
for (var name in props) {
this.style[name] = old[name];
}
});
return dim;
}
}(jQuery));
답변
function realWidth(obj){
var clone = obj.clone();
clone.css("visibility","hidden");
$('body').append(clone);
var width = clone.outerWidth();
clone.remove();
return width;
}
realWidth($("#parent").find("table:first"));
답변
Roberts 답변에 따라 여기에 내 기능이 있습니다. 요소 또는 부모가 jQuery를 통해 페이드 아웃 된 경우 내부 또는 외부 치수를 가져올 수 있으며 오프셋 값도 반환 할 수 있습니다.
/ edit1 : 함수를 다시 작성했습니다. 이제 더 작아졌고 객체에서 직접 호출 할 수 있습니다.
/ edit2 :이 함수는 이제 본문 대신 원본 요소 바로 뒤에 복제본을 삽입하여 복제본이 상속 된 차원을 유지할 수 있도록합니다.
$.fn.getRealDimensions = function (outer) {
var $this = $(this);
if ($this.length == 0) {
return false;
}
var $clone = $this.clone()
.show()
.css('visibility','hidden')
.insertAfter($this);
var result = {
width: (outer) ? $clone.outerWidth() : $clone.innerWidth(),
height: (outer) ? $clone.outerHeight() : $clone.innerHeight(),
offsetTop: $clone.offset().top,
offsetLeft: $clone.offset().left
};
$clone.remove();
return result;
}
var dimensions = $('.hidden').getRealDimensions();
답변
위의 realWidth 함수를 게시 해 주셔서 감사합니다. 정말 도움이되었습니다. 위의 “realWidth”함수를 기반으로 CSS 재설정 (아래에 설명 된 이유)을 작성했습니다.
function getUnvisibleDimensions(obj) {
if ($(obj).length == 0) {
return false;
}
var clone = obj.clone();
clone.css({
visibility:'hidden',
width : '',
height: '',
maxWidth : '',
maxHeight: ''
});
$('body').append(clone);
var width = clone.outerWidth(),
height = clone.outerHeight();
clone.remove();
return {w:width, h:height};
}
“realWidth”는 기존 태그의 너비를 가져옵니다. 몇 가지 이미지 태그로 이것을 테스트했습니다. 문제는 이미지가 너비 당 CSS 크기 (또는 최대 너비)를 지정하면 해당 이미지의 실제 크기를 얻을 수 없다는 것입니다. 아마도 img에는 ”max-width : 100 %”가 있고 “realWidth”함수는이를 복제하여 본문에 추가합니다. 이미지의 원래 크기가 본문보다 크면 해당 이미지의 실제 크기가 아닌 본문 크기를 얻습니다.
답변
숨겨진 요소에 대한 작동 기능을 찾으려고 노력하지만 CSS가 모든 사람이 생각하는 것보다 훨씬 복잡하다는 것을 알고 있습니다. CSS3에는 유연한 상자, 그리드, 열 또는 복잡한 상위 요소 내부의 요소와 같은 모든 이전 답변에서 작동하지 않을 수있는 많은 새로운 레이아웃 기술이 있습니다.
flexibox 예
지속 가능하고 간단한 유일한 해결책은 실시간 렌더링 이라고 생각합니다 . 이때 브라우저는 올바른 요소 크기를 제공해야합니다 .
안타깝게도 JavaScript는 요소가 표시되거나 숨겨 질 때 알리는 직접적인 이벤트를 제공하지 않습니다. 하지만 요소의 가시성이 변경되면 콜백 함수를 실행하는 DOM Attribute Modified API를 기반으로 일부 함수를 생성합니다.
$('[selector]').onVisibleChanged(function(e, isVisible)
{
var realWidth = $('[selector]').width();
var realHeight = $('[selector]').height();
// render or adjust something
});
자세한 내용은 내 프로젝트 GitHub를 방문하십시오.
답변
숨겨진 무언가의 너비가 필요하고 어떤 이유로 든 숨기기를 해제 할 수없는 경우이를 복제하고 CSS를 변경하여 페이지에 표시되지 않도록 설정 한 다음 측정 할 수 있습니다. 나중에 숨기고 삭제하면 사용자는 현명하지 않습니다.
여기에있는 다른 답변 중 일부는 가시성을 숨겨서 작동하지만 페이지에서 몇 분의 1 초 동안 공백을 차지합니다.
예:
$itemClone = $('.hidden-item').clone().css({
'visibility': 'hidden',
'position': 'absolute',
'z-index': '-99999',
'left': '99999999px',
'top': '0px'
}).appendTo('body');
var width = $itemClone.width();
$itemClone.remove();
답변
너비를 취하기 전에 부모 디스플레이를 표시 한 다음 너비를 취하고 마지막으로 부모 디스플레이를 숨 깁니다. 다음과 같이
$('#parent').show();
var tableWidth = $('#parent').children('table').outerWidth();
$('#parent').hide();
if (tableWidth > $('#parent').width())
{
$('#parent').width() = tableWidth;
}