получить процентное значение правила CSS в jQuery

98

Допустим, правило таково:

.largeField {
    width: 65%;
}

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

Спасибо.

РЕДАКТИРОВАТЬ: К сожалению, использование методов DOM в моем случае ненадежно, так как у меня есть таблица стилей, которая импортирует другие таблицы стилей, и в результате параметр cssRules заканчивается либо нулевым, либо неопределенным значением.

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

монреалист
источник
1
Лучше всего поместить эти данные в сам элемент, а затем отслеживать, как он изменится в будущем.
Travis J

Ответы:

51

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

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Адам Лассек
источник
19
просто для ясности: это не говорит вам ценность вашего стиля, это дает вам вычисленное значение
Энтони Джонстон
2
@shevski работает нормально, вам нужно добавить class="largeField"в диапазон, в настоящее время вы выбираете пустой набор.
Адам Лассек
Я знаю, что в нем не работает, и поэтому это контрпример.
shevski
2
@shevski мой пример дает вычисленное значение существующего элемента на странице, как Энтони уже указал год назад. Ваши комментарии излишни.
Адам Лассек
@AdamLassek, Энтони не говорил, что он больше всего существует.
shevski
116

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

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

// >>> "65%"
переэксп
источник
50
Просто примечание: это будет работать только с CSS, непосредственно примененным к элементу (например style="width:65%").
brianreavis 01
3
Большой!! Чтобы вернуть только числа: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago
4
Тьяго, ты можешь просто использовать parseFloat ().
Гэвин
Это работает только во встроенном стиле, как сказал @brianreavis.
Akansh 06
84

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

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

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

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

А теперь ... Интересно, обнаружил ли я этот хак первым :)

Обновить:

Один лайнер

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

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

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

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

timofey.com
источник
1
Это должно быть приемлемое решение. Я также могу подтвердить, что это работает для меня, когда другие ответы не получают первоначально назначенного процентного значения.
EricP
1
Чтобы избежать мерцания, клонируйте дочерний элемент, скройте родительский объект, затем получите ширину. var clone = $ ('. ребенок'). clone ();
user1491819 08
3
Обновление: функция getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('ширина дочернего элемента:' + getCssWidth ('. child')) ;;
user1491819 08
1
Отличное решение! Вот чистый js-эквивалент скрипта jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti 01
1
Если ответ $ (...) [0] .style.width работает, разве это не должно быть приемлемым решением? Это решение, хотя и элегантно, страдает некоторыми недостатками в производительности.
Михай Данила
44

Вы могли получить доступ к 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>
Гамбо
источник
8
+1 правильное использование методов DOM (иногда jQuery не является ответом)
bobince
1
+1 Я с вами здесь за точность. Мне любопытно, как каждый браузер это поддерживает, но это правильный ответ.
cgp
Хорошо работает в более простых случаях, как FF, так и IE7, но не для меня (см. EDIT выше).
montrealist
1
Вы тоже пробовали пройтись по всем таблицам стилей? В моем примере использовался только первый ( styleSheets[0]).
Gumbo
Извините, если это вопрос новичков, но как это будет for (var i=0; rules.length; i++)работать? Не должно бытьfor (var i=0; i<rules.length; i++)
сбиченко
18

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

$element.prop('style')['width'];
ddanone
источник
Работал как шарм для размера шрифта css. $ element.prop ('стиль') ['размер шрифта];
Джейсон
10

Плагин 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

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

Надеюсь, это кому-то поможет.

Григорий Магаршак
источник
синтаксическая ошибка, вы забыли {в конце первой строки.
Akansh 06
только это решение правильно показывает «авто», когда ширина для div не установлена, jquery css ('width') возвращает «0px». все остальные ответы неверны ...
Алексей Обухов
1

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

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

Хорст Вальтер
источник
2
Ваш вопрос и этот уже связаны (см. Боковую панель «Связанные» справа) благодаря комментарию shesek к вашему вопросу.
Крис Йонсен,
0

Вы можете поместить стили, к которым вам нужно получить доступ с помощью jQuery, в:

  1. непосредственно глава документа
  2. во включении, который скрипт на стороне сервера затем помещает в голову

Тогда должно быть возможно (хотя и не обязательно просто) написать функцию js, которая анализирует все в тегах стиля в заголовке документа и возвращает нужное значение.

где
источник
0

Вы можете использовать функцию css (width), чтобы вернуть текущую ширину элемента.

т.е.

var myWidth = $("#myElement").css("width");

См. Также: http://api.jquery.com/width/ http://api.jquery.com/css/

user267867
источник
почему это уценено? в этом есть ошибка bugs.jquery.com/ticket/4772 , похоже, есть некоторая несогласованность в вызове этого в зависимости от того, помещаете ли вы свой стиль встроенным или в таблицу стилей jsfiddle.net/boushley/MSyqR/2
Энтони Johnston
1
я не могу получить% с этим
somethinguseless
0

В 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
}
BT
источник
0

Преобразование пикселей в проценты с помощью перекрестного умножения .

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

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>
Закари Хортон
источник