Изменение переменных CSS / пользовательских свойств в jQuery

в моем приложении у меня есть некоторые параметры, которые я хотел поместить в переменные CSS с помощью jQuery. И я тоже хотел их прочесть.

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

в любом случае, я приложил фрагмент, потому что мне нужно знать:
⋅ ⋅ ⋅ , Почему метод 1 не работает ?
⋅⋅⋅ Есть способ получить значение CSS var с помощью jQuery ?

Я чувствую, что ему не хватает простого решения для обработки CSS vars... я ошибаюсь ?
Конечно, я буду использовать решение javascript, если нет никакого способа. Но я хотел бы быть в этом уверен.
Заранее спасибо за любой ответ.

// This method doesn't work for writing CSS var.
$(":root").css("--color1", "red");
console.log(".css method on “:root”      :", $(":root").css("--color1"));

// This methods works for writing CSS var:
$(":root")[0].style.setProperty("--color2", "lime");
console.log("[0].style method on “:root” :", $(":root")[0].style.getPropertyValue('--color2'));
#p1 {
  background-color: var(--color1);
}

#p2 {
  background-color: var(--color2);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>

<body id="bodyID">
  <p id="p1">p with background --color1</p>
  <p id="p2">p with background --color2</p>
</body>

<html>

2 ответов


jQuery поддерживает только пользовательские свойства CSS в версия 3.2.0 и выше. Нет поддержки для них в 2.x или ранее, поэтому доступ к ним с .css() не будет работать в этих версиях. Если обновление jQuery не является опцией, вам нужно будет использовать встроенный style объект для доступа к ним.

$(":root").css("--color1", "red");
console.log(".css method on “:root”      :", $(":root").css("--color1"));

$(":root")[0].style.setProperty("--color2", "lime");
console.log("[0].style method on “:root” :", $(":root")[0].style.getPropertyValue('--color2'));
#p1 {
  background-color: var(--color1);
}

#p2 {
  background-color: var(--color2);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<p id="p1">p with background --color1</p>
<p id="p2">p with background --color2</p>

As BoltClock упоминает в своем ответе, jQuery добавлена поддержка переменных CSS, начиная с версии 3.2.0.

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

Итак, вот моя попытка реализовать простое расширение, которое проверяет, является ли изменяемое свойство пользовательским свойством или нет (проверив, что он начинается с двумя дефисами!--9-->). Если это так, пользовательское свойство изменяется с помощью простого JS, иначе оно вызывает исходную реализацию $.fn.css.

(function() {
  var originalFnCss = $.fn.css;
  $.fn.css = function(prop, val) {

    // Check if the property being set is a CSS Variable.
    if (prop.indexOf("--") === 0) {
      if(val) {

        // Set the value if it is provided.
        for(var idx = 0; idx < this.length; idx++) {
          this[idx].style.setProperty(prop, val);
        }
      } else {

        // Get the computed value of the property.
        return window.getComputedStyle(this[0]).getPropertyValue(prop);
      }
    } else {
      return originalFnCss.apply(this, arguments);
    }
  };
}()); 

Примечание: на данный момент я протестировал это расширение с помощью jQuery 1.11.1, 2.2.4 и 3.1.1, но дайте мне знать, если вы обнаружите какие-либо ошибки, или если у вас есть какие-либо предложения.


теперь вам просто нужно добавить расширение сразу после импорта jQuery, или в любой момент до $.fn.css вызывается. Вот рабочий фрагмент:

(function() {
  var originalFnCss = $.fn.css;
  $.fn.css = function(prop, val) {

    // Check if the property being set is a CSS Variable.
    if (prop.indexOf("--") === 0) {
      if(val) {

        // Set the value if it is provided.
        for(var idx = 0; idx < this.length; idx++) {
          this[idx].style.setProperty(prop, val);
        }
      } else {

        // Get the computed value of the property.
        return window.getComputedStyle(this[0]).getPropertyValue(prop);
      }
    } else {
      return originalFnCss.apply(this, arguments);
    }
  };
}()); 

// This method doesn't work for writing CSS var.
$(":root").css("--color1", "red");
console.log(".css method on “:root”      :", $(":root").css("--color1"));

// This methods works for writing CSS var:
$(":root")[0].style.setProperty("--color2", "lime");
console.log("[0].style method on “:root” :", $(":root")[0].style.getPropertyValue('--color2'));
#p1 {
  background-color: var(--color1);
}

#p2 {
  background-color: var(--color2);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>

<body id="bodyID">
  <p id="p1">p with background --color1</p>
  <p id="p2">p with background --color2</p>
</body>

<html>