Мне нужно получить высоту скрытого элемента внутри div. Прямо сейчас я показываю div, получаю высоту и скрываю родительский div. Это кажется немного глупым. Есть ли способ лучше?
Я использую JQuery 1.4.2:
$select.show();
optionHeight = $firstOption.height(); //we can only get height if its visible
$select.hide();
javascript
jquery
html
css
mkoryak
источник
источник
Ответы:
Вы можете сделать что-то вроде этого, хотя и немного странно, забудьте,
position
если оно уже абсолютное:источник
position:relative
, вы, конечно, захотите установить его после вместоstatic
.Я столкнулся с той же проблемой с получением скрытой ширины элемента, поэтому я написал этот плагин вызовом jQuery Actual, чтобы исправить это. Вместо того, чтобы использовать
использование
даст вам правильное значение для скрытого элемента или элемент имеет скрытого родителя.
Полную документацию смотрите здесь . На странице также есть демо-версия.
Надеюсь это поможет :)
источник
Вы confuising двух стилей CSS, в стиль отображения и стиль видимости .
Если элемент скрыт путем установки стиля css видимости, тогда вы сможете получить высоту независимо от того, является ли элемент видимым или нет, так как элемент все еще занимает место на странице .
Если элемент скрыт путем изменения стиля отображения css на «none», тогда элемент не занимает место на странице, и вам придется назначить ему стиль отображения, который заставит элемент отображаться в некотором пространстве, в в какой точке вы можете получить высоту.
источник
visibility
наhidden
не решала мою проблему, но это дало мне идею установить,position: fixed; top: 100%
и это работает как шарм!На самом деле я иногда прибегал к хитрости, чтобы справиться с этим. Я разработал виджет полосы прокрутки jQuery, где столкнулся с проблемой, которую я не знаю заранее, является ли прокручиваемый контент частью скрытой части разметки или нет. Вот что я сделал:
Это работает по большей части, но есть очевидная проблема, которая может возникнуть. Если контент, который вы клонируете, стилизован с помощью CSS, который включает в свои правила ссылки на родительскую разметку, клонированный контент не будет содержать соответствующий стиль и, вероятно, будет иметь несколько иные измерения. Чтобы обойти это, вы можете убедиться, что к разметке, которую вы клонируете, применяются правила CSS, которые не включают ссылки на родительскую разметку.
Кроме того, это не подошло для меня с моим виджетом скроллера, но чтобы получить соответствующую высоту клонированного элемента, вам нужно установить ширину равной ширине родительского элемента. В моем случае ширина CSS всегда применялась к реальному элементу, поэтому мне не пришлось об этом беспокоиться, однако, если к элементу не применена ширина, вам может потребоваться выполнить какую-то рекурсивную процедуру. Обход DOM-элемента элемента, чтобы найти соответствующую ширину родительского элемента.
источник
Основываясь на ответе пользователя Ника и плагине hitautodestruct пользователя на JSBin, я создал аналогичный плагин jQuery, который получает ширину и высоту и возвращает объект, содержащий эти значения.
Это можно найти здесь: http://jsbin.com/ikogez/3/Обновить
Я полностью переработал этот крошечный плагин, так как оказалось, что предыдущая версия (упомянутая выше) не была реально применима в реальной среде, где происходило много манипуляций с DOM.
Это работает отлично:
источник
sizes = {"width": $wrap.width(), "height": $wrap.height()};
this
$wrap
порядке (по крайней мере, в моих тестах). Я попытался сthis
и, очевидно, он не поймает размер, потому чтоthis
все еще ссылается на скрытый элемент.Основываясь на ответе Ника:
Я обнаружил, что лучше сделать это:
Установка атрибутов CSS вставит их в строку, что перезапишет любые другие атрибуты, которые есть в вашем файле CSS. Удалив атрибут style в элементе HTML, все возвращается к нормальному состоянию и все еще скрыто, поскольку оно было спрятано в первую очередь.
источник
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'}); optionHeight = $("#myDiv").height(); $("#myDiv").css({'position':'','visibility':'', 'display':''});
Вы также можете расположить скрытый div с экрана с отрицательным полем, а не с помощью display: none, очень похоже на технику замены изображения с отступом текста.
например.
Таким образом, высота () все еще доступна.
источник
Я пытаюсь найти работающую функцию для скрытого элемента, но я понимаю, что CSS намного сложнее, чем все думают. В CSS3 есть много новых методов верстки, которые могут не работать для всех предыдущих ответов, таких как гибкое поле, сетка, столбец или даже элемент внутри сложного родительского элемента.
пример flexibox
Я думаю, что единственным устойчивым и простым решением является рендеринг в реальном времени . В то время браузер должен дать вам правильный размер элемента .
К сожалению, JavaScript не предоставляет какого-либо прямого события для уведомления, когда элемент показан или скрыт. Тем не менее, я создаю некоторую функцию на основе DOM Attribute Modified API, которая будет выполнять функцию обратного вызова при изменении видимости элемента.
Для получения дополнительной информации, пожалуйста, посетите в моем проекте GitHub.
https://github.com/Soul-Master/visible.event.js
демо: http://jsbin.com/ETiGIre/7
источник
style
атрибута (см. Строку 59 здесь ), тогда как изменения видимости могут быть вызваны также изменениямиclass
атрибута.Следуя решению Ника Крейвера, настройка видимости элемента позволяет получить точные размеры. Я использовал это решение очень очень часто. Однако, чтобы сбросить стили вручную, я пришел к выводу, что это громоздко, учитывая, что, изменяя первоначальное позиционирование / отображение элемента в моем css в процессе разработки, я часто забываю обновить связанный код javascript. Следующий код не сбрасывает стили, скажем так, но удаляет встроенные стили, добавленные javascript:
Единственное предположение здесь состоит в том, что не может быть других встроенных стилей, иначе они также будут удалены. Преимущество здесь заключается в том, что стили элемента возвращаются к тому, что было в таблице стилей CSS. Как следствие, вы можете записать это как функцию, через которую передается элемент и возвращается высота или ширина.
Другая проблема, с которой я столкнулся при установке встроенных стилей с помощью js, заключается в том, что при работе с переходами через css3 вы вынуждены адаптировать веса ваших правил стиля, чтобы они были сильнее встроенного стиля, что иногда может разочаровать.
источник
По определению элемент имеет высоту, только если он видим.
Просто любопытно: зачем вам высота скрытого элемента?
Одна альтернатива состоит в том, чтобы эффективно скрыть элемент, поместив его (используя z-index) наложение некоторого вида).
источник
В моих обстоятельствах у меня также был скрытый элемент, который мешал мне получить значение высоты, но это был не сам элемент, а один из его родителей ... поэтому я просто поставил чек на один из моих плагинов, чтобы увидеть, если это скрытый, иначе найдите ближайший скрытый элемент. Вот пример:
Фактически, это объединение ответов Ника, Грегори и Eyelidness, чтобы дать вам использовать улучшенный метод Грегори, но использует оба метода на случай, если в атрибуте стиля должно быть что-то, что вы хотите вернуть, и ищет родительский элемент.
Единственное, что меня беспокоит, так это то, что цикл через родителей не совсем эффективен.
источник
Один из обходных путей - создать родительский div вне элемента, для которого вы хотите получить высоту, применить высоту «0» и скрыть любое переполнение. Затем возьмите высоту дочернего элемента и удалите свойство overflow родительского элемента.
источник
Вот скрипт, который я написал для обработки всех методов измерения jQuery для скрытых элементов, даже потомков скрытых родителей. Обратите внимание, что, конечно, при использовании этого показателя наблюдается снижение производительности.
источник
Если вы уже отображали элемент на странице ранее, вы можете просто взять высоту непосредственно из элемента DOM (достижимый в jQuery с помощью .get (0)), поскольку он устанавливается даже тогда, когда элемент скрыт:
то же самое для ширины:
(спасибо Скитсу О'Рейли за исправление)
источник
undefined
display='none'
, это не будет работать.