Как я могу определить, наследуется ли конкретное свойство CSS с помощью jQuery? - PullRequest
27 голосов
/ 15 февраля 2011

Это очень простой вопрос, поэтому я буду кратким:

Как определить, наследуется ли свойство CSS конкретного элемента DOM?

* 1006Причина, по которой я спрашиваю, заключается в том, что при использовании метода jQuery css он вернет вычисленный стиль, который наследует свойства CSS родительского объекта.Есть ли способ получить свойства, установленные для самого объекта?

Пример может объяснить, что я получаю немного лучше:

CSS:

div#container {
  color:#fff;
}

HTML:

<div id="container">
  Something that should be interesting
  <div class="black">
    Some other thing that should be interesting
  </div>
</div>

Итак, в случае div.black, который наследует color, как я могу определить, унаследован ли он?

$('div.black:eq(0)').css('color'), очевидно, даст мне #fff, но я хочу получить стиль самого элемента , а не его родителей.

Ответы [ 7 ]

10 голосов
/ 15 февраля 2011

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

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

Селекторы CSS могут не всегда следовать отношениям родитель-потомок, что могло бы упростить вопросы.Рассмотрим этот CSS.

body {
    color: red;
}

div + div {
    color: red;
}

и следующий HTML:

<body>
    <div>first</div>
    <div>second</div>
</body>

И first, и second будут отображаться красным, однако первый div - красный, потому что оннаследует это от родителя.Второй div красный, потому что к нему применяется правило CSS div + div, которое более специфично .Глядя на родителя, мы увидим, что он имеет тот же цвет, но это не то, откуда второй div получает его.

Браузеры не предоставляют никаких внутренних вычислений, кроме интерфейса getComputedStyle.

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

var myElement = $('..');
var rules = document.styleSheets[0].cssRules;
for(var i = 0; i < rules.length; i++) {
    if (myElement.is(rules[i].selectorText)) {
        console.log('style was directly applied to the element');
    }
}
6 голосов
/ 15 февраля 2011

Я не думаю, что вы можете определить, является ли данный стиль наследуемым. Я думаю, что лучшее, что вы можете сделать, - это установить для данного свойства CSS значение «наследовать», захватить его вычисленное значение и сравнить его с исходным значением.Если они отличаются, стиль определенно не унаследован.

var el = $('div.black:eq(0)');
var prop = el.css("color");
el.css("color", "inherit");
var prop2 = el.css("color");
el.css("color", prop);
if(prop != prop2)
  alert("Color is not inherited.");

Демонстрация на jsFiddle

Дело в следующем: если вы установилиdiv.black to #fff в CSS или через встроенный стиль, этот метод будет считать, что он наследуется.Не идеально, на мой взгляд, но это может удовлетворить ваши потребности.Боюсь, для идеального решения требуется обход всей таблицы стилей.

2 голосов
/ 31 октября 2014

Я знаю, что это старый вопрос, однако я решил поделиться тем, что я сделал, с ответом Джоша, а именно: изменил его, чтобы удалить CSS, если он был унаследован, и превратил его в плагин jQuery. Пожалуйста, не стесняйтесь сбивать его, но пока он работает для меня: -)

$.fn.isInheritedStyle = function(style) {
    var current = this.css(style);
    this.css(style, 'inherit');
    var inherited = this.css(style);
    if (current == inherited)
        this.css(style, '');
    else
        this.css(style, current);
    return (current == inherited);
}
2 голосов
/ 15 февраля 2011

http://jsfiddle.net/k7Dw6/

var $black = $('div.black:eq(0)');
alert($('<div>').attr('class', $black.attr('class')).css('line-height') === $black.css('line-height'));

Вы можете создать новый элемент с тем же классом (и, я думаю, идентификатором) и проверить, является ли свойство CSS одинаковым или нет.

1 голос
/ 10 марта 2015

Свойство element.style JS (не jQuery) возвращает объект CSSStyleDeclaration, таким образом:

{parentRule: null, 
length: 0, 
cssText: "", 
alignContent: "", 
alignItems: ""…

Если интересующий вас стиль имеет значение, то он объявляется (или применяется JS) в элементеlevel, else наследуется.
Информация поступила от https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/style

Я боролся с HTML5 и добавил отображение: элемент списка на уровне элементов (li) и нарушение других функций фильтра скрытия / отображения;Я смог это исправить таким образом.
Мой конкретный код был:

// browser bug? it adds display:list-item to the moved elements, this
// loops clear the explicit element-level "display" style
var cols = $('#columnNames li');
for( var icol = 0; icol < cols.length; icol++) {
    var d = cols[icol].style; // the CSSStyleDeclaration 
    d.display = ""; // clear the element-level style
}
1 голос
/ 15 февраля 2011

Если вас интересует, чем стиль отличается от родительского элемента, вы можете посмотреть на значение css, которое было передано родительскому элементу, сказав $ ('div.black:eq(0)'). Parent () .css ( 'высота строки').Таким образом, вы можете определить, имеют ли ребенок и родитель одинаковое значение.Что вы можете извлечь из этого, однако, ограничено.Возможно, что и ребенку, и родителю было явно назначено одно и то же!

Если вас интересует гораздо более сложная структура каскада (например, то, что вы можете увидеть в firebug)тогда у меня нет хорошего ответа для вас, который использует только jQuery.Вы можете выполнить неэффективный хак в зависимости от конкретной информации, которую вы хотите (например, клонировать объект, как предлагали другие, или переключать классы и проверять эффект переключения), но меня расстраивает только мысль об этом!

Как я думаю, кто-то заметил, что vanilla JS позволяет вам проверять свойства определенных элементов стиля;может быть, гибрид jQuery и vanilla JS даст вам то, что вам нужно?

Проверьте http://developer.apple.com/internet/webcontent/styles.html, чтобы увидеть javascript, который дает вам доступ к информации таблицы стилей.AFAIK, это не будет «готовая вещь» из jQuery (может быть совершенно не так).Тем не менее, это должно быть возможно, если вы хотите перебирать информацию в таблице стилей.

Редактировать: Удалены некоторые материалы, основанные на примере кода исходного вопроса

0 голосов
/ 15 февраля 2011

Я думаю, это хорошее поведение jquery. Что вы хотите получить, когда $('div.black:eq(0)').css('line-height'), false или undefined? Это очень запутанно, потому что реальное значение line-height (унаследовано, да) равно 1 em.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...