Вы можете использовать следующую функцию, чтобы получить внешнюю ширину элемента, который равен внутри скрытого контейнера.
$.fn.getHiddenOffsetWidth = function() {
// save a reference to a cloned element that can be measured
var $hiddenElement = $(this).clone().appendTo('body');
// calculate the width of the clone
var width = $hiddenElement.outerWidth();
// remove the clone from the DOM
$hiddenElement.remove();
return width;
};
Вы можете изменить .outerWidth()
к .offsetWidth()
для вашей ситуации.
Функция сначала клонирует элемент, копируя его в место, где оно будет видно. Затем он извлекает ширину смещения и, наконец, удаляет клон. Следующий фрагмент кода иллюстрирует ситуацию, когда эта функция была бы идеальным:
<style>
.container-inner {
display: none;
}
.measure-me {
width: 120px;
}
</style>
<div class="container-outer">
<div class="container-inner">
<div class="measure-me"></div>
</div>
</div>
Пожалуйста, обратите внимание, что если есть CSS применяется к элементу, который изменяет ширину элемента, который не будет применяться, если это является прямым потомком тела, то этот метод не будет работать.Так что-то, как это будет означать, что функция не работает:
.container-outer .measure-me {
width: 100px;
}
Вы будете должны:
- изменения специфичности, т.е. селектора CSS.
.measure-me { width: 100px; }
- изменить
appendTo()
, чтобы добавить клон в место, где ваш CSS также будет применен к клону. Убедитесь в том, что когда-либо вы выразились, что элемент будет виден: .appendTo('.container-outer')
Опять же, эта функция предполагает, что элемент скрыт только потому, что внутри скрытого контейнера. Если сам элемент равен display:none
, вы можете просто добавить некоторый код, чтобы сделать клон видимым, прежде чем извлекать его ширину смещения. Что-то вроде этого:
$.fn.getHiddenOffsetWidth = function() {
var hiddenElement $(this)
width = 0;
// make the element measurable
hiddenElement.show();
// calculate the width of the element
width = hiddenElement.outerWidth();
// hide the element again
hiddenElement.hide();
return width;
}
Это будет работать в такой ситуации, как это:
<style>
.measure-me {
display: none;
width: 120px;
}
</style>
<div class="container">
<div class="measure-me"></div>
</div>
Nice один, Питер. Благодарю. – Gausie
Вот сообщение в блоге по этой теме. Одной из проблем, с которой может столкнуться этот метод, является возврат позиции обратно к исходному значению. Использование метода подкачки хорошо работает в этой ситуации. http://bit.ly/6KwGzm –
Вам не нужно возвращать его обратно в исходное положение, если вы клонируете элемент. Просто удалите клон после того, как вы восстановили его положение. – ajbeaven