Обратите внимание, что jQuery().css()
не меняет правила таблицы стилей, оно просто меняет стиль каждого соответствующего элемента.
Вместо этого вот функция javascript, которую я написал для изменения самих правил таблицы стилей.
/**
* Modify an existing stylesheet.
* - sheetId - the id of the <link> or <style> element that defines the stylesheet to be changed
* - selector - the id/class/element part of the rule. e.g. "div", ".sectionTitle", "#chapter2"
* - property - the CSS attribute to be changed. e.g. "border", "font-size"
* - value - the new value for the CSS attribute. e.g. "2px solid blue", "14px"
*/
function changeCSS(sheetId, selector, property, value){
var s = document.getElementById(sheetId).sheet;
var rules = s.cssRules || s.rules;
for(var i = rules.length - 1, found = false; i >= 0 && !found; i--){
var r = rules[i];
if(r.selectorText == selector){
r.style.setProperty(property, value);
found = true;
}
}
if(!found){
s.insertRule(selector + '{' + property + ':' + value + ';}', rules.length);
}
}
Преимущества:
- Стили могут быть вычислены в сценарии
<head>
до создания элементов DOM и, следовательно, до первого рендеринга документа, избегая визуально раздражающего рендеринга, затем вычисляя, а затем перерисовывая. В jQuery вам придется ждать, пока будут созданы элементы DOM, а затем изменить их стиль и выполнить повторную визуализацию.
- К элементам, которые добавляются динамически после рестайла, автоматически применяются новые стили без дополнительного вызова
jQuery(newElement).css()
Предостережения:
- Я использовал его в Chrome и IE10. Я думаю, что может потребоваться небольшая модификация, чтобы он хорошо работал на старых версиях IE. В частности, в более старых версиях IE не может быть определено
s.cssRules
, поэтому они вернутся к s.rules
, что имеет некоторые особенности, такие как странное / ошибочное поведение, связанное с селекторами, разделенными запятыми, например "body, p"
. Если вы избегаете этого, вы можете быть в порядке в старых версиях IE без изменений, но я еще не проверял это.
- В настоящее время селекторы должны точно совпадать: используйте строчные буквы и будьте осторожны со списками, разделенными запятыми; порядок должен совпадать, и они должны иметь формат
"first, second"
, т.е. разделитель - запятая, за которой следует пробел.
- Вероятно, можно было бы потратить на это дополнительное время, пытаясь обнаружить и разумно обработать перекрывающиеся селекторы, например, в списках, разделенных запятыми.
- Можно также добавить поддержку медиазапросов и модификатор
!important
без особых проблем.
Если вы хотите внести некоторые улучшения в эту функцию, вы найдете здесь несколько полезных документов по API:
https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet