отримати значення процентного значення правила CSS в jQuery


98

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

.largeField {
    width: 65%;
}

Чи є спосіб якось повернути '65% ', а не значення пікселя?

Дякую.

EDIT: На жаль, використання методів DOM в моєму випадку недостовірне, оскільки у мене є таблиця стилів, яка імпортує інші таблиці стилів, і як результат, параметр cssRules закінчується або нульовим, або невизначеним значенням.

Такий підхід, однак, буде працювати в найпростіших випадках (один таблицю стилів, кілька окремих декларації стилів всередині головки тега документа).


1
Найкраще було б занести ці дані до самого елемента, а потім відстежити, як вони змінюються в майбутньому.
Travis J

Відповіді:


51

Боюсь, немає вбудованого способу. Ви можете зробити щось подібне:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';

19
щоб було зрозуміло, це не означає вам значення у вашому стилі, воно дає вам обчислене значення
Ентоні Джонстон,

2
@shevski це прекрасно працює, ви повинні додати class="largeField"до проміжку, зараз ви вибираєте порожній набір.
Адам Лассек

Я знаю, що в ньому не працює, і тому це протилежний приклад.
шевський

2
@shevski мій приклад дає обчислене значення існуючого елемента на сторінці, як Ентоні вже вказував рік тому. Ваші коментарі зайві.
Адам Лассек

@AdamLassek, Ентоні не сказав, що це найбільше існує.
шевський

116

Найпростіший спосіб

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

// >>> "65%"

50
Лише зауваження: це буде працювати лише з css, безпосередньо застосованим до елемента (наприклад style="width:65%").
brianreavis

3
Чудово !! Щоб повернути лише числа: parseInt ($ ('. LargeField') [0] .style.width, 10);
Тіаго

4
Тіаго, ви можете просто використовувати parseFloat ().
Гавін

Це працює лише в стилі вбудовування, як сказав @brianreavis.
Аканьш

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().

Дивіться приклад однолінійного .

Я відкритий до кращих ідей!


1
Це має бути прийнятим рішенням. Я також можу підтвердити, що він працює для мене там, де інші відповіді не отримують початково призначеного відсоткового значення.
EricP

1
Щоб уникнути мерехтіння, клонуйте дитину, схойте батьків, а потім отримайте ширину. var clone = $ ('. дитина'). clone ();
користувач1491819

3
Оновлення: функція getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hid (). Find (childSelector) .width (); } console.log ('дочірня ширина:' + getCssWidth ('. дитина')) ;;
користувач1491819

1
Дивовижне рішення! Ось чистий еквівалент сценарію jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

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 вище).
Монреаліст

1
Ви також спробували пройти через усі таблиці стилів? Мій приклад щойно використав перший ( styleSheets[0]).
Gumbo

Вибачте, якщо це питання noob, але як би це for (var i=0; rules.length; i++)працювало? Чи не повинно бутиfor (var i=0; i<rules.length; i++)
sbichenko

18

Пізно, але для нових користувачів спробуйте це, якщо стиль css містить відсоток :

$element.prop('style')['width'];

Працював як шарм для розміру шрифту css. $ element.prop ('style') ['font-size];
Джейсон

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

Спираючись на чудове та дивовижне рішення 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;
}

Сподіваюся, це комусь корисно.


синтаксичну помилку, яку ви забули {в кінці першого рядка.
Аканш

тільки це рішення правильно показує "auto", коли ширина для div не встановлена, jquery css ('width') повертає "0px". всі інші відповіді невірні ...
Олексій Обухов

1

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

Просто хотілося перехрестити два питання, щоб інші могли отримати користь від пізніших висновків.


2
Ваше запитання і це питання вже пов'язані (див. Бічну панель "Пов'язані" праворуч) в силу коментаря шесека до вашого питання.
Кріс Джонсен

0

Ви можете розмістити стилі, до яких потрібно отримати доступ до jQuery, у будь-який:

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

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


0

Ви можете використовувати функцію css (width) для повернення поточної ширини елемента.

тобто.

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

Дивіться також: http://api.jquery.com/width/ http://api.jquery.com/css/


чому це позначено? на цьому bugs.jquery.com/ticket/4772 є помилка , схожа на те, що існує певна непослідовність в заклику до цього, залежно від того, введено ви стиль вбудованого чи в аркуш стилів jsfiddle.net/boushley/MSyqR/2
Anthony Джонстон

1
я не можу отримати% з цим
хтось безпорадний

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
}

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.