Ответ 1
Нет никакого встроенного способа, я боюсь. Вы можете сделать что-то вроде этого:
var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Скажем, правило следующее:
.largeField {
width: 65%;
}
Есть ли способ получить '65% 'назад как-то, а не значение пикселя?
Спасибо.
EDIT: К сожалению, использование методов DOM ненадежно в моем случае, поскольку у меня есть таблица стилей, которая импортирует другие таблицы стилей, и в результате параметр cssRules заканчивается null или undefined.
Этот подход, однако, будет работать в самых простых случаях (одна таблица стилей, несколько отдельных деклараций стилей внутри основного тега документа).
Нет никакого встроенного способа, я боюсь. Вы можете сделать что-то вроде этого:
var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Самый простой способ
$('.largeField')[0].style.width
// >>> "65%"
Это, безусловно, возможно!
Сначала вы должны скрыть() родительский элемент. Это не позволит JavaScript вычислять пиксели для дочернего элемента.
$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);
См. мой пример.
Теперь... Интересно, если я впервые открою этот хак:)
Update:
element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');
Он оставит скрытый элемент перед тегом </body>
, который вы можете захотеть .remove()
.
См. пример однострочного файла.
Я открыт для лучших идей!
Вы можете получить доступ к объекту document.styleSheets
:
<style type="text/css">
.largeField {
width: 65%;
}
</style>
<script type="text/javascript">
var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
for (var i=0; i < rules.length; i++) {
var rule = rules[i];
if (rule.selectorText.toLowerCase() == ".largefield") {
alert(rule.style.getPropertyValue("width"));
}
}
</script>
Поздно, но для более новых пользователей попробуйте , если стиль css содержит процент:
$element.prop('style')['width'];
Плагин jQuery на основе ответа Adams:
(function ($) {
$.fn.getWidthInPercent = function () {
var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
return Math.round(100*width)+'%';
};
})(jQuery);
$('body').html($('.largeField').getWidthInPercent());
Вернет '65% '. Только возвращает округленные числа, чтобы работать лучше, если вам нравится, если (width == '65%'). Если бы вы использовали ответ Adams напрямую, это не сработало (у меня что-то вроде 64.93288590604027).:)
Основываясь на превосходном и удивительном решении timofey, вот чистая реализация Javascript:
function cssDimensions(element)
var cn = element.cloneNode();
var div = document.createElement('div');
div.appendChild(cn);
div.style.display = 'none';
document.body.appendChild(div);
var cs = window.getComputedStyle
? getComputedStyle(cn, null)
: cn.currentStyle;
var ret = { width: cs.width, height: cs.height };
document.body.removeChild(div);
return ret;
}
Надеюсь, что это поможет кому-то.
У меня есть аналогичная проблема в Получение значений глобальной таблицы стилей в jQuery, в итоге я придумал такое же решение, как выше.
Просто хотел скрестить два вопроса, чтобы другие могли извлечь выгоду из более поздних результатов.
Вы можете добавить стили, которые вам нужны для доступа с помощью jQuery:
Тогда должно быть возможно (хотя и не обязательно легко) написать функцию js, чтобы анализировать все в тегах стиля в заголовке документа и возвращать нужное значение.
Вы можете использовать функцию css (width) для возврата текущей ширины элемента.
т.
var myWidth = $("#myElement").css("width");
См. также: http://api.jquery.com/width/ http://api.jquery.com/css/
Я переписываю user1491819 в качестве ответа и добавляю небольшое улучшение (я не могу комментировать из-за низкой репутации).
user1491819 создал эту очень полезную функцию:
function getCssWidth(childSelector) {
return jQuery(childSelector).parent().clone().hide().find(childSelector).width();
}
Но эта функция возвращает количество пикселей или процент без единиц, поэтому вам нужно угадать, какой из них. Чтобы не догадываться, вы можете использовать css ('width'), и он также вернет устройство. Таким образом, функция для получения значения с единицами должна быть:
function getCssWidth(childSelector) {
return jQuery(childSelector).parent().clone().hide().find(childSelector).css('width');
}
В jQuery ничего нет и ничего простого даже в javascript. Принимая timofey ответ и работая с ним, я создал эту функцию, которая работает, чтобы получить любые свойства, которые вы хотите:
// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
if(!(properties instanceof Array)) properties = [properties]
var parent = domNode.parentNode
if(parent) {
var originalDisplay = parent.style.display
parent.style.display = 'none'
}
var computedStyles = getComputedStyle(domNode)
var result = {}
properties.forEach(function(prop) {
result[prop] = computedStyles[prop]
})
if(parent) {
parent.style.display = originalDisplay
}
return result
}
Преобразование из пикселей в процент с использованием перекрестного умножения.
Настройка формул:
1). (element_width_pixels/parent_width_pixels) = (element_width_percentage/100)
2.) element_width_percentage = (100 * element_width_pixels)/parent_width_pixels
Фактический код:
<script>
var $width_percentage = (100 * $("#child").width()) / $("#parent").width();
</script>