получить процентное значение правила CSS в jQuery - PullRequest
96 голосов
/ 13 апреля 2009

Скажем, правило таково:

.largeField {
    width: 65%;
}

Есть ли способ как-нибудь вернуть '65% ', а не значение пикселя?

Спасибо.

EDIT: К сожалению, использование методов DOM в моем случае ненадежно, так как у меня есть таблица стилей, которая импортирует другие таблицы стилей, и в результате параметр cssRules заканчивается либо ноль или неопределенное значение.

Однако этот подход будет работать в большинстве простых случаев (одна таблица стилей, несколько отдельных объявлений таблиц стилей внутри тега head документа).

Ответы [ 12 ]

111 голосов
/ 03 мая 2012

Самый простой способ

$('.largeField')[0].style.width

// >>> "65%"
82 голосов
/ 09 ноября 2013

Это определенно возможно!

Сначала вы должны скрыть () родительский элемент. Это не позволит JavaScript вычислять пиксели для дочернего элемента.

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

См. Мой пример .

Теперь ... Интересно, смогу ли я впервые открыть этот взлом:)

Обновление:

One-лайнер

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

Он оставит скрытый элемент перед тегом </body>, который вы можете захотеть .remove().

См. пример однострочного .

Я открыт для лучших идей!

48 голосов
/ 13 апреля 2009

Боюсь, нет встроенного способа. Вы можете сделать что-то вроде этого:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
44 голосов
/ 13 апреля 2009

Вы можете получить доступ к объекту 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>
18 голосов
/ 07 июня 2016

Поздно, но для новых пользователей, попробуйте это , если стиль css содержит процент :

$element.prop('style')['width'];
10 голосов
/ 04 сентября 2012

Плагин jQuery, основанный на ответе Адамса:

(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% '. Возвращает округленные числа, чтобы работать лучше, если вам нравится if (width == '65%'). Если бы вы использовали прямой ответ Адамса, это не сработало (я получил что-то вроде 64.93288590604027). :)

3 голосов
/ 06 апреля 2016

Опираясь на превосходное и удивительное решение Тимофея, я приведу чистую реализацию 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;
}

Надеюсь, это кому-нибудь пригодится.

1 голос
/ 20 августа 2011

У меня похожая проблема в Получение значений глобальной таблицы стилей в jQuery , в конце концов я придумал такое же решение, как и выше .

Просто хотел связать два вопроса, чтобы другие могли извлечь пользу из более поздних результатов.

0 голосов
/ 08 декабря 2017

Преобразование из пикселей в процент с использованием кросс-умножения

Настройка формулы:

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>
0 голосов
/ 03 октября 2016

Нет ничего в jQuery, и ничего простого, даже в javascript. Взяв ответ Тимофея и продолжив его, я создал эту функцию, которая работает для получения любых свойств, которые вы хотите:

// 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...