Можно ли использовать jQuery для получения ширины элемента в процентах или пикселях в зависимости от того, что разработчик указал с помощью CSS?

Я пишу плагин jQuery, и мне нужно определить ширину элемента, который указывает пользователь. Проблема в том, что .width() или .css('width') всегда будет сообщать точные пиксели, даже если разработчик назначил его, например. ширина: 90% с CSS.

Есть ли способ заставить jQuery выводить ширину элемента в px или% в зависимости от того, что разработчик дал ему с помощью CSS?


person joren    schedule 23.10.2010    source источник
comment
Этот вопрос, кажется, задает два ортогональных вопроса; пожалуйста, подумайте о пересмотре. Два вопроса: 1) "Как я могу получить ширину элемента в %?" (из заголовка) и 2) "Как я могу получить значение CSS, указанное в таблице стилей?" (от тела).   -  person    schedule 24.10.2010


Ответы (9)


Я бы сказал, что лучший способ - вычислить его самостоятельно:

var width = $('#someElt').width();
var parentWidth = $('#someElt').offsetParent().width();
var percent = 100*width/parentWidth;
person Matt Ball    schedule 23.10.2010
comment
Спасибо, это, безусловно, сработает, но я хотел, чтобы скрипт автоматически определял, указал ли разработчик проценты или пиксели, что, я не думаю, можно сделать, поэтому я просто добавлю его как параметр, который они могут передать в плагин. - person joren; 24.10.2010
comment
@joren - Пожалуйста, измените название вашего вопроса. Это противоречит смыслу вашего фактического вопроса. - person Peter Ajtai; 24.10.2010
comment
@joren: я видел, что вы изменили название своего вопроса. У вас есть дополнительные вопросы? - person Matt Ball; 25.10.2010
comment
Не совсем, я все же решил просто добавить настройку процента от div в качестве опции к моему плагину, после этого обсуждения это показалось лучшим способом действий. Спасибо! - person joren; 27.10.2010
comment
Это работает и для высоты? Я не понял функцию offsetParent() :( - person sadfuzzy; 24.01.2013
comment
что, если бы родительская ширина также была в процентах? должен ли я зацикливаться, пока не достигну родительского div с фиксированной шириной? - person user1386213; 02.06.2014
comment
@ user1386213 нет. .width() всегда возвращает абсолютное значение (# пикселей). - person Matt Ball; 02.06.2014
comment
Я столкнулся с проблемами, если нужный элемент имеет display: none. Кажется, это та же ошибка, что и в .offset(): ... display:none исключается из дерева рендеринга и таким образом, имеет позицию, которая не определена - person cheich; 15.05.2015
comment
Любой, кто пытается рассчитать ширину элемента с границами: добавьте parseFloat($('#someElt').css('border-width')) * 2 к ширине элементов. - person Bruno Peres; 21.08.2015

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

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

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

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

person timofey.com    schedule 09.11.2013
comment
Это действительно странно. Элемент может мигать, и на самом деле он не зависит от реальных целей этих функций. Что, если это поведение изменится? - person Gherman; 13.07.2015
comment
@German - чтобы предотвратить мигание элемента, см. однострочный пример на stackoverflow.com/questions/744319#19873734 - person timofey.com; 15.10.2015

Я думаю, вы можете напрямую использовать доступ к объекту таблицы стилей («стиль»). Даже тогда YMMV через браузер. например elm.style.width.

Редактировать комментарий Питера:: Я не ищу "получить %". По вопросу:

Мне нужно иметь возможность определить ширину элемента, который указывает пользователь... [есть ли способ] вывести ширину элемента в пикселях или% в зависимости от того, что разработчик дал ему с помощью CSS?

Таким образом, я предоставил альтернативу для получения «сырого» значения CSS. Похоже, это работает на FF3.6. YMMV в другом месте (ответ netadictos может быть более портативным/универсальным, я не знаю). Опять же, он не стремится получить %.

person Community    schedule 24.10.2010
comment
Как это возвращает процент? - person Peter Ajtai; 24.10.2010
comment
Понимаю. Я уходил от заголовка: Getting jQuery .width() to output percentage instead of px?. Тело вопроса противоречит заголовку. Непонятно, чего хочет ОП. - person Peter Ajtai; 24.10.2010
comment
В соответствии с этим: stackoverflow.com/a/10432934/1825772 работает только для css, применяемого непосредственно к элементу. - person pd12; 21.01.2016

Способ сделать это задокументирован в этом вопросе stackoverflow.

Как вы читаете значения правил CSS с помощью JavaScript?

Единственное, что вам нужно знать, это то, в какой таблице стилей находится класс или цикл по всем таблицам стилей. Следующая функция дает вам все функции класса, было бы легко сделать регулярное выражение для извлечения функции, которую вы ищете.

function getStyle(className) {
    var classes = document.styleSheets[0].rules || document.styleSheets[0].cssRules
    for(var x=0;x<classes.length;x++) {

        if(classes[x].selectorText==className) {
                (classes[x].cssText) ? alert(classes[x].cssText) : alert(classes[x].style.cssText);
        }
    }
}
getStyle('.test');
person netadictos    schedule 24.10.2010
comment
Как это возвращает процент, если исходный стиль либо не в процентах, либо он не определен? - person Peter Ajtai; 24.10.2010
comment
Вопрос в следующем: есть ли способ заставить jQuery выводить ширину элемента в px или% в зависимости от того, что разработчик дал ему с помощью CSS? То есть пользователь просит вывести то, что находится в css. - person netadictos; 24.10.2010
comment
Понимаю. Я уходил от заголовка: Getting jQuery .width() to output percentage instead of px?. Тело вопроса противоречит заголовку. Непонятно, чего хочет ОП. - person Peter Ajtai; 24.10.2010

Для своих целей я экстраполировал ответ MДΓΓ БДLL.

Имейте в виду, я работаю только с целыми процентами.

    var getPercent = function(elem){
        var elemName = elem.attr("id");
        var width = elem.width();
        var parentWidth = elem.offsetParent().width();
        var percent = Math.round(100*width/parentWidth);
        console.log(elemName+"'s width = "+percent+"%");
    }

    getPercent($('#folders'));
    getPercent($('#media'));
    getPercent($('#player'));
person Alan Mabry    schedule 29.03.2012

Если вы хотите переназначить исходный процент элементов на новый процент, рекомендуется определить это значение в CSS и каким-либо образом изменить идентификатор элемента (класс, идентификатор и т. д.), чтобы отразить новое определение CSS. Это не всегда применимо, если новая процентная переменная должна быть переменной.

.myClass{
    width:50%;
}

.myNewClass{
    width:35%;
}

Добавление удаления с помощью этого (или другого) метода:

$('.myClass').removeClass('myClass').addClass('myNewClass');
person Andrew Liles    schedule 23.07.2012
comment
Как насчет toggleClass()? - person kaiser; 29.09.2013

просто чтобы сделать его более jqueryish

Добавь это

$.fn.percWidth = function(){
  return this.outerWidth() / this.parent().outerWidth() * 100;
}

а затем использовать

$(selector).percWidth()

это вернет процентное значение без знака%, поэтому вы можете использовать его в расчетах

person Nick Ginanto    schedule 20.08.2014

Если он установлен с использованием тега стиля, вы можете просто использовать .prop()
например. $('.selector').prop('style').width.replace('%', '')

person Jay Shah    schedule 11.09.2016

Недавно я тоже столкнулся с этой проблемой, и мне действительно не хотелось выполнять дополнительную работу по получению ширины родителя и вычислению процента.

После нескольких быстрых попыток вот что у меня получилось:

    $($($(table).find('tr')[0]).find('td')).each(function (i, e) {
        var proptW = $(e).prop("style").width;
        console.log(proptW);
    });

Итак, я думаю, что это самый близкий способ использования jQuery для получения значения ширины элемента на основе того, что разработчик указал в css.

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

Мы не можем получить указанное разработчиком значение (DSV) напрямую с помощью метода jQuery, но после объединения со встроенным методом JavaScript это всего один шаг от получения DSV.

Поскольку DSV находится в Style, а Style является свойством элемента, мы можем использовать метод jQuery: prop(), чтобы получить его. Этот метод возвращает объект стиля (скажем, sty), так что мы можем вызвать sty.width для прямого получения DSV.

Это не чистый способ jQuery, но он достаточно прост и работает для меня.

person Franva    schedule 21.04.2015